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


我的opengl編程學習(二)(混合、深度測試、霧化、多邊形平移、顯示列表)

12 混合

混合的底層原理是:如果不開啟混合,那麼對於幀緩存中的同樣一個片斷,後來的顏色將會覆寫原有的顏色,而開啟混合,則會在後來的顏色到來時利用混合因子重新計算該顏色而不是簡單的覆寫。其中後來的顏色叫做源顏色,而緩存中原來存在的顏色叫做目的顏色。

glEnable(GL_BLEND)打開混合開關,這樣ALPHA值就可能會起作用了(如果你使用這個作為因子的話)

glBlendFunc()來產生源顏色和目的顏色的混合因子,有各種產生方法,最後總的混合顏色=源顏色×源顏色的混合因子+目的顏色×目的顏色的混合因子

下麵是幾個我左的各種混合參數的例子

0 1混合,就是隻保留第一個framebuffer上麵的東西,後麵的繪製都看不見了

1 0混合

用後來的幀緩存替換前麵的幀緩存,隻有後麵幀的信息

將目的和源的AILPHA都設為常量0.5的混合

src 1-src混合

後麵的幀的混合係數采用後麵幀的顏色值

其實就是顏色越淺的地方透明度越高,好像更加虛幻

13深度測試

在設計到消隱到情況(可能發遮擋),都要開啟深度測試

Glenable(depth_test),硬件上就是打開了深度緩存區,當有新的同樣XY坐標的片斷到來時,比較兩者的深度,並且在初始化時打開深度,並且繪製每一幀前要gl_clear(gl-depth-bit)(這根clear_buffer_bit類似,而且同樣要設置clear_deppth_bitd 值,用glClearDepth(GLclampd depth),一般設為1,這將背景設為最深,這是默認的,通常不用寫)

14

首先glEnable(GL_FOG)

然後用glFog*()設置霧的衰減因子的計算模型和強度和顏色還有霧的範圍(還可以用glHint()來設置霧的質量

最要嘔注意霧的繪製要再繪製被霧影響的物體之前

15多邊形平移

OPENGL中有時為了繪製一個又高亮的輪廓的多邊形,或者有時為了做貼花效果,就要將一個多邊形和另一個線框疊加,這樣有時會產生疊加部分顏色的衝突或不穩定,為了解決這個問題,可以采用多邊形平移,它可以將其中一個的深度信息做一個合理的平移,使前後區分,步驟是:

首先用glEnable(GL_POLYGON_OFFSET_xx)打開平移開關;

然後glPolygonOffset(factor, units)產生平移的距離,平移距離等於m * factor + r * units,這裏M是一個多邊形本身深度變化的最大值,通常可以都設為1

16顯示列表

1.產生一個列表:用n=glGenLists (×)產生一個獨一無二的LIST標識號,然後用glNewList(theTorus, GL_COMPILE);

這裏麵的第二個參數可以是GL_COMPILE和GL_COMPILE_AND_EXCUTE,二者的區別是前者在產生列表時不執行繪製,隻在calllist的時候繪製,而後者是在產生列表時就立即繪製,一般采用 GL_COMPILE會提高渲染性能

繪製代碼;

glEndList();產生列表

使用列表,用glCallList(n)繪製那個列表的內容

2列表中可以存放的內容:

Matrix operations    Raster bitmaps and images  Lights, material properties, and lighting models  Textures   Polygon stipple patterns

使用列表而不是做成函數的好處是,使用函數要每次進行很多矩陣運算,而列表中實際隻是存放這些運算的結果,值進行了一次運算,每次調用結果

-3 glIsList,判斷一個數是否被作為列表標識符

  glDeleteLists,刪除一個標識符範圍的列表

-4 繪製多個列表:

glListBase(base);//定義當前在繪製多個列表時的基礎標識號的值

glCallLists(len, GL_BYTE, s);//繪製LEN個列表,並且S為列表的偏移量的指針,繪製的列表的號=BASES裏的偏移

17

glPushAttrib()glPopAttrib()用來存儲一組狀態值,如顏色、各種狀態的開關等

18 Pixels, Bitmaps, Fonts, and Images

1 OPENGL中所指的BITMAP實質就是二值圖像(不局限於黑白),每個像素隻有一位,當為1時,將繪製當前設定當顏色,為0時不繪製。

最後更新:2017-04-02 00:06:43

  上一篇:go 服務器的問題
  下一篇:go 數據庫範式:掀起你的蓋頭來(2)