OpenGL學習筆記 測試

2021-05-26 22:19:55 字數 2216 閱讀 1968

測試:

opengl裡面有各種測試,只有通過測試的畫素才會被繪製,否則根本不會被畫出來。

opengl測試的順序是:剪裁測試、alpha測試、模板測試、深度測試。如果某項測試不通過,則不會進行下一步

比如深度測試,當乙個畫素被繪製,該畫素的深度被記錄在深度緩衝區。當新的畫素即將覆蓋舊的畫素時,深度測試會檢查新的深度比舊的深度如何,如果小,覆蓋成功。如果大,測試失敗,繪製取消。

opengl有:

深度測試

alpha測試

剪裁測試

模板測試

剪裁測試(scissor):

剪裁測試是限制繪製區域。指定乙個剪裁矩形,則只有該矩形中的畫素才會被繪製。這就是剪裁測試。

啟動測試:

glenable(gl_scissor_test);

設定剪裁矩形:

glscissor();

注意,opengl視窗座標是以左下角為(0, 0),右上角為(width, height)的,這與windows系統視窗有所不同。

剪裁測試和視口變換的區別:視口變換是把所有的內容經過縮放,都裝在乙個視口矩形裡面,所有內容都在。剪裁測試沒有縮放,只簡單的顯示剪裁矩形內的內容,矩形外的內容會被丟掉。

alpha測試:

alpha值除了用於混合,還能用於alpha測試。所謂alpha測試,是指alpha值滿足於特定值的畫素才能被繪製,否則no。條件一般是:

始終通過/始終不通過

大於則通過/小於則通過

等於/不等於/大等於/小等於

啟動alpha測試:

glenable(gl_alpha_test);

設定測試條件:

glalphafunc

alpha與混合的關係。alpha測試的效果,基本都能用混合搞定,但alpha效率高:

1. alpha演算法簡單,比較就可以,混合要實現乘法

2. alpha測試減少後續步驟,opengl中,如果通不過alpha測試,則後面的模板測試和深度測試就不進行了。節約了計算時間。但混合本身不屬於測試,所有畫素都會經過所有測試。

因此,所有的畫素都是「透明」或「不透明」,沒有「半透明」時,應該盡量採用alpha測試而不是採用混合操作。當需要繪製半透明畫素時,才採用混合操作。

模板測試(stencil):

模板測試需要專門的緩衝區(模板緩衝區),深度測試也需要深度緩衝區,但是剪裁測試和alpha測試不需要。這些緩衝區都是在初始化opengl時指定。

模板測試的方式類似於alpha測試,每個畫素都有乙個模板值,儲存在模板緩衝區中,測試時,將設定的模板值與每個畫素在緩衝區中的模板值比較,滿足條件的畫素則通過測試。

glenable(gl_stencil_test)

glstencilfunc(, , mask).

mask引數提一下,相當於與運算中,即如果進行比較,則只比較畫素的模板值中,相對於mask中為1的位。例如,某個畫素模板值為5(二進位制101),而mask的二進位制值為00000011,因為只比較最後兩位,5的最後兩位為01

設定模板值的方法:

復位模板值:glclear(gl_stencil_buffer_bit);

設定模板值的方式比較巧妙,是通過glstencilop+glstencilfunc來設定的,怎麼樣進行呢,一切都是基於實際應用的,設想乙個場景,有兩張圖,a圖和b圖,a圖作為模板,b圖受限制於該模板。做法如下:

1. 先繪製a圖,設定glstencilop函式,讓a圖總能通過模板測試,然後設定gkstencilfunc函式,讓a圖通過模板測試時,把模板值寫入模板緩衝區。至此,模板緩衝區設定完成,就是a圖

2.  繪製b圖,注意,b跟a是有關係的,b要在a的基礎上畫,有點類似於與ps中的圖層,只是這個圖層是起過濾作用。現在b圖的時候,模板緩衝區有內容了,則b圖每個畫素點,都會在模板緩衝區中去查詢對應位置的模板值(即找對應的a圖的畫素點的模板值),如果通過測試,則繪畫,不然丟棄。其實模板緩衝區中的模板值,是a影象素的值,並不是b圖的,但是b圖是基於a畫的,也就是生在a之上,可以理解為模板緩衝區的的值,也是b圖的

深度測試

glenable(gl_depth_test);

gldepthfunc

深度測試,模板測試,和alpha測試的方式都是一樣的,比較也有八種情況:始終通過、始終不通過、大於則通過、小於則通過、大於等於則通過、小於等於則通過、等於則通過、不等於則通過。

OpenGL學習筆記

我是一名ios開發者,opengl是乙個比較重要的技術。所以就此開啟我的菜鳥之路。opengl open graphics library 是乙個跨程式設計語 言 跨平台的程式設計圖形程式接 它將計算機的資源抽象稱為乙個個opengl的物件,對這些資源的操作抽象為乙個的opengl指令.direct...

OpenGL學習筆記

數學基礎 叉積mv矩陣 文章內容主要來自 計算機圖形學程式設計 使用opengl和c 光柵化過程確定了用以顯示3個頂點所確定的三角形的所有畫素需要繪製的位置 光柵化過程開始時先對三角形的每對頂點進行插值 如果光柵化過程到此為止,那麼呈現出的影象將會是線框模型 使用 glpolygonmode gl ...

OpenGL學習筆記

因工作需要,這些天要研究opengl。我給自己定的目標是 1.節前能熟悉opengl基礎知識 2.確定一款以opengl為基礎的gui 3.學習如何使用該gui的控制項繪製3d選單 今天找到幾個 嵌入式系統使用的是opengl es,是桌面opengl的乙個子集,定義了一系列靈活高效的圖形加速介面。...