【发布时间】:2014-09-01 11:18:57
【问题描述】:
我一直在研究一种创建类似于this one(在 SVG 中完成)的剪贴蒙版的方法。
根据我的发现,我选择通过模板来实现这一目标。然而,我的实现是非常不正确的。我不完全确定gl.stencilOp 和gl.stencilFunc 是如何工作的,因为我似乎需要渲染片段来掩盖我的主要内容两次。一次是在我渲染主要内容之前,一次是在使用不同的参数之后。
此测试的相关 sn-p / 部分可以在 ../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 示例一样工作的指导。
【问题讨论】:
标签: javascript webgl mask clip stencil-buffer