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

时间:2018-11-08 17:43:48

标签: directx directx-11

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

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

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

参考或示例将对您有所帮助。

1 个答案:

答案 0 :(得分:1)

要详细介绍Chuck的链接,呈现多个对象的过程将根据您选择使用的体系结构而有所不同。

每个模型都划分为多个部分,这些部分等于其具有的纹理/材质组合的数量。每个部分均由独特的纹理/材质组合组成,并将具有自己的顶点/索引缓冲区对。

之所以这样做是因为HLSL的主要设计目的是一次对单一纹理和材质进行操作。您将单个部分的顶点和索引缓冲区以及相应的纹理/材质绑定到管道,对其进行绘制调用,然后为下一部分绑定缓冲区/材质/材质直到下一个模型被渲染为止。 / p>

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

我的暂存编码引擎按如下方式处理模型:在初始化期间,模型管理器类用于加载我使用的所有不同模型,并将每个唯一模型存储到模型类中。然后,我将指针指向模型类,并将其输入到布景管理器中,该管理器提供有关模型出现在什么上下文中的信息。当我用布景填充游戏世界时,我的游戏图块使用布景列表类来处理实例结构的列表和渲染列表。实例结构保存诸如位置/比例/方向,AABB和指向模型类的指针之类的信息。我在视锥浏览器的每一帧中都删除场景,并仅使用潜在可见对象的实例结构填充渲染列表,并为每个列表生成一个实例缓冲区以包含位置信息。然后,我可以遍历每个渲染列表,分配适当的缓冲区和纹理,并绘制索引的instanced()来渲染模型部分的所有副本。

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

这是一个基本图,显示了相当简单的设置: enter image description here