重置EffectComposer销毁的深度缓冲区

时间:2013-01-24 16:03:21

标签: three.js

我正在尝试将两个不同的场景和相机叠加在一起,就像HUD一样。两者都可以正确渲染。这也是按预期工作的,所以你可以在helpcene下看到mainscene:

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

当我使用EffectComposer渲染主场景时,我根本看不到helpcene,我只看到作曲家渲染的结果:

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?

这里发生了什么?如果我评论渲染调出,它们再次正常工作。但两者都启用了,我只看到作曲家场景/渲染。我希望helpcene覆盖(或至少覆盖)之前渲染的内容。

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

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

因为我现在只在辅助场景中使用LineMaterial,但是我预计会有一些问题在深度测试中使用depthTest = false(后面可能会有一些真正的阴影对象,需要进行深度测试)针对同一助手场景中的其他对象。)

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

我应该提一下,我的一个作曲家设置主RenderPass渲染为一个纹理到一个扭曲的平面几何形状附近为此目的创建的透视相机(如许多后处理示例中发现的ortographic相机和四重设置,但有失真)。其他设置有一个“普通”的RenderPass与实际的场景摄像机,我希望深度信息是这样的,无论如何我应该看到辅助场景(这可能是一些严重的f * * ** ed英语,对不起,非母语人士,我无法想出更好的词汇)。我对两种选择都有同样的问题。

1 个答案:

答案 0 :(得分:4)

......回答我的自我。找到真正的原因后,这​​很简单。

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