opengl編程學習筆記(三)(2D繪圖)
在opengl中可以繪製二維圖像,分為兩種,BITMAP和image
1.bitmap和image的區別有:
bitmap中對圖像的每個像素隻存儲一位(0或1),用來表示用當前顏色繪製還是不繪製,而image是圖像的每個像素存儲可能很多位,存儲它的各個通道的顏色信息;
bitmap是繪製在三位空間中的一群點,其中每個點都受各變換矩陣的影響,等同於一群Gl_begin(GL_POINTS)操作聯合在一起 ,而image是直接繪製在幀緩存上,在繪製原點所投影到的屏幕坐標處開始繪製,就是直接在二維屏幕上繪製,就像普通的二維繪製一樣,他隻有那個繪製的原點受變換矩陣的影響,比如當原點的位置被裁剪掉之後,整張圖片也將消失。
bitmap是繪製在三位場景的一些點,也就是每個點都會有法向等信息,回收光照等影響,拉近看還會發現點間的距離,image是直接寫入幀緩存的,繪製的顏色就是最終看到的顏色, 像素點間不會有距離
2.bitmap的繪製步驟
glColor3f製定當前繪製的點的顏色
glRasterPos2f定義當前的繪製原點(OPENGL繪製的原點是在左下角的,即定義之後,都是從這點開始按照從左至右,從下至上繪製的)
隻有當調用了 glRasterPos2f之後,他前麵的glColor3f才會起作用,所以要先設置顏色,再定義原點
void glBitmap( GLsizei width, 繪製寬度的點數
GLsizei height, 繪製高度 的點數
GLfloat xorig, 在以原點的二維坐標係中的X坐標
GLfloat yorig, 在以原點的二維坐標係中的Y坐標
GLfloat xmove,繪製後原點的橫向位移
GLfloat ymove,繪製後原點的縱向位移
const GLubyte * bitmap 存儲的數據);
繪製存儲在內存中的數據
其中bitmap中存儲的數據按照從左下角起8位對其(一個GLUBYTE),例如下圖的數據就應該因該存儲為
0xc0, 0x00, 0xc0, 0x00, 0xc0,0x00, 0xc0, 0x00, 0xc0, 0x00,0xff, 0x00, 0xff, 0x00, 0xc0, 0x00, 0xc0, 0x00, 0xc0, 0x00,0xff, 0xc0, 0xff, 0xc0。如果width不是八的倍數,比如是30個點,那麼這一行仍然要占8的倍數位,應占用4個字節,最後麵的兩位將被自動舍棄。
bitmap更適合繪製顏色較單一,且需要能進行三維觀察的圖
他也可以繪製彩色圖,隻是要每個點繪製前改變當前繪製顏色,如圖
2.image的繪製步驟
2.1glPixelStorei()設置數據的存儲和解讀方式,這裏可以進行的常用設置有
GL_PACK_SWAP_BYTES改變一個像素各個成分(不是顏色通道的順序)的順序,比如原先的存儲順序為(顏色、深度、索引),顛倒後為(索引、深度、顏色),而一個顏色的通常都存儲為RGB。這個設置通常不用改變
剪裁圖像:比如我們隻要繪製在內存中圖像數據中的一個矩形區域,原圖為640*480,我們需要繪製從(10,10) 開始長100,寬100的區域到屏幕。我們需要先用glPixelStorei(GL_UNPACK_ROW_LENGTH,640)設置圖像的原寬為640,再用glPixelStorei(GL_UNPACK_SKIP_ROWS,10)設置我們跳過了10行,然後用glPixelStorei(GL_UNPACK_SKIP_PIXELS,10)設置我們又把起點跳過了10個像素(列),最後調用glDrawPixels(100,100...)來繪圖。
2.2glPixelTransferf設置像素的傳遞和映射,用這個操作,可以在存儲或讀取時將特定的顏色映射到一種顏色,或者將特定顏色的值擴大縮小等
2.3glPixelZoom(x,y)設置幾何變換,這將設置最後圖像的一個像素在X/Y方向上被放大的倍數,都是2則放大四倍,如果為負數在讀取時進行鏡像
2.4調用glDrawPixels繪製存儲在內存中的圖像到幀緩存上
或調用glReadPixels讀取幀緩存上的數據到內存中(可以做截圖用)
或調用glCopyPixels拷貝幀緩存的一處數據到幀緩存的另一處(覺得很適合做賽車遊戲的後視鏡 ^^)
最後更新:2017-04-02 00:06:44