Practical Rendering and Computation with Direct3D 11
+ -

3.3.3输入装配阶段处理

2024-06-18 4 0

有了输入装配程序的所有可用设置,就有了各种各样的配置,可以产生不同的输出数据,用于管道的其余部分。在研究这些配置中的每一个所产生的内容之前,我们将更仔细地了解输入装配程序中到底在做什么。

顶点数

我们已经看到了输入装配程序如何通过从绑定的顶点缓冲区读取数据并将其组合成单个顶点来创建顶点流。该顶点流以两个有序序列之一生成顶点。顶点要么从其顶点缓冲区按现有顺序保留,要么按索引缓冲区中索引指定的顺序重新排列。使用哪个顺序的决定来自于用于调用管道执行的绘制调用的类型。无论排序来自何处,输入装配程序都会生成一个顶点流来表示输入几何体。

原始流/基元流-Primitive Streams

顶点流被进一步细化为基元流。管道的各个部分旨在仅对顶点(顶点着色器)、顶点和基本体(外壳着色器和域着色器)或仅对完整的基本体(几何体着色器)进行操作。在每种情况下,基元流都由所选的基元拓扑和用于启动管道执行的绘制调用类型决定。

绘制调用效果

那么,绘制调用产生的顶点流和基元流究竟是如何受到所使用调用类型的影响的呢?通过检查每种类型的绘图调用的输入装配程序的输出,可以最好地证明这一点。以下各节提供了有关每个绘图调用类的信息,以及它们对生成的数据流的影响。

标准绘制方法

要考虑的最简单的绘制方法是draw()和DrawAuto()方法。这两种方法都会触发输入装配程序根据其输入布局设置来装配顶点。这将创建一个顶点流,然后将其传递到管道中。这些绘制调用生成的基元信息由当前在输入装配程序中指定的基元拓扑确定,基元的构造取决于在顶点缓冲区中找到的顶点的顺序。这个过程可以看作是基本顶点和基元构造过程。

索引绘制方法

基本绘图调用的第一个变体是添加索引渲染。正如我们已经讨论过的,索引渲染使用索引缓冲区的索引来确定哪些顶点用于构建基元,而不是简单地使用顶点缓冲区的顶点顺序。顶点流保持不变,只是其中的顶点由索引缓冲区的索引选择。此外,基元流使用索引缓冲区顺序而不是顶点缓冲区顺序来创建其基元。一些绘制调用支持索引渲染,包括DrawIndexed()、DrawIndexedlnstanted()和DrawIndexedlnstancedlndirect()。

实例绘制方法

除了索引渲染,Direct3D 11还允许实例化渲染。我们在描述D3D11_INPUT_ELEMENT_DESC结构的可用成员时简要讨论了实例化渲染。如果将顶点组件声明为每实例组件,并且使用其中一种实例化绘制方法调用管道,则顶点流和基元流的创建方式与基本渲染和索引渲染所述的基本方式基本相同。但是,顶点流和基本流对于对象的每个实例都是重复的,只是每个完整实例的每实例顶点组件都会更新。实例的数量由传递给draw调用的参数决定,每个实例的顶点组件取自绑定到输入装配程序的一个或多个顶点缓冲区。

总体而言,使用实例化渲染方法的结果是顶点流和基本体流乘以正在渲染的实例数。有四种不同的实例化绘图调用:DrawInstanced()、DrawIndexedlnstanced()、DrawInstancedlndirectQ和Drawlnindexedlnstancedlndirect()。

间接绘制方法

除了基本的、索引的和实例化的渲染方法之外,还有另一种类型的绘制调用:间接渲染。这种技术实际上不会修改顶点和基元流,但应该在这里讨论它,以获得可用绘制方法的完整视图。相反,间接呈现方法允许将缓冲区资源作为绘制调用参数传递。缓冲区包含通常由应用程序传递的所需输入信息。间接渲染方法有DrawInstancedlndirectQ和DrawIndexedlnstancedlndirect()。例如,Drawlnstancedlndirect()方法的顶点数、起始顶点、实例数和起始实例将包含在缓冲区资源中,而不是直接传递给函数。

这些调用的目的是允许GPU填充缓冲区,然后缓冲区可以控制绘制序列的执行方式。这将绘制调用的控制转移到GPU而不是应用程序,并提供了使GPU在其操作中更加自主的第一步。但是,间接渲染操作不会修改顶点流和基元流的构造——它们只会修改绘制方法参数传递到运行时的方式。

混合渲染绘制方法

正如我们所看到的,每一类渲染操作并不是相互排斥的。绘制方法的名称通常包括其中几种渲染技术,并提供了执行管道的各种不同方式。在每种混合情况下,生成的顶点流和基本体流都是独立渲染类型的混合。

0 篇笔记 写笔记

作者信息
站长漫谈
取消
感谢您的支持,我会继续努力的!
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

您的支持,是我们前进的动力!