1. 程式人生 > >我的opengl程式設計學習(二)(混合、深度測試、霧化、多邊形平移、顯示列表)

我的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 operationsRaster bitmaps and imagesLights, material properties, and lighting modelsTexturesPolygon 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時不繪製。