我一直在研究一种创建类似于this one的剪贴蒙版的方法(在SVG中完成)。
根据我的发现,我选择通过模板来实现。但是,我的实现严重不正确。我不完全确定gl.stencilOp
和gl.stencilFunc
的工作方式,因为似乎我需要渲染两次掩盖我的主要内容的片段。一次,我渲染主要内容,一次,之后渲染参数。
这是工作测试:https://dl.dropboxusercontent.com/u/1595444/experiments/two.js/issues/issue-56/stencil-buffer/test/clip.html
可以从../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示例一样工作的指导将不胜感激。
最佳答案
您需要做的是:
绘制您的模具区域(在您的情况下为蓝色矩形),
停止拉入模具
绘制您要考虑模具的场景
停止模具
如下:
if (this._mask) {
// Clearing the stencil buffer
gl.clearStencil(0);
gl.clear(gl.STENCIL_BUFFER_BIT);
// Replacing the values at the stencil buffer to 1 on every pixel we draw
gl.stencilFunc(gl.ALWAYS, 1, 1);
gl.stencilOp(gl.REPLACE, gl.REPLACE, gl.REPLACE);
// disable color (u can also disable here the depth buffers)
gl.colorMask(false, false, false, false);
gl.enable(gl.STENCIL_TEST);
// Renders the mask through gl.drawArrays L111
webgl[this._mask._renderer.type].render.call(this._mask, gl, program, this);
// Telling the stencil now to draw/keep only pixels that equals 1 - which we set earlier
gl.stencilFunc(gl.EQUAL, 1, 1);
gl.stencilOp(gl.KEEP, gl.KEEP, gl.KEEP);
// enabling back the color buffer
gl.colorMask(true, true, true, true);
}
// Renders main content through a series of gl.drawArrays calls
_.each(this.children, webgl.group.renderChild, {
gl: gl,
program: program
});
// Stop considering the stencil
if (this._mask) {
gl.disable(gl.STENCIL_TEST);
}
关于javascript - 如何在WebGL中使用模板创建2d剪贴蒙版?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24687437/