ПРИМЕЧАНИЕ. Похоже, я слишком упростил свой первоначальный вопрос. См. Правку ниже.
Я пытаюсь объединить технику, показанную в примере обрезки / трафарета из 3. js, который использует буфер трафарета для рендеринга «шапок» при обрезке геометрии , с конвейером рендеринга на основе Effect Composer, но я столкнулся с некоторыми трудностями. Скрипку, демонстрирующую проблему, можно найти по адресу https://jsfiddle.net/2vc76ajd/1/.
Эффект Composer имеет два прохода: RenderPass и ShaderPass с использованием CopyShader (см. Код ниже).
composer = new EffectComposer(renderer);
composer.addPass(new RenderPass(scene, camera));
var shaderPass = new ShaderPass(CopyShader);
shaderPass.enabled = false;
composer.addPass(shaderPass);
Первый рендерит сцену как обычно, второй просто копирует цель рендеринга в полноэкранный квад. Если я отключу ShaderPass, все будет работать так, как задумано: геометрия обрезается, а плоскости сечения рисуются другим цветом:
![enter image description here](https://i.stack.imgur.com/66k5w.jpg)
When the ShaderPass is enabled by clicking the 'copy pass' checkbox in the upper right, however, the entire cutting plane gets rendered, rather than just the 'caps':
![enter image description here](https://i.stack.imgur.com/SkfxY.jpg)
Presumably there is some interaction here between offscreen render targets and stencil buffers. However, I have so far been unable to find a way to have subsequent render passes look the same as the initial render. Can anyone tell me what I am missing?
EDIT: While WestLangley's answer solved my initial problem, it unfortunately doesn't work when you're using an SSAOPass, which is what I was doing before trying to simplify the problem for the question. I have posted an updated fiddle at https://jsfiddle.net/bavL98hf/1/, включая предлагаемое исправление и теперь переключается между RenderPass и SSAOPass. При включенном SSAO результат будет следующим:
введите описание изображения здесь
Я попытался установить для stencilBuffer значение true для всех целей рендеринга, используемых в SSAOPass, в дополнение к тем, что в Effect Composer, но, к сожалению, на этот раз это не сработало. Может ли кто-нибудь сказать мне, что еще я не замечаю?