Partilhar via


Tesselação (Direct3D 9)

Unidade Tessellator

A unidade tessellator foi melhorada. Agora você pode usá-lo para:

  • Execute tesselação adaptativa de todas as primitivas de ordem superior.
  • Procure valores de deslocamento por vértice de um mapa de deslocamento e passe-os para um sombreador de vértice.
  • Suporte a tesselação de adesivos retangulares. Isso é especificado através de uma declaração de vértice usando D3DDECLMETHOD_PARTIALU ou D3DDECLMETHOD_PARTIALV. Se uma declaração de vértice contendo esses métodos for usada para desenhar um patch de triângulo, IDirect3DDevice9::D rawTriPatch falhará. Para obter mais informações sobre declarações de vértice, consulte D3DVERTEXELEMENT9.

No DirectX 8.x, o que era chamado de ORDER era realmente o grau. No Direct3D 9, o grau agora é especificado por 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; 

A mudança no tipo de grau afetou outras duas estruturas.

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; 

Os drivers precisam corrigir erros de compilação que resultarão dessa alteração quando compilarem com os novos cabeçalhos. Nenhuma funcionalidade precisa ser alterada.

Tesselação adaptativa

A tesselação adaptativa pode ser aplicada a primitivas de alta ordem, incluindo N-patches, retangulares e triangulares. Este recurso é ativado pelo D3DRS_ENABLEADAPTIVETESSELLATION e testa adaptativamente um patch, com base no valor de profundidade do vértice de controle no espaço ocular.

As coordenadas z (Zi) dos vértices de controle (Vi), que são transformadas em espaço ocular (Zieye) executando um produto de ponto com um vetor 4, são usadas como valores de profundidade. O vetor 4D (Mdm) é especificado pelo aplicativo usando quatro estados de renderização (D3DRS_ADAPTIVETESS_X, D3DRS_ADAPTIVETESS_Y, D3DRS_ADAPTIVETESS_Z e D3DRS_ADAPTIVETESS_W). Este vetor 4 poderia ser a terceira coluna do mundo concatenado e matrizes de visão. Também pode ser usado para aplicar uma escala ao Zieye.

A função para calcular um nível de tesselação Ti de Zieye é assumida como sendo (MaxTessellationLevel/Zieye), o que significa que o MaxTessellationLevel é o nível de tesselação em Z = 1 no espaço ocular. O MaxTessellationLevel é igual a um valor definido por IDirect3DDevice9::SetNPatchMode para N-patches e, para RT-patches, é igual a pNumSegs. O nível de tesselação é então fixado a valores, definidos pelos dois estados de renderização adicionais D3DRS_MINTESSELLATIONLEVEL e D3DRS_MAXTESSELLATIONLEVEL, que definem os níveis mínimo e máximo de tesselação a serem fixados. Os Ti para cada vértice ao longo de uma aresta de um remendo são calculados em média para obter um nível de tesselação para essa aresta. O algoritmo para calcular Ti para retangulares, remendos de triângulos e N-patches difere em quais vértices de controle são usados para calcular o nível de tesselação.

Para os retangos com base em B-spline, são utilizados os quatro vértices de controlo mais exteriores. Por exemplo, com D3DORDER_CUBIC ordem: vértices (1,1) e (1,width-2) são usados com pNumSegs[0], vértices (1,width-2) e (height-2,height-2) são usados com pNumSegs[1], vértices (height-2,width-2) e (1,width-2) são usados com pNumSegs[2], e vértices (2,1) e (1,1) são usados com pNumSegs[3].

Para as manchas de triângulo, os vértices de remendo de canto são usados. Com D3DORDER_CUBIC ordem: vértices (0) e (9) são usados com pNumSegs[0], vértices (9) e (6) são usados com pNumSegs[1] e vértices (6) e (0) são usados com pNumSegs[3].

Para N-patches, os vértices triângulos são usados.

Para os retângulos e remendos triangulares com base em Bezier, utilizam-se os vértices de controlo de canto.

Controle da taxa de tesselação por vértice. Uma aplicação pode, opcionalmente, fornecer um único valor positivo de ponto flutuante por vértice, que pode ser usado para controlar a taxa de tesselação. Isso é fornecido usando o D3DDECLUSAGE_TESSFACTOR, para o qual o índice de uso deve ser 0 e o tipo de entrada deve ser D3DDECLTYPE_FLOAT1. Isso é multiplicado para o nível de tesselação por vértice.

Matemática

O nível de tesselação (Te) para uma aresta e, representado por dois vértices de controle (Ve1, Ve2), é calculado como mostrado abaixo:

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 

Quando D3DRS_ENABLEADAPTIVETESSELLATION é TRUE, primitivos de triângulo (listas de triângulos, ventiladores, tiras) são desenhados como N-patches, IDirect3DDevice9::SetNPatchMode tem valor definido inferior a 1.0.

Alterações na API

Novos estados de renderização:

 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 

E seus valores padrão:

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 

Novos limites de hardware:

D3DDEVCAPS2_ADAPTIVETESSRTPATCH // Can adaptively tessellate RT-patches 
D3DDEVCAPS2_ADAPTIVETESSNPATCH  // Can adaptively tessellate N-patches 

Vertex Pipeline