下面來設置蒙板緩存和蒙板測試。
首先我們啟用蒙板測試,這樣就可以修改蒙板緩存中的值。
下面我們來解釋蒙板測試函數的含義:
當你使用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(); // 繪制地面