分割(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 

顶点管道