1.模板測試的直接結果是什麼?函數
答:經過模板測試的像素會進入到下一步的深度測試,以期被繪製到color buffer上,沒有經過的話,直接丟掉它。測試
2.stencil buffer的值如何更新?ci
答:1.glClearStencil(指定值); 重置stencil buffer裏的值爲指定值。
2.glClear(GL_STENCIL_BUFFER_BIT); 重置stencil buffer裏的值爲0.
3.經過glStencilOp來指定測試(模板測試或深度測試)經過或未經過時,如何修改stencil buffer裏的值,有這些修改方式
:GL_KEEP GL_ZERO GL_REPLACE GL_INCR GL_DECR GL_INVERT。
注意有些修改方式的操做數只涉及stencil buffer裏的stencil值。而有些涉及到調用方法glStencilFunc時傳入的第2個參數:參考值。
ps: glStencilFunc(比較條件,參考值,比較用掩碼)。這個函數指定了模板測試如何進行。先使用一個【比較用掩碼】(comparison mask)與【模板緩衝區中的值】進按位與運算,再與【參考值】經過【比較條件】進行比較,知足了條件,就說經過了測試。(你能夠查閱glStencilOp的資料,來了解測試結果出來後的後續)。模板
3.glStencilMask有什麼做用?
答:(1)glStencilMask(0x00)能夠關閉stencil buffer的寫入,這樣就算開啓了模板測試(glEnable(GL_STENCIL_TEST),測試結果也不會影響stencil buffer裏已有的模板值。
(2)glStencilMask(0xff)開啓stencil buffer的寫入,這時候能夠往裏更新模板數據。
好比繪製某些物體時,來讓物體對應的屏幕像素對應的stencil buffer某些位置的模板值變爲1:
glStencilFunc(GL_ALWAYS,1,0xff);
glStencilOp(GL_KEEP,GL_KEEP,GL_REPLACE);
drawAThing();
ps:記得開啓模板測試和模板緩衝區寫入。方法