2013-03-07 100 views
1

在我继续对Three.js进行的实验中,我撞上了另一面墙,我似乎无法爬过去。渲染多个场景,只有1个使用SSAO [Three.js]

我想要在具有SSAO后期处理效果的前景场景下呈现的背景场景(其中有地板)。背景场景不应该有任何后期处理应用。

我试过多种方法(使用面具等),我似乎无法破解这个。我看到的主要问题是SSAO场景的背景不透明,所以背景场景未显示。即使透明度问题得到解决,我仍然不相信事情会按预期工作。

这是事情应该怎么看,都SSAO后处理:http://jsfiddle.net/uJbPe/1/

这是就目前如何看待启用了SSAO后处理:http://jsfiddle.net/7hfdC/6/

任何想法,我做错了吗?

回答

2

您可以使用掩蔽通行证来实现此目的。我相信这是解决问题的正确方法。你原来的代码将需要一些补充来实现这一点。

首先,您需要创建一个渲染目标,该渲染目标有一个模板缓冲区已启用,可以传入效果编辑器使用。模板缓冲区中的信息允许进行掩蔽。

renderTargetParameters = { minFilter: THREE.LinearFilter, magFilter: THREE.LinearFilter, format: THREE.RGBAFormat, stencilBuffer: true }; 
renderTarget = new THREE.WebGLRenderTarget(window.innerWidth, window.innerHeight, renderTargetParameters); 
composer = new THREE.EffectComposer(renderer, renderTarget); 

接下来,我建议让你的背景和前景都通过作曲家。它使渲染栈更清洁。当您渲染前景场景时,请确保其clear属性设置为false,以便保留掩模传递的模板缓冲区数据。

然后是一个遮罩通道,ssao通道,一个清除遮罩路径和一个最终着色器通道以将其全部渲染到屏幕上。您可以在这里使用简单的着色器或fxaa。可能还有另外一种渲染到屏幕的方式,但我不知道,但是您不能将ssao传递给渲染到屏幕上,并且在透明遮罩传递遵循它时使其工作。

这里是用这种方法小提琴的链接实现http://jsfiddle.net/xqLdz/3/

+0

谢谢安德鲁!我永远无法摆脱面具,所以你的jsFiddle例子真的有所帮助。 – 2013-04-01 09:44:57

0

我正在做一些非常非常相似的事情。在你的SSAO中,你尝试过'ssaoPass.material.transparent = true;'。看起来像是如果你使前景RGBA而不是默认的RGB,它可以解决你的问题。

+0

谢谢你的建议,虽然它并没有改变什么,至少没有明显的。 任何机会我可以看到你的工作示例?或者,也许你在上面的问题中添加了你对我的jsFiddle的做法?我真的很感激它。 – 2013-03-09 11:46:03