Mosaico (Direct3D 9)

Unidade tessellator

A unidade de mosaico foi aprimorada. Agora você pode usá-lo para:

  • Executar mosaico adaptável de todos os primitivos de ordem superior.
  • Pesquise valores de deslocamento por vértice de um mapa de deslocamento e passe-os para um sombreador de vértice.
  • Suporte ao mosaico retângulo-patch. Isso é especificado por meio de uma declaração de vértice usando D3DDECLMETHOD_PARTIALU ou D3DDECLMETHOD_PARTIALV. Se uma declaração de vértice que contém 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 alteração no tipo de grau afetou duas outras 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 forem compilados com os novos cabeçalhos. Nenhuma funcionalidade precisa ser alterada.

Mosaico Adaptável

O mosaico adaptável pode ser aplicado a primitivos de alta ordem, incluindo N-patches, patches de retângulo e patches de triângulo. Esse recurso é habilitado pelo D3DRS_ENABLEADAPTIVETESSELLATION e mosaica adaptável um patch, com base no valor de profundidade do vértice de controle no espaço dos olhos.

As coordenadas z (Zi) de 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). Esse 4 vetor pode ser a terceira coluna do mundo concatenado e exibir matrizes. Ele também pode ser usado para aplicar uma escala ao Zieye.

A função para calcular um nível de mosaico Ti de Zieye é considerada (MaxTessellationLevel/Zieye), o que significa que MaxTessellationLevel é o nível de mosaico em Z = 1 no espaço dos olhos. O MaxTessellationLevel é igual a um valor definido por IDirect3DDevice9::SetNPatchMode para N-patches e, para patches RT, é igual a pNumSegs. O nível de mosaico é 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 mosaico a serem fixados. Os Ti's para cada vértice ao longo de uma borda de um patch são médios para obter um nível de mosaico para essa borda. O algoritmo para calcular Ti para patches de retângulo, patches de triângulo e N-patches difere em quais vértices de controle são usados para calcular o nível de mosaico.

Para os patches de retângulo com uma base B-spline, os quatro vértices de controle mais externos são usados. Por exemplo, com D3DORDER_CUBIC ordem: vértices (1,1) e (1,largura-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 (altura-2,largura-2) e (1,largura-2) são usados com pNumSegs[2], e vértices (2,1) e (1,1) são usados com pNumSegs[3].

Para os patches de triângulo, os vértices de patch 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 de triângulo são usados.

Para os patches de retângulo e triângulo com base em Bézier, os vértices de controle de canto são usados.

Controle de taxa de mosaico por vértice. Opcionalmente, um aplicativo pode fornecer um único valor de ponto flutuante positivo por vértice, que pode ser usado para controlar a taxa de mosaico. 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 mosaico por vértice.

Matemática

O nível de mosaico (Te) para uma borda e, representado por dois vértices de controle (Ve1, Ve2), é calculado conforme 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, faixas) são desenhados como N-patches, IDirect3DDevice9::SetNPatchMode tem valor definido menor que 1,0.

Alterações de 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 

Novas tampas de hardware:

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

Pipeline de vértice