stencilbuffer是模板緩衝,可以用來實現一些諸如描邊,遮罩之類的操作。
一開始我理解起來很費勁,後來結合幾個例子,終於明白了使用stencilbuffer的要點。
使用stencilbuffer,分為兩大部分:
建立stencil buffer 部分
(1.1)建立stencil,用其他模型,遮罩等的片段,去建立stencil buffer。(遮罩也完全可以不被顯示出來,只更新模板)
(1.2)開啟stencilbuffer的寫入 glstencilmask(0xff) ,用某些模型,或遮罩,寫入緩衝。
使用stencil buffer 部分:利用建立好的stencil去和需要被遮罩處理的片段比較,去決定目標片段是否被保留。
————舉個栗子————————————————
比如描邊的例子:
建立緩衝的部分:
開啟stencilbuffer的寫入和深度測試,以正常的繪製模型和寫入模板。
寫入原始模型的片段(繪圖),同時寫入stencilbuffer(建立mask)
使用緩衝的部分
關閉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 ***ass) 這個是目標的判斷滿足哪種條件,進行哪種操作的設定函式。
引數[1]未通過模板和深度測試
引數[2]通過模板,但是未通過深度測試引數
引數[3]二者都通過了。
直白的說這個函式決定乙個片段,是否並如何改變乙個模板上的值。
OpenGL學習筆記
我是一名ios開發者,opengl是乙個比較重要的技術。所以就此開啟我的菜鳥之路。opengl open graphics library 是乙個跨程式設計語 言 跨平台的程式設計圖形程式接 它將計算機的資源抽象稱為乙個個opengl的物件,對這些資源的操作抽象為乙個的opengl指令.direct...
OpenGL學習筆記
數學基礎 叉積mv矩陣 文章內容主要來自 計算機圖形學程式設計 使用opengl和c 光柵化過程確定了用以顯示3個頂點所確定的三角形的所有畫素需要繪製的位置 光柵化過程開始時先對三角形的每對頂點進行插值 如果光柵化過程到此為止,那麼呈現出的影象將會是線框模型 使用 glpolygonmode gl ...
OpenGL學習筆記
因工作需要,這些天要研究opengl。我給自己定的目標是 1.節前能熟悉opengl基礎知識 2.確定一款以opengl為基礎的gui 3.學習如何使用該gui的控制項繪製3d選單 今天找到幾個 嵌入式系統使用的是opengl es,是桌面opengl的乙個子集,定義了一系列靈活高效的圖形加速介面。...