OpenGL學習筆記 StencilBuffer

2021-08-09 11:41:17 字數 1273 閱讀 2198

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的乙個子集,定義了一系列靈活高效的圖形加速介面。...