2017-04-14 153 views
1

我想在我的THREE.EffectComposer结合SMAASSAO这样的:three.js所:结合SMAA和SSAO后处理

this.composer = new THREE.EffectComposer(this.renderer); 

// Setup depth pass 
depthMaterial = new THREE.MeshDepthMaterial(); 
depthMaterial.depthPacking = THREE.RGBADepthPacking; 
depthMaterial.blending = THREE.NoBlending; 
var pars = { minFilter: THREE.LinearFilter, magFilter: THREE.LinearFilter }; 
depthRenderTarget = new THREE.WebGLRenderTarget(window.innerWidth, window.innerHeight, pars); 
// Setup SSAO pass 
ssaoPass = new THREE.ShaderPass(THREE.SSAOShader); 
ssaoPass.renderToScreen = true; 
ssaoPass.uniforms[ "tDepth" ].value = depthRenderTarget.texture; 
ssaoPass.uniforms[ 'size' ].value.set(window.innerWidth, window.innerHeight); 
ssaoPass.uniforms[ 'cameraNear' ].value = this.camera.near; 
ssaoPass.uniforms[ 'cameraFar' ].value = this.camera.far; 
ssaoPass.uniforms[ 'onlyAO' ].value = false; 
ssaoPass.uniforms[ 'aoClamp' ].value = .3; 
ssaoPass.uniforms[ 'lumInfluence' ].value = 1; 

this.ssaoPass = ssaoPass; 
this.depthRenderTarget = depthRenderTarget; 


smaapass = new THREE.SMAAPass(window.innerWidth, window.innerHeight); 
smaapass.renderToScreen = true; 
this.composer.addPass(new THREE.RenderPass(this.scene, this.camera)); 
this.composer.addPass(ssaoPass); 
this.composer.addPass(smaapass); 

但不幸的是被应用于仅smaapass。 我也尝试颠倒composer.addPass的顺序,但没有成功。 我在哪里做错了?谢谢!

回答

1
var renderPass = new THREE.RenderPass(scene, camera); 
this.composer = new THREE.EffectComposer(this.renderer); 
this.composer.addPass(renderPass); 

// Setup depth pass 
depthMaterial = new THREE.MeshDepthMaterial(); 
depthMaterial.depthPacking = THREE.RGBADepthPacking; 
depthMaterial.blending = THREE.NoBlending; 
var pars = { minFilter: THREE.LinearFilter, magFilter: THREE.LinearFilter, format: THREE.RGBAFormat }; 
depthRenderTarget = new THREE.WebGLRenderTarget(window.innerWidth, 
window.innerHeight, pars); 
// Setup SSAO pass 
ssaoPass = new THREE.ShaderPass(THREE.SSAOShader); 
ssaoPass.uniforms[ "tDepth" ].value = depthRenderTarget.texture; 
ssaoPass.uniforms[ 'size' ].value.set(window.innerWidth, window.innerHeight); 
ssaoPass.uniforms[ 'cameraNear' ].value = this.camera.near; 
ssaoPass.uniforms[ 'cameraFar' ].value = this.camera.far; 
ssaoPass.uniforms[ 'onlyAO' ].value = false; 
ssaoPass.uniforms[ 'aoClamp' ].value = .3; 
ssaoPass.uniforms[ 'lumInfluence' ].value = 1; 
ssaoPass.renderToScreen = false; // lviggiani edit 

smaapass = new THREE.SMAAPass(window.innerWidth, window.innerHeight); 
smaapass.renderToScreen = true; 
this.composer.addPass(ssaoPass); 
this.composer.addPass(smaapass); 

我做了renderpass高于一切,并设置ssao前要加上renderpass。我还将rendertoscreen放在设置的底部,而不是顶部。也删除了this.depthRenderTarger = depthRenderTarger;,除非你已经将它设置在其他地方,你不需要它。我还将RGB格式添加到depthrendertarget

+0

感谢您的回答,但它似乎并没有工作...如果例如我设置'ssaoPass.uniforms ['onlyAO'] .value = true;'我应该只看到环境遮挡,但我仍然看到图像没有一个。如果我注释掉'this.composer.addPass(s​​maapass);'然后我只看到ao,但当然没有反锯齿 – lviggiani

+1

好吧,我通过设置'ssaoPass.renderToScreen = false;' – lviggiani

+0

很高兴你找到了你的答案any祝你好运!) –