opengl 模板測試 glStencilOp glStencilFunc


下面來設置蒙板緩存和蒙板測試。
首先我們啟用蒙板測試,這樣就可以修改蒙板緩存中的值。

下面我們來解釋蒙板測試函數的含義:
當你使用glEnable(GL_STENCIL_TEST)啟用蒙板測試之后,蒙板函數用於確定一個顏色片段是應該丟棄還是保留(被繪制)。蒙板緩存區 中的值與參考值ref進行比較,比較標准是func所指定的比較函數。參考值和蒙板緩存區的值都可以與掩碼進行為AND操作。蒙板測試的結果還導致蒙板緩 存區根據glStencilOp函數所指定的行為進行修改。
func的參數值如下:

常量 含義
GL_NEVER 從不通過蒙板測試
GL_ALWAYS 總是通過蒙板測試
GL_LESS 只有參考值<(蒙板緩存區的值&mask)時才通過
GL_LEQUAL 只有參考值<=(蒙板緩存區的值&mask)時才通過
GL_EQUAL 只有參考值=(蒙板緩存區的值&mask)時才通過
GL_GEQUAL 只有參考值>=(蒙板緩存區的值&mask)時才通過
GL_GREATER 只有參考值>(蒙板緩存區的值&mask)時才通過
GL_NOTEQUAL 只有參考值!=(蒙板緩存區的值&mask)時才通過

接下來我們解釋glStencilOp函數,它用來根據比較結果修改蒙板緩存區中的值,它的函數原形為:
void glStencilOp(GLenum sfail, GLenum zfail, GLenum zpass),各個參數的含義如下:
sfail
當蒙板測試失敗時所執行的操作

zfail
當蒙板測試通過,深度測試失敗時所執行的操作

zpass
當蒙板測試通過,深度測試通過時所執行的操作

具體的操作包括以下幾種

常量 描述
GL_KEEP 保持當前的蒙板緩存區值
GL_ZERO 把當前的蒙板緩存區值設為0
GL_REPLACE 用glStencilFunc函數所指定的參考值替換蒙板參數值
GL_INCR 增加當前的蒙板緩存區值,但限制在允許的范圍內
GL_DECR 減少當前的蒙板緩存區值,但限制在允許的范圍內
GL_INVERT 將當前的蒙板緩存區值進行逐位的翻轉

當完成了以上操作后我們繪制一個地面,當然現在你什么也看不到,它只是把覆蓋地面的蒙板緩存區中的相應位置設為1。

 

	glEnable(GL_STENCIL_TEST);				// 啟用蒙板緩存

	glStencilFunc(GL_ALWAYS, 1, 1);			// 設置蒙板測試總是通過,參考值設為1,掩碼值也設為1

	glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE);		// 設置當深度測試不通過時,保留蒙板中的值不變。如果通過則使用參考值替換蒙板值

	glDisable(GL_DEPTH_TEST);				// 禁用深度測試

	DrawFloor();					// 繪制地面


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM