首页 > 解决方案 > 如何在 Direct3D11 中正确渲染多个 3D 模型?

问题描述

经过一番搜索,我了解到可以创建多个顶点缓冲区,每个顶点缓冲区用于特定的 3D 模型,并将它们设置在输入汇编器中以供我的着色器读取,或者至少这是我能理解的。但是通过阅读微软的文档,我对如何以正确的方式做到这一点感到非常困惑,这个是我正在阅读的内容,他们说我可以将顶点缓冲区数组传递给 IA 阶段,但它也说我的输入汇编程序在 D3D11 中可以接受的顶点缓冲区的最大数量是 32。如果我该怎么办需要同时渲染 50 个不同的模型?而且,如果有人可以阐明 pOffset 在这种情况下如何使用多个模型工作也会有所帮助,因为我可以理解它应该始终被分配一个 0 值,因为我的缓冲区的开头始终是顶点数据,但我可以理解错误的。最后我想补充一下,我已经渲染了一些由多个模型组成的缓冲区,但我不知道如何处理许多单独的模型。

标签: graphicsdirect3d

解决方案


简短的回答是:您不会尝试在一次Draw调用中绘制所有模型。

您可以通过多种方式自由组织渲染,但这里有一种方法:

“模型”由一个或多个“网格”组成。每个网格都是顶点(在 VB 中)、索引(在 IB 中)以及与索引的每个“子集”相关联的一些材料信息的集合。

绘制:

foreach M in models
    foreach mesh in M
        foreach part in mesh
            Set shaders based on material
            Set VB/IB based on mesh
            DrawIndexed

由于这是多个嵌套循环,因此有多种方法可以提高性能。例如,您可能只是将信息排队,而不是实际调用 DrawIndexed,然后按材质排序。然后从排序队列中调用 DrawIndexed。

为了使 alpha 混合看起来正确,您必须至少进行两次渲染通道:首先渲染不透明的东西,然后第二次渲染 alpha 混合的东西。

您可能还希望将给定模型中的所有内容组合到一个带有偏移量的 VB 和一个 IB 中,而不是使用单独的资源。

您可能在世界上的多个位置拥有相同的模型,因此您可能有许多模型实例共享相同的网格数据。在这种情况下,按 VB/IB 和材料分类可能会很有用。如果您在许多位置(100 或 1000)绘制相同的模型,那么您应该研究硬件实例化

可以在DirectX 工具包中找到一个示例实现,如ModelModelMeshModelMeshPart


推荐阅读