Three.js:将模板剪辑与 EffectComposer 结合使用时出现问题

问题描述 投票:0回答:1

注意:看来我过于简化了最初的问题。请参阅下面的编辑。

我正在尝试将 Three.js 的裁剪/模板示例中显示的技术与基于 EffectComposer 的渲染管道结合起来,该技术在裁剪几何体时使用模板缓冲区来渲染“大写”,但我遇到了一些困难。可以在https://jsfiddle.net/2vc76ajd/1/找到演示该问题的小提琴。

EffectComposer 有两个通道:RenderPass 和使用 CopyShader 的 ShaderPass(请参见下面的代码)。

composer = new EffectComposer(renderer);
composer.addPass(new RenderPass(scene, camera));
var shaderPass = new ShaderPass(CopyShader);
shaderPass.enabled = false;
composer.addPass(shaderPass);

第一个像往常一样渲染场景,后者只是将渲染目标复制到全屏四边形上。如果我禁用 ShaderPass,一切都会按预期工作:几何图形被剪裁,并且切割平面以不同的颜色绘制:

但是,当通过单击右上角的“复制通道”复选框启用 ShaderPass 时,将渲染整个切割平面,而不仅仅是“大写字母”:

大概屏幕外渲染目标和模板缓冲区之间存在一些交互。但是,到目前为止,我还无法找到一种方法使后续渲染通道看起来与初始渲染相同。谁能告诉我我错过了什么?

编辑:虽然WestLangley的答案解决了我最初的问题,但不幸的是,当您使用SSAOPass时,它不起作用,这就是我在尝试简化问题之前所做的事情。我在 https://jsfiddle.net/bavL98hf/1/ 发布了更新的小提琴,其中包括建议的修复,现在可以在 RenderPass 或 SSAOPass 之间切换。 SSAO开启后,结果是这样的:

除了 EffectComposer 中的渲染目标之外,我还尝试将 SSAOPass 中使用的所有渲染目标的 stencilBuffer 设置为 true,但遗憾的是这次不起作用。谁能告诉我我还忽略了什么?

three.js clipping stencil-buffer rendertarget
1个回答
0
投票

对我来说这解决了它:

<EffectComposer stencilBuffer={true}>
should be something like this in vanilla:
composer.stencilBuffer = true;
© www.soinside.com 2019 - 2024. All rights reserved.