在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拷貝幀緩衝的一處資料到幀緩衝的另一處(覺得很適合做賽車遊戲的後視鏡 ^^)