我试图将SSAO着色器传递添加到之前的小提琴中,结果是:EffectComposer second pass "overwrites" first pass
不幸的是,我得到一个黑色的屏幕,我创建了一个新的小提琴,我将根据我的发现更新:
创建深度着色器和深度着色器的目标以渲染到:
var depthShader = THREE.ShaderLib[ "depthRGBA" ];
var depthUniforms = THREE.UniformsUtils.clone( depthShader.uniforms );
depthMaterial = new THREE.ShaderMaterial( { fragmentShader: depthShader.fragmentShader, vertexShader: depthShader.vertexShader, uniforms: depthUniforms } );
depthMaterial.blending = THREE.NoBlending;
depthTarget = new THREE.WebGLRenderTarget( window.innerWidth, window.innerHeight, { minFilter: THREE.NearestFilter, magFilter: THREE.NearestFilter, format: THREE.RGBAFormat } );
创建SSAO着色器并将其添加到编辑器
var effect = new THREE.ShaderPass( THREE.SSAOShader );
effect.uniforms[ 'tDepth' ].value = depthTarget;
effect.uniforms[ 'size' ].value.set( window.innerWidth, window.innerHeight );
effect.uniforms[ 'cameraNear' ].value = camera.near;
effect.uniforms[ 'cameraFar' ].value = camera.far;
effect.renderToScreen = true;
composer.addPass( effect );
渲染循环渲染场景,首先设置覆盖材质,然后渲染作曲家
requestAnimationFrame( animate );
//renderer.clear(); // changed -------------
scene.overrideMaterial = depthMaterial;
renderer.render( scene, camera, depthTarget );
scene.overrideMaterial = null;
composer.render();
提出的一个侧面问题是,您是否能够将具有深度目标的场景渲染添加到作曲家?
此问题的原因是rendertarget不同,并且要设置覆盖材料。我无法找到任何办法做到这一点,这样做甚至听起来合理,还是我想念效果作曲家呢?
如果我设置effect.uniforms[ 'onlyAO' ].value = 1;
,则发现SSAO部分正常工作,然后您可以看到它正常工作但将其设置为0会导致黑屏。现在看看EffectComposer的代码,看看发生了什么。
希望有人可以再次帮助我。
就像我说的那样,我会更新这篇文章,并尝试我的尝试
有关该主题的有趣链接:
编辑: