分割(Direct3D 9)
细化器单位
分割器单元已得到增强。 现在可以使用它来:
- 对所有高阶基元执行自适应分割。
- 从位移图中查找每个顶点位移值,并将其传递给顶点着色器。
- 支持矩形修补分割。 这是通过使用D3DDECLMETHOD_PARTIALU或D3DDECLMETHOD_PARTIALV的顶点声明指定的。 如果使用包含这些方法的顶点声明来绘制三角形补丁,IDirect3DDevice9::D rawTriPatch 将失败。 有关顶点声明的详细信息,请参阅 D3DVERTEXELEMENT9。
在 DirectX 8.x 中,所谓的 ORDER 确实是学位。 在 Direct3D 9 中,该度现在由 D3DDEGREETYPE指定。
// This used to be D3DORDERTYPE and D3DORDER*
typedef enum _D3DDEGREETYPE
{
D3DDEGREE_LINEAR = 1,
D3DDEGREE_QUADRATIC = 2,
D3DDEGREE_CUBIC = 3,
D3DDEGREE_QUINTIC = 5,
D3DDEGREE_FORCE_DWORD = 0x7fffffff,
} D3DDEGREETYPE;
度类型的更改影响了另外两个结构。
typedef struct _D3DRECTPATCH_INFO
{
UINT StartVertexOffsetWidth;
UINT StartVertexOffsetHeight;
UINT Width;
UINT Height;
UINT Stride;
D3DBASISTYPE Basis;
D3DDEGREETYPE Degree;
} D3DRECTPATCH_INFO;
typedef struct _D3DTRIPATCH_INFO
{
UINT StartVertexOffset;
UINT NumVertices;
D3DBASISTYPE Basis;
D3DDEGREETYPE Degree;
} D3DTRIPATCH_INFO;
驱动程序需要修复使用新标头进行编译时由此更改导致的编译错误。 无需更改任何功能。
自适应分割
自适应分割可应用于高阶基元,包括 N 补丁、矩形补丁和三角形补丁。 此功能由D3DRS_ENABLEADAPTIVETESSELLATION启用,并根据眼睛空间中控制顶点的深度值对补丁进行自适应细化。
控制顶点(Vi)的 z 坐标(Zi),通过执行具有 4 向量的点积来转换为眼空间(Zieye),用作深度值。 4D 矢量(Mdm)由应用程序使用四种呈现状态(D3DRS_ADAPTIVETESS_X、D3DRS_ADAPTIVETESS_Y、D3DRS_ADAPTIVETESS_Z和D3DRS_ADAPTIVETESS_W)指定。 此 4 向量可以是串联世界的第三列和视图矩阵。 它还可用于向齐耶应用规模。
用于从 Zieye 计算分割级别的 Ti 的函数假定为 (MaxTessellationLevel/Zieye),这意味着 MaxTessellationLevel 是 Z = 1 在眼空间中的分割级别。 MaxTessellationLevel 等于 IDirect3DDevice9::SetNPatchMode 为 N 修补程序设置的值,对于 RT 修补程序,它等于 pNumSegs。 然后,分割级别被固定到值,由两个额外的呈现状态D3DRS_MINTESSELLATIONLEVEL和D3DRS_MAXTESSELLATIONLEVEL定义,从而定义要固定到的最小和最大分割级别。 修补边缘上每个顶点的 Ti 均求平均值,以获取该边缘的细化级别。 用于计算矩形补丁、三角形补丁和 N 补丁的 Ti 的算法在用于计算分割级别的控制顶点时有所不同。
对于具有 B 样条基的矩形补丁,使用四个最外层的控制顶点。 例如,使用D3DORDER_CUBIC顺序:顶点(1,1)和(1,width-2)与 pNumSegs[0]一起使用, 顶点(1,width-2)和(height-2,height-2)用于 pNumSegs[1],顶点(height-2,width-2)和(1,width-2)与 pNumSegs[2]一起使用,顶点(2,1)和(1,1)与 pNumSegs[3] 一起使用。
对于三角形补丁,使用角补丁顶点。 使用D3DORDER_CUBIC顺序:顶点(0)和(9)用于 pNumSegs[0],顶点(9)和(6)用于 pNumSegs[1] 和顶点(6)和(0)与 pNumSegs[3]。
对于 N 补丁,使用三角形顶点。
对于具有 Bezier 基的矩形和三角形补丁,使用角控顶点。
按顶点分割速率控制。 应用程序可以选择为每个顶点提供一个正浮点值,该值可用于控制分割速率。 这是使用D3DDECLUSAGE_TESSFACTOR提供的,其使用索引必须为 0,并且输入类型必须D3DDECLTYPE_FLOAT1。 这乘以每顶点分割级别。
数学
边缘 e 的分割级别(Te)由两个控制顶点(Ve1,Ve2)表示,计算结果如下:
Vertex Vi: (Xi, Yi, Zi, TFactori (optional)).
Ze1eye = Ve1 . Mdm
Ze2eye = Ve2 . Mdm
Te1 = MaxTessellationLevel * TFactore1 / Ze1eye
Te2 = MaxTessellationLevel * TFactore2 / Ze2eye
Te = ( Te1 + Te2 ) / 2;
if Te > D3DRS_MAXTESSELLATIONLEVEL || Te < 0, then Te = D3DRS_MAXTESSELLATIONLEVEL
if Te < D3DRS_MINTESSELLATIONLEVEL, then Te = D3DRS_MINTESSELLATIONLEVEL
当D3DRS_ENABLEADAPTIVETESSELLATION TRUE时,三角形基元(三角形列表、风扇、条带)将绘制为 N 补丁,IDirect3DDevice9::SetNPatchMode 已设置小于 1.0 的值。
API 更改
新的呈现状态:
D3DRS_ENABLEADAPTIVETESSELLATION // BOOL
D3DRS_MAXTESSELLATIONLEVEL // Float
D3DRS_MINTESSELLATIONLEVEL // Float
D3DRS_ADAPTIVETESS_X // Float
D3DRS_ADAPTIVETESS_Y // Float
D3DRS_ADAPTIVETESS_Z // Float
D3DRS_ADAPTIVETESS_W // Float
// D3DRS_MINTESSELLATIONLEVEL and D3DRS_MAXTESSELLATIONLEVEL
// cannot be less than 1
其默认值:
D3DRS_MAXTESSELLATIONLEVEL = 1.0f
D3DRS_MINTESSELLATIONLEVEL = 1.0f
D3DRS_ADAPTIVETESS_X = 0.0f
D3DRS_ADAPTIVETESS_Y = 0.0f
D3DRS_ADAPTIVETESS_Z = 1.0f
D3DRS_ADAPTIVETESS_W = 0.0f
D3DRS_ENABLEADAPTIVETESSELLATION = FALSE
新的硬件上限:
D3DDEVCAPS2_ADAPTIVETESSRTPATCH // Can adaptively tessellate RT-patches
D3DDEVCAPS2_ADAPTIVETESSNPATCH // Can adaptively tessellate N-patches
相关主题