模板緩衝通常用來實現一些地面反射投影和相似鏡子的特殊效果,以下:html
默認狀況下,模板緩衝是關閉的,模板緩衝若是處於關閉狀態,運行模板相關的代碼不會報錯,可是不會出現預期的效果。git
使用下面的代碼能夠開啓模板緩衝:github
var gl = canvas.getContext("webgl", { stencil: true });
模板緩衝能夠肯定下次渲染時,指定的像素是否要進行剔除,能夠理解爲每一個像素只有 0(丟棄) 和 1(保留) 兩個數值。web
具體使用模板緩衝大致流程以下:canvas
經過使用模板緩衝,咱們能夠根據場景中已繪製的其它物體的片斷,來決定是否丟棄特定的片斷。less
當你啓用模板測試以後,全部的渲染調用都會以某種方式影響着模板緩衝。測試
1 // 清除模板緩衝,模板緩衝全部像素值都爲0。 2 gl.clear(gl.STENCIL_BUFFER_BIT); 3 // 開啓模板測試 4 gl.enable(gl.STENCIL_TEST); 5 // 關閉模板測試 6 gl.disable(gl.STENCIL_TEST);
glStencilMask容許咱們設置一個位掩碼(Bitmask),它會與將要寫入緩衝的模板值進行與(AND)運算;webgl
gl.stencilMask(0xFF); // 每一位寫入模板緩衝時都保持原樣 gl.stencilMask(0x00); // 每一位在寫入模板緩衝時都會變成0(禁用寫入)
https://developer.mozilla.org/zh-CN/docs/Web/API/WebGLRenderingContext/stencilFuncui
肯定後續的渲染,和當前模板緩衝中的像素模板值對比以後,是否丟棄掉渲染的結果。spa
glStencilFunc(GLenum func, GLint ref, GLuint mask)
func可選值以下:
GL_ALWAYS:不和模板緩衝中的值進行對比,全部渲染出的像素值都進行正常繪製;
GL_NEVER:不和模板緩衝中的值進行對比,全部渲染出的像素值都丟棄;
GL_LESS、GL_LEQUAL、GL_GREATER、GL_GEQUAL、GL_EQUAL、GL_NOTEQUAL:按照規則對比模板緩衝中的值和渲染出來的值進行釋放丟棄渲染結果的斷定。
ref 和 mask:
配合func參數使用,具體規則請看MDN。
https://developer.mozilla.org/zh-CN/docs/Web/API/WebGLRenderingContext/stencilOp
設定如何根據下一次渲染的結果來更新模板緩衝中的值。
glStencilOp(GLenum sfail, GLenum dpfail, GLenum dppass)
具體能夠傳遞的參數以下:
https://hammerc.github.io/dou3d-ts/learning/learningNotes/lesson_15/index.html
上下箭頭控制小方塊的移動。