これに似たクリッピング マスクを作成する方法を調査しています(SVG で作成)。
私の調査結果に基づいて、ステンシルによってこれを達成することにしました。しかし、私の実装はひどく間違っています。メインコンテンツを2回マスキングするフラグメントをレンダリングする必要があるように見えるため、どのようgl.stencilOp
に機能するかは完全にはわかりません。gl.stencilFunc
メイン コンテンツをレンダリングする前に 1 回、さまざまなパラメーターを使用してレンダリングした後に 1 回。
動作テストは次のとおりです: 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);
}
svg の例のように動作するように webgl ステンシルをエミュレートするためのガイダンスをいただければ幸いです。