添加SSAO着色器传递

时间:2015-07-09 14:46:26

标签: three.js

我试图将SSAO着色器传递添加到之前的小提琴中,结果是:EffectComposer second pass "overwrites" first pass

不幸的是,我得到一个黑色的屏幕,我创建了一个新的小提琴,我将根据我的发现更新:

http://jsfiddle.net/mqt1ng2r/

创建深度着色器和深度着色器的目标以渲染到:

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的代码,看看发生了什么。

希望有人可以再次帮助我。

就像我说的那样,我会更新这篇文章,并尝试我的尝试

有关该主题的有趣链接:

编辑:

  • 添加了一些相关的代码片段(在这里张贴所有内容会使问题变得混乱)
  • 添加了有趣的链接
  • effect.uniforms [' onlyAO' ] .value = 1;

0 个答案:

没有答案