首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Three.js -抗锯齿、渲染、fxaa

Three.js -抗锯齿、渲染、fxaa
EN

Stack Overflow用户
提问于 2019-10-17 18:19:46
回答 1查看 2K关注 0票数 3

我有一个带有3D模型的three.js项目,其中有一个地面和一个网格。使用outlinePass (https://threejs.org/examples/?q=outl#webgl_postprocessing_outline)对3D模型进行概述。

我可以使用变换控件(https://threejs.org/examples/?q=transf#misc_controls_transform)移动对象,也可以使用轨道控件(https://threejs.org/examples/?q=orbit#misc_controls_orbit)更改相机位置。

问题:图形似乎呈现得很差,这里有一些屏幕截图:https://imgur.com/gallery/3FrZt3s

我真的不知道我应该在这里使用哪些设置:

代码语言:javascript
复制
    renderer = new THREE.WebGLRenderer();//{ antialias: true } ); With antialiasing or without?
                                 //antialiasing is only needed when not using fxaa, right??
            renderer.setPixelRatio( window.devicePixelRatio );
            renderer.setSize( window.innerWidth, window.innerHeight );
            renderer.gammaOutput = true;
            renderer.physicallyCorrectLights = true;

    camera = new THREE.PerspectiveCamera( 45, container.offsetWidth / container.offsetHeight, 0.001, 1000 );
    camera.addEventListener( 'change', render ); //Is this necessary? Seems like it has no use

FXAA可能是outlinePass所必需的(也在上面链接的outlinePass示例中)。

代码语言:javascript
复制
    composer = new EffectComposer( renderer );

            var renderPass = new RenderPass( scene, camera );
            composer.addPass( renderPass );

            effectFXAA = new ShaderPass( FXAAShader );
            effectFXAA.uniforms[ 'resolution' ].value.set( 1 / window.innerWidth, 1 / window.innerHeight );
            effectFXAA.renderToScreen = true;
            composer.addPass( effectFXAA );   

            orbitControls = new OrbitControls( camera, renderer.domElement );
            orbitControls.update();
            orbitControls.addEventListener( 'change', render );

    function render(){
    renderer.render(scene, camera);
    //composer.render(); // don't know if needed
    }

所以我不得不说,我真的不知道如何解决渲染问题,以及我必须设置哪些设置才能最大限度地利用我的项目。我很高兴每一个提示和答案,也许我可以把这些答案放在一起,并解决问题。

EN

回答 1

Stack Overflow用户

发布于 2019-10-17 21:49:23

在WebGL 1中使用后处理时,必须使用FXAA进行抗锯齿。在创建WebGLRenderer时将{ antialias: true }传递给true会激活MSAA,但前提是渲染到默认帧缓冲区(直接渲染到屏幕)。

在任何情况下,您都可以这样配置FXAA过程:

代码语言:javascript
复制
effectFXAA = new ShaderPass( FXAAShader );
effectFXAA.uniforms[ 'resolution' ].value.x = 1 / ( window.innerWidth * pixelRatio );
effectFXAA.uniforms[ 'resolution' ].value.y = 1 / ( window.innerHeight * pixelRatio );
composer.addPass( effectFXAA );   

你必须遵守pixelRatio。此外,不再需要将renderToScreen设置为true。后处理链中的最后一遍现在会自动渲染到屏幕上。

在使用EffectComposer时,您不会调用renderer.render(scene, camera);。您必须改用composer.render();

也可以删除camera.addEventListener( 'change', render );。我不确定你是在哪里看到这个的,但它没有任何效果。

three.js R109

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

https://stackoverflow.com/questions/58430277

复制
相关文章

相似问题

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