首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Three.js后处理: FXAA不适用于启用SSAO的

Three.js后处理: FXAA不适用于启用SSAO的
EN

Stack Overflow用户
提问于 2015-10-01 09:33:20
回答 1查看 2K关注 0票数 0

在这个简单的测试场景中,我需要将SSAO和FXAA效果组合在一起,但我无法让它工作。当启用SSAO时,如果我也启用FXAA,则呈现会变黑。

在小提琴,如果你取消评论composer.addPass(FXAA_effect);,你会看到问题。我检查了不同的例子,如何在一个时间添加这些效果,它们各自工作,但我不能把它们放在一起。

我遗漏了什么?

JSFiddle:http://jsfiddle.net/ur3tpwag/

这就是密码:

代码语言:javascript
复制
var scene = new THREE.Scene();

var camera = new THREE.PerspectiveCamera(75, window.innerWidth/window.innerHeight, 0.1, 1000);
camera.position.z = 2;
var geometry = new THREE.BoxGeometry(1, 1, 1);
var material = new THREE.MeshPhongMaterial({ color: 0x1C4A8C });
var cube = new THREE.Mesh(geometry, material);
scene.add(cube);

var light = new THREE.DirectionalLight(0xffffff, 1.0);
light.position.set(0, 0, 1);
scene.add(light);

var renderer = new THREE.WebGLRenderer();
renderer.setSize(window.innerWidth, window.innerHeight);
document.body.appendChild(renderer.domElement);

// ----------------------------------
// POST PROCESSING
// ----------------------------------

// depth        
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;
//

// FXAA
FXAA_effect = new THREE.ShaderPass( THREE.FXAAShader );
FXAA_effect.uniforms['resolution'].value.set(1 / window.innerWidth, 1 / window.innerHeight);
FXAA_effect.renderToScreen = true;
//

// composer
composer = new THREE.EffectComposer( renderer );
composer.addPass( new THREE.RenderPass( scene, camera ) );
//

depthTarget = new THREE.WebGLRenderTarget( window.innerWidth, window.innerHeight, { minFilter: THREE.NearestFilter, magFilter: THREE.NearestFilter, format: THREE.RGBAFormat } );

SSAO_effect = new THREE.ShaderPass( THREE.SSAOShader );
SSAO_effect.uniforms[ 'tDepth' ].value = depthTarget;
SSAO_effect.uniforms[ 'size' ].value.set( window.innerWidth, window.innerHeight );
SSAO_effect.uniforms[ 'cameraNear' ].value = 0.01; 
SSAO_effect.uniforms[ 'cameraFar' ].value = 150;
SSAO_effect.uniforms[ 'onlyAO' ].value = false;
SSAO_effect.uniforms[ 'aoClamp' ].value = 0.5;
SSAO_effect.renderToScreen = true;

composer.setSize(window.innerWidth, window.innerHeight);
composer.addPass(FXAA_effect);
composer.addPass(SSAO_effect);
// ----------------------------------

var render = function () {
  requestAnimationFrame( render );

  cube.rotation.x += 0.01;
  cube.rotation.y += 0.01;

  scene.overrideMaterial = depthMaterial;
  renderer.render( scene, camera, depthTarget, true );

  scene.overrideMaterial = null;
  composer.render();

};

render();
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-10-01 09:52:37

在您的代码中,设置

代码语言:javascript
复制
FXAA_effect.renderToScreen = false;

更新小提琴:http://jsfiddle.net/ur3tpwag/1/

three.js r.72号

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32884135

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档