Как использовать шейдер SSAO three.js?
Я пытаюсь визуализировать сцену с помощью шейдерной обработки SSAO. Там нет никаких ошибок, но я не вижу никакой разницы между сценой, представленной с пропуском SSAO и без него. Я инициализирую рендерер так:
// 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);
В функции рендеринга я отрисовываю сцену так:
requestAnimationFrame(render);
depthPassPlugin.enabled = true;
renderer.render(scene, camera, composer.renderTarget2, true);
depthPassPlugin.enabled = false;
composer.render(0.1);
Как я уже говорил, кажется, все работает нормально, но на экране не видно никакого эффекта АО. Может я просто использую неправильные значения параметров? Я уже позаботился о том, чтобы проход глубины обновлялся путем рендеринга глубины цели на сцену. Если я включаю effectSSAO.uniforms.onlyAO.value, я получаю довольно "плоскую" коричневатую визуализацию реальной сцены (включая текстуры), но все еще не AO. Может кто-нибудь дать мне совет, что попробовать дальше?
1 ответ
Есть пример работы с текущей версией three.js (r56) по адресу https://twitter.com/mrdoob/status/300919764262477824
Вот прямая ссылка на код: http://goo.gl/RzfwH
Спасибо Altered Qualia и MrDoob за пример кода и библиотеку three.js!