2015-03-31 12 views
5

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ą WebGLRenderer with EffectsComposer + SSAO pass

WebGLDeferredRenderer z SSAO przechodzą WebGLDeferredRenderer with SSAO pass

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?

Odpowiedz

3

Nie wiem, dlaczego to działa, ale spróbuj wymienić:

renderer.render(scene, camera, depthTarget);

Z:

renderer.renderer.render(scene, camera, depthTarget);

+1

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