gpt4 book ai didi

performance - 许多具有相同几何形状和 Material 的网格,我可以更改它们的颜色吗?

转载 作者:行者123 更新时间:2023-12-03 13:37:26 24 4
gpt4 key购买 nike

我有大量(~1000)THREE.Mesh由相同 THREE.Geometry 构造的对象和 THREE.MeshPhongMaterial (有 map )。

我想单独为这些对象着色(着色)。

天真地,我尝试更改 mesh.material.color属性,但是在任何对象上更改此属性会立即更改所有对象的颜色。这是有道理的,因为只有一种 Material 在所有对象之间共享。

我的下一个想法是创建一个单独的 THREE.MeshPhongMaterial对于每个对象。所以,现在我有大量的THREE.Mesh由相同 THREE.Geometry 构造的对象, 但有个人 THREE.MeshPhongMaterials (共享相同的纹理)。这允许我单独更改颜色,但性能更差。 chrome 分析器显示该应用程序正在花费大量时间来处理 Material 方面的事情,例如切换纹理。

Material 颜色只是着色器中的统一。所以,更新制服应该很快。

问题:有没有办法从网格级别覆盖 Material 颜色?

如果有的话,我相信我可以在所有对象之间共享 Material 并恢复我的性能,同时仍然单独更改颜色。

[我在v49和v54上测试过,它们的性能和降级是一样的]

更新:我已经建立了一个测试用例,因此导致的性能下降比我想象的要小,但仍然可以测量。

这里有两个链接:

  • http://danceliquid.com/docs/threejs/material-test/index.html?many-materials=false
  • http://danceliquid.com/docs/threejs/material-test/index.html?many-materials=true

  • 在第一种情况下,只有两种 Material ,在第二种情况下,每个立方体都有自己的 Material 。我在这台机器上测得第一种情况的帧率是53fps,第二种情况的帧率是46fps。这大约下降了 15%。

    在这两种情况下,每个立方体的 Material 颜色每帧都会改变。在有许多 Material 的情况下,我们实际上看到每个立方体都有自己的颜色,在只有两种 Material 的情况下,我们看到它们都具有相同的颜色(如预期的那样)。

    最佳答案

    是的。对于每个对象,使用 material.clone() 克隆您的 Material ,修改其emissivecolor ,并将对象的 Material 设置为此克隆。着色器和属性是通过引用复制的,所以不用担心每次都克隆整个 Material ;实际上,唯一按值复制的东西是制服(例如 emissivecolor )。因此,您可以更改每个单独的对象。

    我个人将原始 Material 存储在对象的单独自定义属性中,以便以后可以轻松切换回它;取决于你的需求是什么。

    关于performance - 许多具有相同几何形状和 Material 的网格,我可以更改它们的颜色吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14145275/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com