我一直在研究一种创建与此类似的剪贴蒙版的方法(在 SVG 中完成)。
根据我的发现,我选择通过模板来实现这一目标。然而,我的实现是非常不正确的。我不完全确定如何工作gl.stencilOp
,gl.stencilFunc
因为似乎我需要渲染片段来掩盖我的主要内容两次。一次在我渲染主要内容之前,一次在使用不同的参数之后。
此测试的相关片段/部分可以在以下位置../src/renderers/webgl.js
找到L67
:
if (this._mask) {
gl.enable(gl.STENCIL_TEST);
gl.stencilFunc(gl.ALWAYS, 1, 1);
gl.colorMask(false, false, false, true);
gl.stencilOp(gl.KEEP, gl.KEEP, gl.INCR);
// Renders the mask through gl.drawArrays L111
webgl[this._mask._renderer.type].render.call(
this._mask, gl, program, this);
gl.colorMask(true, true, true, true);
gl.stencilFunc(gl.NOTEQUAL, 0, 1);
gl.stencilOp(gl.KEEP, gl.KEEP, gl.KEEP);
}
// Renders main content through a series of gl.drawArrays calls
_.each(this.children, webgl.group.renderChild, {
gl: gl,
program: program
});
if (this._mask) {
gl.colorMask(false, false, false, false);
gl.stencilOp(gl.KEEP, gl.KEEP, gl.DECR);
// Re-render mask so main content doesn't flicker
webgl[this._mask._renderer.type].render.call(
this._mask, gl, program, this);
gl.colorMask(true, true, true, true);
gl.stencilFunc(gl.NOTEQUAL, 0, 1);
gl.stencilOp(gl.KEEP, gl.KEEP, gl.KEEP);
gl.disable(gl.STENCIL_TEST);
}
模拟 webgl 模板以像 svg 示例一样工作的指导将不胜感激。