2

我正在尝试渲染两个不同的场景和相机,就像 HUD 一样。两者都在单独时正确渲染。这也可以按预期工作,因此您可以在帮助场景下看到主场景:

renderer.render(mainscene, maincamera);
renderer.render(helpscene, helpcamera);

当我使用EffectComposer渲染主场景时,我根本看不到helpscene,我只看到composer渲染的结果:

renderTargetParameters = { minFilter: THREE.LinearFilter, magFilter: THREE.LinearFilter, format: THREE.RGBAFormat, stencilBuffer: false };
renderTarget = new THREE.WebGLRenderTarget( width, height, renderTargetParameters );
composer = new THREE.EffectComposer(renderer, renderTarget);
---- cut out for brevity ---

composer.render(delta);
renderer.render(helpscene, helpcamera); // has no effect whatsoever on the screen, why?

这里发生了什么?同样,如果我评论任何一个渲染调用,它们都可以正常工作。但两者都启用了,我只看到作曲家场景/渲染。我希望帮助场景覆盖(或至少覆盖)在此之前呈现的任何内容。

我之前有相当复杂的代码renderer.render(helpscene, helpcamera);,它可能会采用各种不同的渲染路径并根据不同的设置使用 effectcomposer 或不使用。但我希望帮助场景始终采用没有效果或任何东西的简单路线,这就是为什么我使用单独的渲染调用而不是将其合并为 effectcomposer 通道的原因。

编辑:原来这是因为一些有趣的业务与深度缓冲区(?)。如果我将 material.depthTest = false 设置为辅助场景中的所有内容,它将正确显示。看起来深度被某些作曲家通道或作曲家本身设置为零或非常低,而且出乎意料的是,它会产生隐藏任何通过后续渲染调用渲染的内容的效果。

因为我现在只在辅助场景中使用 LineMaterial ,所以它现在可以使用,但我预计在 depthTest = false 解决方法中会出现一些问题(稍后可能会有一些真实的阴影对象,这需要针对其他对象进行深度测试在同一个助手场景中)。

所以我想真正的问题是:如何在 EffectComposer 之后重置深度缓冲区(或其他东西),以便进一步的渲染调用不受它的影响?我也可以将辅助场景渲染作为最后一个作曲家通过,没有太大区别。

我可能应该提一下,我的一个作曲家设置主要 RenderPass 将纹理渲染为一个扭曲的平面几何图形,靠近为此目的而创建的透视相机(如在许多后处理示例中发现的正交相机和四边形设置,但有失真)。其他设置有一个带有实际场景相机的“正常”RenderPass,我希望深度信息能够让我无论如何都应该看到辅助场景(这可能是一些严重的 f* * ** ed up English,抱歉,非母语人士在这里,我想不出更好的词)。我对这两种选择都有同样的问题。

4

1 回答 1

4

...并回答我自己。找到真正原因后,就很简单了。

renderer.clear(false, true, false);将清除深度缓冲区,以便覆盖渲染按预期工作:)

于 2013-01-25T13:38:56.330 回答