OpenGL(十四) 模板測試

2021-07-24 17:02:47 字數 1460 閱讀 7542

啟用模板測試時,opengl會在記憶體中開闢一塊空間作為模板緩衝區,裡邊儲存了每個畫素的「模板值」,模板測試的過程就是把每乙個畫素的模板值與乙個設定的模板參考值進行比較,符合設定條件的通過測試,不符合條件的則不會繪製。

glclearstencil函式用來指定模板值復位後的初始值,跟使用glclearcolor函式指定復位後畫板的顏色一樣。

glstencilfunc函式用來設定模板測試條件。第乙個是模板測試條件,第二個是指定的當前模板的測試值,程式會使用改值與參考模板值進行比較,第三個是mask位,設定後,只會比較mask中二進位制位位1的位。

glstencilop (glenum fail, glenum zfail, glenum zpass)用來設定模板值根據模板測試結果和深度測試結果的結果如何變化。

第乙個引數表示模板測試未通過時該如何變化,第二個引數表示模板測試通過,但深度測試未通過時該如何變化,第三個引數表示模板測試和深度測試均通過時該如何變化。這種模板的變換可以是:

另外程式中用到了glpushmatrix和glpopmatrix兩個函式,glpushmatrix函式將當前矩陣壓入堆疊,使得之後的操作不受之前矩陣變換的影響,都是相對於原始的世界座標系進行操作。

glpopmatrix將與之最近的乙個glpushmatrix壓入堆疊的矩陣取出,使得之前的矩陣變換對其後的運算有效。這兩個函式的配合使用可以使得兩者之間的矩陣操作不受之前生成的變換矩陣的影響,並且兩者之間的矩陣操作也不會對主體的矩陣變換產生影響。

以下是使用模板測試功能,實現平面鏡功能,鏡子之外的物體不會繪製:

#define windowwidth   400

#define windowheight 400

#define windowtitle "opengl模板測試"

#include glfloat angle = 0.0f;

void draw_sphere()

, ambient = ;

gllightfv(gl_light0, gl_position, pos);

gllightfv(gl_light0, gl_ambient, ambient);

} // 繪製乙個球體

glpushmatrix();

gltranslatef(0, 0, 2);

glutsolidsphere(0.8, 20, 20);

glpopmatrix();

}void display(void)

void myidle(void)

int main(int argc, char* argv)

執行截圖:

OpenGL 模板測試

1,模板實現裁剪例項 include gltools.h include else define freeglut static include endif define yellowmat 1 define bluemat 2 void init void glfloat yellow specu...

OpenGL模板測試通俗理解

看書籍或資料往往還是雲裡霧裡的,這裡寫一下自己的理解。希望對需要的人有幫助。簡而言之 模板緩衝區和幀緩衝區一樣大 模板緩衝區初始狀態是什麼?在glclearbuffer的時候清空,所以初始狀態是全為0。模板測試什麼時候進行?每一次你呼叫繪製函式的時候都會進行模板測試。一次繪製後,畫素著色器會輸出畫素...

OpenGL(14) 模板測試

啟用模板測試時,opengl會在記憶體中開闢一塊空間作為模板緩衝區,裡邊儲存了每個畫素的 模板值 模板測試的過程就是把每乙個畫素的模板值與乙個設定的模板參考值進行比較,符合設定條件的通過測試,不符合條件的則不會繪製。glclearstencil函式用來指定模板值復位後的初始值,跟使用glclearc...