如何在 DirectX11 中渲染具有多个层次对象的场景?

How to render a scene with multiple hierarchy objects in DirectX11?

这听起来可能是个愚蠢的问题,但我正在尝试了解 3d 游戏编程的基础知识,并且想知道这件事。

我查看了此处的示例 https://code.msdn.microsoft.com/Direct3D-Tutorial-Win32-829979ef,我了解到每个对象的顶点和这些顶点的索引是如何分别存储在 vertex bufferindex buffer 中的。

我想了解的是如何渲染具有多个对象的场景?应该如何设置顶点和索引缓冲区?以及如何实现一个 draw 调用?

请提供参考资料或示例。

为了详细说明 Chuck 的 link,渲染多个对象的过程将根据您选择使用的体系结构而有所不同。

每个模型被分成的部分数量等于它拥有的 textures/material 组合的数量。这些部分中的每一个都包含一个独特的 texture/material 组合,并将有自己的 vertex/index 缓冲区对。

这是因为 HLSL 主要设计用于一次对单个纹理和 material 进行操作。您将单个部分的顶点和索引缓冲区连同相应的 texture/material 绑定到管道,对其执行绘制调用,然后为下一部分绑定缓冲区/texture/material,直到整个模型具有已渲染。

很酷的部分是您只需要加载一次模型。只要您拥有该模型的信息,就可以使用相同的数据但不同的位置矩阵来创建模型的实例。这使您可以创建成百上千个对象的副本。

我的临时编码引擎是这样处理模型的:在初始化期间,模型管理器 class 用于加载我使用的所有不同模型,并将每个唯一模型存储到模型 class 中。然后我将指针指向模型 class 并将其提供给场景管理器,场景管理器提供有关模型出现在哪些上下文中的信息。当我用场景填充游戏世界时,我的游戏图块使用场景列表 class 来处理实例结构列表和渲染列表。实例结构包含 position/scale/orientation、AABB 和模型指针 class 等信息。每一帧,我都会剔除风景并仅使用潜在可见对象的实例结构填充渲染列表,并为每个列表生成一个实例缓冲区以包含位置信息。然后,我可以遍历每个渲染列表,分配适当的缓冲区和纹理,并绘制索引 instanced() 以渲染模型部分的所有副本。

我不确定我的流程与其他引擎相比如何,但它应该作为一个合理的示例,说明您如何处理多个对象,然后再处理多个对象实例。我在我的过程中的抽象级别是根据我的引擎的工作方式(随机世界生成)选择的。您使用的确切方法将根据您的应用程序而有所不同。

这是一个显示相当简单的设置的基本图表: