OpenGL模板緩衝區與模板測試

2021-09-30 21:29:38 字數 3711 閱讀 8328

幀緩衝區有許多緩衝區構成,這些緩衝區大致分為:

顏色緩衝區:用於繪圖的緩衝區,它包含了顏色索引或者rgba顏色資料。

深度緩衝區:儲存每個畫素的深度值,當啟動深度

測試時,片段畫素深度值和深度緩衝區深度值進行比較,決定片段哪些畫素點資料可以替換到顏色緩衝區中。

模板緩衝區:就像使用紙板和噴漆一樣精確的混圖一樣,當啟動

模板測試時,通過模板測試的片段畫素點會被替換到顏色緩衝區中,從而顯示出來,未通過的則不會儲存到顏色緩衝區中,從而達到了過濾的功能。

累積緩衝區:累積緩衝區允許你把渲染到顏色緩衝區的值,拷貝到累積緩衝區。在多次拷貝操作到累積緩衝區時,可以用不同方式的把顏色緩衝區內容和當前累積緩衝區的內容進行重複混合

模板測試

模板測試只有存在模板緩衝區的情況下進行,模板測試把畫素儲存在模板緩衝區的點與乙個參考值進行比較(glstencilfunc),根據測試結果,對模板緩衝區的值進行響應的修改glstencilop

void glstencilfunc (glenum func, glint ref, gluint mask);

func:gl_never 從來不能通過

gl_always 永遠可以通過(預設值)

gl_less 小於參考值可以通過

gl_lequal 小於或者等於可以通過

gl_equal 等於通過

gl_gequal 大於等於通過

gl_greater 大於通過

gl_notequal 不等於通過

ref: 參考值

mask:掩碼,書上說模板測試只在哪些對應為1的位上進行。(不是很確定具體作用)

舉例:glstencilfunc (gl_less, 1.0, 1.0);模板緩衝區對應的畫素點的值如果小於1.0,則通過模板測試

void glstencilop (glenum fail, glenum zfail, glenum zpass);

fail模板測試未通過時該如何變化;zfail表示模板測試通過,但深度測試未通過時該如何變化;zpass表示模板測試和深度測試或者未執行深度測試均通過時該如何變化

gl_keep(不改變,這也是預設值)

gl_zero(回零)

gl_replace(使用測試條件中的設定值來代替當前模板值)

gl_incr(增加1,但如果已經是最大值,則保持不變),

gl_incr_wrap(增加1,但如果已經是最大值,則從零重新開始)

gl_decr(減少1,但如果已經是零,則保持不變),

gl_decr_wrap(減少1,但如果已經是零,則重新設定為最大值)

gl_invert(按位取反)

未啟用模板緩衝區

glclear(gl_color_buffer_bit|gl_depth_buffer_bit);

glloadidentity();

gltranslatef(0, 0, -20);

glcolor3f(1.0f,1.0f,1.0f);

dradius = 5.0*(sqrt(2.0)/2.0);

glbegin(gl_line_strip);

for (dangel=0;dangel<380.0;dangel+=0.1)

glend();

glcolor3f(1.0f,0.0f,0.0f);

glrectf(-5,-5,5,5);

初始清除背景填充顏色為藍色

以上這部分**可以用如下3張圖表示繪製的過程

開啟模板緩衝區

void init()

glclear(gl_color_buffer_bit|gl_depth_buffer_bit|gl_stencil_buffer_bit);//1

glloadidentity();

gltranslatef(0, 0, -20);

glstencilfunc(gl_never,0x0,0xff);  //2

glstencilop(gl_incr,gl_incr,gl_incr);//3

glcolor3f(1.0f,1.0f,1.0f);

dradius = 5.0*(sqrt(2.0)/2.0);

glbegin(gl_line_strip);

for (dangel=0;dangel<380.0;dangel+=0.1)

glend();

glstencilfunc(gl_notequal,0x1,0xff);  //4

glstencilop(gl_keep,gl_keep,keep); //5

glcolor3f(1.0f,0.0f,0.0f);

glrectf(-5,-5,5,5);

當執行到1處,3個緩衝區都被清空

顏色緩衝區:每個畫素點顏色都是藍色

深度緩衝區:每個畫素點深度都是1.0

模板緩衝區:每個畫素點模板值都是0

執行到2,3處,模板測試條件是從不通過測試,如果不通過測試結果是模板值+1

接著應用模板測試進行繪製一組點,由於模板測試條件是從不通過測試,所以顏色緩衝器值不會變化,但是繪製的點對應的畫素點的模板值變為1,此時

顏色緩衝區:每個畫素點顏色都是藍色

深度緩衝區:每個畫素點深度都是1.0

模板緩衝區:點陣列對應的模板值是1,其他區域畫素點的模板值還是0

執行到4,5處,模板測試條件是模板值不一定1則通過測試,如果不通過測試結果是模板值+1

接著應用剛才的模板測試進行繪製乙個(-5,-5,5,5)的矩形,在這個矩形區域內,畫素點的模板值分為2中,值為1的是上1步的點陣列。值為0的是上一步非的點陣列畫素點。那個根據模板測試條件,模板值為0的畫素點通過測試,可以進行替換顏色緩衝區的值(替換成紅色),模板值為0的畫素點不能通過測試,因此不能改變顏色緩衝區的值

顏色緩衝區:(-5,-5,5,5)區域內 模板值為0的畫素點為紅色,其他區域都為藍色

深度緩衝區:每個畫素點深度都是1.0

模板緩衝區:點陣列對應的模板值是1,其他區域畫素點的模板值還是0

模板查詢

可以用glgetinteger函式獲取與模板相關的引數值

opengl模板緩衝區

相信大家有些人對opengl的模板緩衝區不是很理解,包括我最開始也是,opengl的模板緩衝區其實就是採用過濾的技術來控制那些顏色可以繪製,那些不能進行繪製。這裡的過濾技術也就是我們的乙個控制方法,主要體現在如下兩個函式glstencilfunc glenum func,glint ref,glui...

OpenGL模板緩衝區與模板測試

幀緩衝區有許多緩衝區構成,這些緩衝區大致分為 顏色緩衝區 用於繪圖的緩衝區,它包含了顏色索引或者rgba顏色資料。深度緩衝區 儲存每個畫素的深度值,當啟動深度 測試時,片段畫素深度值和深度緩衝區深度值進行比較,決定片段哪些畫素點資料可以替換到顏色緩衝區中。模板緩衝區 就像使用紙板和噴漆一樣精確的混圖...

OpenGL學習二十九 模板緩衝區與模板測試

幀緩衝區有許多緩衝區構成,這些緩衝區大致分為 顏色緩衝區 用於繪圖的緩衝區,它包含了顏色索引或者rgba顏色資料。深度緩衝區 儲存每個畫素的深度值,當啟動深度測試時,片段畫素深度值和深度緩衝區深度值進行比較,決定片段哪些畫素點資料可以替換到顏色緩衝區中。模板緩衝區 就像使用紙板和噴漆一樣精確的混圖一...