分割 (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 坐标 (z) 用作深度值, (Zieye) 通过执行点积来转换为眼部空间。 4D 矢量 (Mdm) 是由应用程序使用四种呈现状态 (D3DRS_ADAPTIVETESS_X、D3DRS_ADAPTIVETESS_Y、D3DRS_ADAPTIVETESS_Z和D3DRS_ADAPTIVETESS_W) 指定的。 此 4 向量可能是串联的世界和视图矩阵的第三列。 它还可用于将刻度应用于 Zieye。

用于从 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 (0) 的顶点与 pNumSegs[3] 一起使用。

对于 N 补丁,使用三角形顶点。

对于基于贝塞尔的矩形和三角形斑块,使用角控制顶点。

每顶点细化速率控制。 应用程序可以选择为每个顶点提供一个正浮点值,可用于控制分割速率。 这是使用 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 

顶点管道