three.js webgl ssao

¿Cómo usar el shader SSAO three.js?



webgl (1)

Hay un ejemplo que trabaja con el lanzamiento actual de three.js (r56) en https://twitter.com/mrdoob/status/300919764262477824

Aquí está el enlace directo al código: http://goo.gl/RzfwH

¡Gracias a Altered Qualia y MrDoob por el código de ejemplo y la biblioteca three.js!

Intento renderizar una escena con el sombreador de posprocesamiento de SSAO. No hay ningún error, pero no puedo ver ninguna diferencia entre la escena procesada con y sin el pase SSAO. Inicializo el renderizador de esta manera:

// Create WebGL Renderer var renderParameters = { antialias: false, alpha: false, clearColor: 0xFFFFFF }; renderer = new THREE.WebGLRenderer(renderParameters); renderer.autoClear = false; renderer.setSize(viewportWidth, viewportHeight); // Create render targets renderTargetParametersRGB = { minFilter: THREE.LinearFilter, magFilter: THREE.LinearFilter, format: THREE.RGBFormat }; renderTargetParametersRGBA = { minFilter: THREE.LinearFilter, magFilter: THREE.LinearFilter, format: THREE.RGBAFormat }; depthTarget = new THREE.WebGLRenderTarget(width, height, renderTargetParametersRGBA); colorTarget = new THREE.WebGLRenderTarget(width, height, renderTargetParametersRGB); // The shader pass to draw the scene var renderScenePass = new THREE.RenderPass(scene, camera); // Copy to screen render pass var copyToScreenPass = new THREE.ShaderPass(THREE.CopyShader); copyToScreenPass.renderToScreen = true; // SSAO render pass effectSSAO = new THREE.ShaderPass(THREE.SSAOShader); effectSSAO.uniforms[''tDepth''].texture = depthTarget; effectSSAO.uniforms[''size''].value.set(width, height); effectSSAO.uniforms[''cameraNear''].value = camera.near; // 1 effectSSAO.uniforms[''cameraFar''].value = camera.far; // 1000 //effectSSAO.uniforms.onlyAO.value = 1; // Setup post processing chain composer = new THREE.EffectComposer(renderer, colorTarget); composer.addPass(effectSSAO); composer.addPass(copyToScreenPass); // Depth pass depthPassPlugin = new THREE.DepthPassPlugin(); depthPassPlugin.renderTarget = depthTarget; renderer.addPrePlugin(depthPassPlugin);

En la función de render, renderizo la escena así:

requestAnimationFrame(render); depthPassPlugin.enabled = true; renderer.render(scene, camera, composer.renderTarget2, true); depthPassPlugin.enabled = false; composer.render(0.1);

Como dije antes, todo parece funcionar bien, pero no hay ningún efecto AO visible en la pantalla. Tal vez estoy usando los valores de los parámetros equivocados? Ya me aseguré de que el pase de profundidad se actualiza al presentar el depthTarget a la vista. Si activo effectSSAO.uniforms.onlyAO.value, obtengo una bonita representación "plana" de la escena real (incluyendo texturas), pero todavía no hay AO. ¿Alguien puede darme un consejo qué probar después?