上一次更新主要是在图求值中加入了实例化支持,通过此次更新,你现在可以使用GPU实例化来渲染实例网格。

那么,网格实例化和GPU实例化有什么区别呢?首先我们来看一下CosmoNode的工作原理,更具体地说,是它如何将自定义网格数据转换为Unity网格(我称之为后处理)的部分。

在整个图求值过程中,网格被存储在一个名为MeshData的容器中,该容器保存了与网格相关的所有内容,如顶点和面等。而实例网格则由一个源网格和一个表示实例化变换的矩阵列表(Matrix4x4)组成。

现在,为了真正在Unity中显示它,我需要将其转换为Unity网格。这分为两个阶段,且与图本身是分离的。

首先,我需要重新计算UV并处理扁平度属性。Unity按顶点存储UV,但对CosmoNode来说,按面角存储更方便,这样在图中更容易计算。所以我一直按面角存储,直到最后再转换为按顶点。同样,我需要处理扁平度,它也是按面角存储的,表示边是平面着色还是平滑着色,并拆分需要平面着色的边。幸运的是,我可以在一次遍历中完成这两项工作,但即便如此,这到目前为止仍是一个主要瓶颈。我竭尽全力优化它,但仍然很慢。所以最后我决定将这个功能转移到C++原生代码中。

这使得代码运行速度提高了2倍。到目前为止还不错。

第二步是将处理后的数据转换为Unity网格。这也是实例化变得有趣的地方。

以前,我必须将所有实例“展开”成一个单独的网格。但这意味着失去了实例化的所有优势。因此,通过此次更新,它使用GPU实例化来显示实例网格。将变换存储为Matrix4x4使这变得非常方便,我只需传递数组和源网格,其余由Unity处理。

附带的视频展示了实例化前后的性能对比。我包含了计算时间,如果你感兴趣可以看看。

所以,总体来说,这是对上一次更新相对较小但至关重要的后续。上一次更新在图求值中添加了实例化,而这一次则允许这些实例被高效地渲染。

当然,欢迎你提出任何反馈。

如果你想试用,文档和相关链接在这里:https://uumutunal.github.io/CosmoNode_Manual/