注意:看来我过于简化了最初的问题。请参阅下面的编辑。
我正在尝试将 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,但遗憾的是这次不起作用。谁能告诉我我还忽略了什么?
对我来说这解决了它:
<EffectComposer stencilBuffer={true}>
should be something like this in vanilla:
composer.stencilBuffer = true;