【问题标题】:Three.js - antialiasing, rendering, fxaaThree.js - 抗锯齿、渲染、fxaa
【发布时间】:2019-10-17 10:19:46
【问题描述】:

我有一个 three.js 项目,其中包含 3d 模型、一个地面和一个网格。 使用 outlinePass (https://threejs.org/examples/?q=outl#webgl_postprocessing_outline) 勾勒出 3d 模型。

我可以使用 Transformcontrol (https://threejs.org/examples/?q=transf#misc_controls_transform) 移动对象,我可以使用 Orbitcontrols (https://threejs.org/examples/?q=orbit#misc_controls_orbit) 更改我的相机位置

问题:图形似乎渲染得很糟糕,这里有一些截图: https://imgur.com/gallery/3FrZt3s

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

    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

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

    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
    }

所以我不得不说,我真的不知道如何解决渲染问题以及我必须设置哪些设置才能充分利用我的项目。我对每一个提示和答案都很满意,也许我可以把这些答案放在一起解决问题。

【问题讨论】:

    标签: javascript three.js rendering render


    【解决方案1】:

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

    无论如何,您都可以像这样配置 FXAA 通行证:

    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

    【讨论】:

    • 感谢您提供所有这些信息!我根据您的建议更改了渲染设置,但现在当我移动相机或移动对象时,它会抖动得很厉害。我用 transformcontrol 移动我的对象并将其编码如下: control.addEventListener('change', render);函数渲染(){作曲家.渲染(); }
    • 你能用正常的动画循环试试吗?像这样:github.com/mrdoob/three.js/blob/…。然后,您可以从控件中删除 change 事件侦听器。
    • 我试过了,效果很好。完全没有晃动。哇:我删除了 transform 和 orbitcontrols 的更改事件侦听器,它不再不稳定,不需要它们了吗?
    • 仅当您不使用正在进行的动画循环时才需要它们。是否真的需要动画循环取决于用例。
    • 在这种情况下,我需要事件监听器,但如果我添加它们,我的程序会非常不稳定,您有什么建议吗?
    猜你喜欢
    • 2019-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-05
    • 2016-09-30
    • 2021-01-07
    • 1970-01-01
    相关资源
    最近更新 更多