1. 程式人生 > >OpenGL學習筆記——StencilBuffer

OpenGL學習筆記——StencilBuffer

StencilBuffer是模板緩衝,可以用來實現一些諸如描邊,遮罩之類的操作。
一開始我理解起來很費勁,後來結合幾個例子,終於明白了使用StencilBuffer的要點。


使用StencilBuffer,分為兩大部分:
【1】建立stencil Buffer 部分
(1.1)建立Stencil,用其他模型,遮罩等的片段,去建立stencil buffer。(遮罩也完全可以不被顯示出來,只更新模板)
(1.2)開啟stencilbuffer的寫入 glStencilMask(0xFF) ,用某些模型,或遮罩圖片,寫入緩衝。
【2】使用Stencil Buffer 部分:利用建立好的Stencil去和需要被遮罩處理的片段比較,去決定目標片段是否被保留。


————舉個栗子————————————————


比如描邊的例子:
【1】建立緩衝的部分:
開啟stencilbuffer的寫入和深度測試,以正常的繪製模型和寫入模板。
寫入原始模型的片段(繪圖),同時寫入stencilbuffer(建立Mask)
【2】使用緩衝的部分
關閉stencilbuffer寫入,防止模板為汙染
關閉Z-test,將描邊畫在最上面。
將原始模型放大一點,改用單色shader(描邊色)
當模板值不是1的時候,寫入單色(中間有原模型的部位,不會被寫入。沒有原模型的部位,被寫入。)
注意整體繪製順序,因為關閉ZBuffer之後,後畫的一定會覆蓋先畫的。


glStencilMask 開啟關閉模板寫入
(*)直白的說
glStencilMask(0xFF) 使得模板可以寫入
glStencilMask(0x00)使得 模板完全不可寫入。注意:他不是關閉模板,而是不讓模板被寫入,關閉模板的話連判斷都沒了。


glStencilFunc 決定片段去留
(**)glStencilFunc(GLenum func, GLint ref, GLuint mask) 直白的說他決定一個片段的去留——是否會顯示在螢幕上。通過測試則顯示,否則不顯示。


glStencilOp 決定片段如何改變模板
(***)判斷達成某些條件的片段,要如何更新模板。glStencilOp(GLenum sfail, GLenum dpfail, GLenum dppass) 這個是目標的判斷滿足哪種條件,進行哪種操作的設定函式。
引數[1]未通過模板和深度測試
引數[2]通過模板,但是未通過深度測試引數 
引數[3]二者都通過了。
直白的說這個函式決定一個片段,是否並如何改變一個模板上的值。