Oto porównania, które pokazują, że rzeczywiście mam konfigurację SSAO poprawnie.Uzyskaj WebGLDeferredRenderer współpracujący z SSAO
WebGLRenderer z EffectsComposer + SSAO przechodzą
WebGLDeferredRenderer z SSAO przechodzą
staram się mieszać WebGLDeferredRenderer z SSAO kompozytora efektu tak:
renderer = new THREE.WebGLDeferredRenderer({
antialias: true,
tonemapping: THREE.FilmicOperator,
brightness: 2.5,
scale: 1.0,
width: renderWidth,
height: renderHeight
});
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;
composer = new THREE.EffectComposer(renderer);
composer.setSize(window.innerWidth, window.innerHeight);
depthTarget = new THREE.WebGLRenderTarget(window.innerWidth, window.innerHeight, {
minFilter: THREE.NearestFilter,
magFilter: THREE.NearestFilter,
format: THREE.RGBAFormat,
antialias: true
});
var ssao = new THREE.ShaderPass(THREE.SSAOShader);
ssao.uniforms[ 'tDepth' ].value = depthTarget;
ssao.uniforms[ 'size' ].value.set(window.innerWidth, window.innerHeight);
ssao.uniforms[ 'cameraNear' ].value = camera.near;
ssao.uniforms[ 'cameraFar' ].value = camera.far * 0.8;
ssao.uniforms[ 'aoClamp' ].value = 0.3;
ssao.uniforms[ 'lumInfluence' ].value = 0.1;
renderer.addEffect(ssao);
scene.overrideMaterial = depthMaterial;
renderer.render(scene, camera, depthTarget);
scene.overrideMaterial = null;
renderer.render(scene, camera);
Wyniki są ... cóż ... nic.
Co robię źle? W jaki sposób chciałbym włączyć SSAO w odroczonym rendererze?
To jest to! Dziękuję @aki. Powodem, dla którego został złamany, było to, że WebGLDeferredRenderer jest po prostu powłoką, która zawiera odniesienie do rzeczywistego WebGLRenderer. W takim przypadku powinien zostać wywołany do renderowania przez renderer.renderer.render() ...... yikes! Oprócz tego należy ustawić forceClear za pomocą metody renderer.renderer.render (scene, camera, depthTarget, true); aby ta mieszanka działała. – Flux