我读到,将网格合并为单个网格并渲染速度要快得多,因为您一次发送所有数据。我使用的是directx9.0c,固定函数,c++。我有很多 LP3DXMESH,我想将它们组合起来并一次发送以进行绘制。
我用谷歌搜索答案,得到了垃圾结果。我怎样才能做到这一点?
最佳答案
将多个网格合并为一个,非常简单,满足以下几个条件。
所有网格体必须具有相同的顶点大小/布局(或 declaration )
鉴于此,假设您有 3 个模型: 模型 1 有 10 个顶点和 21 个索引 模型 2 有 20 个顶点和 30 个索引 模型 3 有 25 个顶点和 45 个索引
创建一个能够容纳所有数据的顶点缓冲区(例如:10+20+25 个顶点)
将模型 1、模型 2 和模型 3 中的每个顶点复制到这个新的顶点缓冲区中。
以与顶点缓冲区相同的方式创建索引缓冲区(例如:21 + 30 + 45 个索引)
现在对于模型一,只需复制索引即可。
对于模型 2,您需要复制索引,但向每个索引添加 10(第一个顶点缓冲区的大小)。
对于模型 3,您的操作与模型 2 相同,但需要添加 10 + 20(之前每个尺寸的总和)。
使用新缓冲区创建网格。
基于一些考虑:
- 如果您不经常绘制模型(例如,每次绘制 3 个网格),那几乎不会给您带来任何好处。
- 如果您的每个模型都需要使用不同的变换(也经常变化)进行绘制,那么您还需要在 cpu 中变换顶点(这反而会给您带来潜在的性能损失),或者添加一些额外的数据在您的模型中(就像只是一个 ID),并使用任何形式的查找(数组或纹理查找很常见)在顶点着色器中进行转换。
- 在某些情况下(例如多次重复同一对象),使用此技术实际上可能很好,但看起来不像您的用例。
关于c++ - 如何将多个 directx LP3DXMESH 组合成 1 个网格以实现快速渲染?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14470794/