關於模板測試幾個問題


1.模板測試的直接結果是什么?

  答:通過模板測試的像素會進入到下一步的深度測試,以期被繪制到color buffer上,沒有通過的話,直接丟掉它。

2.stencil buffer的值如何更新?

  答: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:記得開啟模板測試和模板緩沖區寫入。


免責聲明!

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



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