閱讀602 返回首頁    go 阿裏雲 go 技術社區[雲棲]


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

  上一篇:go opengl的一些小問題
  下一篇:go 廣州技術交流腐敗會之IBM技術沙龍開源技術 & WebSphere & Tivoli