【问题标题】:Three.js shadows quality updateThree.js 阴影质量更新
【发布时间】:2020-04-29 09:44:38
【问题描述】:

我需要制作灯光(太阳)来为所有场景投射阴影(DirectionalLight 是最好的,对吗?),但质量很差,所以我正在尝试设置阴影:开/关,低、正常、高:

a = 512 ... 8192; b = 300 ... 8000

    light.castShadow = checked; - no update (but if reload an objects it is work)

    light.shadow.mapSize.width/height = a; - this works

    light.shadow.camera.top/bottom/left/right = b; - no updating

尝试查看更改,但没有任何效果:

light.shadow.camera.updateProjectionMatrix(); - shadows disappear at all
scene.updateMatrixWorld();
camera.updateProjectionMatrix();
camera.updateMatrixWorld();
camera.updateMatrix();

有没有更好的晒太阳的方法? 以及如何重绘阴影?

添加一个示例以更好地理解我的意思 -> Example

【问题讨论】:

    标签: javascript three.js


    【解决方案1】:

    根据此链接:https://github.com/mrdoob/three.js/wiki/Updates

    在运行时不能轻易更改的属性(一旦材料被 至少渲染一次):

    • 制服的数量和类型
    • 灯的数量和类型
    • 是否存在:纹理、雾、顶点颜色、蒙皮、变形、阴影贴图、alpha 测试

    这些变化需要构建新的着色器程序。您需要将 material.needsUpdate 标志设置为 true。

    【讨论】:

    • 谢谢你的回复,但没有帮助。问题是一样的:只是场景的一部分(在中心)有阴影。Example 更好地理解
    • @IgorErsgow 好的。如果您增加相机平面(顶部、右侧等),您也需要增加阴影贴图的大小。如果设置 b = 8000,则 a = 8k(例如)。如果您需要即时更改阴影质量,我认为最简单的方法是制作多个灯光实例并激活您选择的那个。
    • 感谢您的回复!我明白你在说什么,但你似乎没有得到任何问题。请你看一个有问题的例子(最后一个链接)。在那里我试图画出问题......我也考虑了几种光线,但我认为这不是制作高质量全场景阴影的最佳方法。
    【解决方案2】:

    如果你想在运行时改变shadow mapSize,你必须dispose()

    light.shadow.map.dispose()
    light.shadow.map = null
    let s = 1024
    light.shadow.mapSize = new THREE.Vector2(s, s)
    

    https://threejs.org/docs/#manual/en/introduction/How-to-dispose-of-objects

    【讨论】:

      猜你喜欢
      • 2013-05-21
      • 1970-01-01
      • 2018-08-26
      • 2016-01-04
      • 1970-01-01
      • 1970-01-01
      • 2012-06-10
      • 2013-06-11
      • 1970-01-01
      相关资源
      最近更新 更多