Practical Rendering and Computation with Direct3D 11
+ -

3.4.4顶点着色器管道输出

2024-06-25 5 0

在决定在输出顶点结构中包括哪些信息时,需要考虑如何使用管道的其余部分。图3.18显示了渲染管道的框图。
143337968668

顶点着色器阶段之后是一组曲面细分阶段(外壳着色器、曲面细分器和域着色器阶段),然后是几何体着色器,然后是光栅化器阶段。根据顶点着色器和光栅化器阶段之间这些阶段中的哪一个处于活动状态,必须满足不同的要求。如果顶点着色器直接连接到光栅化器阶段,则它必须生成SV_position系统值语义中每个垂直面的最终剪辑空间位置。如果曲面细分阶段(三个阶段同时处于活动或非活动状态)或几何体着色器阶段处于活动状态,则顶点着色器可以选择生成片段空间位置。但是,光栅化器阶段之前的最后一个活动阶段必须提供SV_Position系统值语义。

如果顶点着色器直接连接到光栅化阶段,必须生成SV_position。因为光栅化也阶段之前必须提供SV_Position。

类似地,如果曲面细分阶段处于活动状态,则顶点着色器阶段必须为外壳着色器阶段提供控制点。输出顶点和控制点之间的区别实际上仅取决于正在实现的曲面细分方案,但在这两种情况下,数据仍然由顶点着色器生成。如果禁用曲面细分阶段并启用几何体着色器,则顶点着色器输出将直接发送到几何体着色器。在这种情况下,几何体着色器必须向光栅化器提供SV_Position语义,尽管它可以在顶点着色器中计算,然后传递给几何体着色器。仅生成一个位置计算的多种选择低估了管道提供的灵活性,以及开发人员以最有利的方法实现算法的相应自由度。

143745931419

系统值

除了这些基于阶段的注意事项外,顶点着色器阶段还有两个新的系统值可供写入:SV_ClipDistance[n]和SV_CullDistance[n]。两者都可在光栅化器之前的阶段进行写入,用于执行两种不同类型的操作:剪裁和剔除。光栅化器中实现的流水线的剪裁和剔除,将在本章的“光栅化器”部分进行更详细的讨论。然而,我们将在这里简要描述这些操作,以解释这两个系统值中提供的功能。

我们首先简要介绍点到平面距离的计算。通常,从一个点到平面的最短距离可以通过取点的位置和平面的归一化法向量的乘积减去从平面到其坐标空间原点的最短距来求出。当熟悉的平面方程适用于平面时,很容易得到这个结果。方程(3.1)显示了提供该性质的方程,其中a、b和c是正长法向量的分量,d是从原点到平面的最短距离。这个方程产生一个标量结果,可以取三个不同的值范围。如果点位于法线指向的平面的一侧,则可以是正值;如果点正好位于平面上,则可以为零值;如果点位于远离法线向量的平面一侧,则为负值。
图3.19显示了一个平面和一个点的计算结果:
143905374526

为了保守地从进一步处理中剔除完整的基元,所有的顶点导出必须完全在定义片段空间的六个平面中的至少一个平面之外。“顶点位置和每个平面之间的每个距离都可以如上所述进行计算。如果一个基元的所有顶点导致六个平面中任何一个平面的距离值为负值,则该基元可以被丢弃,因为它不可见。SV_CullDistance[n]系统值语义的行为方式与上述保守剔除的形式非常相似。用该系统值声明的每个属性表示到剔除平面的距离。当这些系统值由除法器阶段解释时,它将消除任何顶点在同一寄存器中都为负值的基元。这种类型的系统值使用示例如清单3.12所示。如果”clips的相同组件“属性对于先验的所有顶点都是负的,它将被剔除而不被光栅化。这种安排允许为该属性存储多达四个不同剔除方程结果的结果。

struct VS_OUT
{
    float4 position : SVPosition;
    float4 clips : SV_CullDistance;
};

SV_ClipDistance系统值语义以类似的方式操作,并定义到剪裁平面的距离。如果基元的一个或多个顶点在此属性中具有负值,则其值将用于确定应剪裁当前基元的哪一部分。实际的剪辑可以在光栅化之前或之后执行——这是开发人员无法提前知道的特定于实现的细节。无论基元是如何剪裁的,结果都是光栅化后生成的片段都不会在插值的SV_ClipDistances系统值语义中包含负值。这与SV_CullDistance系统变量不同,后者对整个基元执行剔除测试,而不是试图“剪裁”仅具有正SV_ClipDistance属性的基元。

这些剪裁和剔除系统值的最大数量总共是两个属性,最多有四个组件,每个组件都可以在SV_ClipDistance和SV_CullDistance的任意组合中声明。这意味着总共有八个平面可以被剪裁(如果两个float4用作SV_ClipDistance)或剔除(如果两个子float4用于SV_CullDistance),或两者的某种组合。

0 篇笔记 写笔记

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

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

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