c++ - 如何将多个 directx LP3DXMESH 组合成 1 个网格以实现快速渲染?

标签 c++ directx mesh

我读到,将网格合并为单个网格并渲染速度要快得多,因为您一次发送所有数据。我使用的是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/

相关文章:

DirectX 11 : simultaneous use of multiple adaptors

c++ - 在 DirectX 11 中将文本绘制为二维纹理?

javascript - 在 ThreeJS 中将立体投影映射到球体内部

c++ - 是什么导致了 std::async 中的数据竞争?

c++ - 使用wininet的异步请求

c++ - 如何将三地址代码转换为 MIPS 汇编语言?

c++ - 任意大小的 DirectX9 纹理(非 2^n)

c++ - 如何在cgal中加载COFF网格?

javascript - Three.js MeshBasicMaterial 无法按预期工作

c++ - 传递与 `swprintf` %s"` 说明符匹配的 `char const*` 时 `L"的行为