O pipeline de transformação Direct3D
Este artigo fornece uma explicação técnica para os desenvolvedores de aplicativos Direct3D sobre como definir os parâmetros do Pipeline de Transformação Direct3D pela manipulação direta de matrizes Direct3D.
Visão geral
O Direct3D usa três transformações para alterar suas coordenadas de modelo 3D em coordenadas de pixel (espaço da tela). Essas transformações são transformação de mundo, transformação de exibição e transformação de projeção.
A transformação mundial controla como as coordenadas do modelo são transformadas em coordenadas do mundo. A transformação mundial pode incluir traduções, rotações e dimensionamentos, mas não se aplica a luzes. Para obter mais informações sobre como trabalhar com transformações mundiais, consulte World Transform.
A transformação de exibição controla a transição das coordenadas do mundo para o "espaço da câmera", determinando a posição da câmera no mundo. Para obter um exemplo de como trabalhar com transformações de exibição, consulte Exibir Transformação.
A transformação de projeção altera a geometria do espaço da câmera em "espaço de recorte" e aplica distorção de perspectiva. O termo "espaço de recorte" refere-se a como a geometria é recortada no volume de exibição durante essa transformação. Para obter um exemplo de como trabalhar com transformações de projeção, consulte Transformação de projeção.
Por fim, a geometria no espaço de recorte é transformada em coordenadas de pixel (espaço na tela). Essa transformação é controlada pelas configurações do visor.
O recorte e a transformação de vértices devem ocorrer em espaço homogêneo (simplesmente, espaço no qual o sistema de coordenadas inclui um quarto elemento), mas o resultado final para a maioria dos aplicativos precisa ser coordenadas tridimensionais não homogêneas (3D) definidas em "espaço de tela". Isso significa que os vértices de entrada e o volume de recorte devem ser convertidos em espaço homogêneo para executar o recorte e, em seguida, convertidos de volta em espaço não homogêneo a ser exibido.
As três transformações do Direct3D, mundo, exibição e transformação de projeção são definidas por matrizes Direct3D. Uma matriz Direct3D é uma matriz homogênea 4x4 definida por uma estrutura D3DMATRIX . Embora as matrizes Direct3D não sejam objetos padrão, elas não são representadas por uma interface COM, você pode criá-las e defini-las da mesma forma que faria com qualquer outro objeto Direct3D. Para obter mais informações sobre matrizes Direct3D, consulte Transformações.
O pipeline de transformação
Se um vértice na coordenada do modelo for dado por Pm = (Xm, Ym, Zm, 1), as transformações mostradas na figura a seguir serão aplicadas às coordenadas da tela de computação Ps = (Xs, Ys, Zs, Ws).
Aqui estão as descrições dos estágios mostrados na figura anterior:
A matriz mundial Mworld transforma vértices do espaço modelo para o espaço mundial. Essa matriz é definida por:
d3dDevice->SetTransform (D3DTRANSFORMSTATE_WORLD, matrix address)
A implementação do Direct3D pressupõe que a última coluna dessa matriz seja (0, 0, 0, 1). Nenhum erro será retornado se o usuário especificar uma matriz com uma última coluna diferente, mas a iluminação e a neblina estarão incorretas.
Exibir matriz Mview transforma vértices do espaço do mundo para o espaço da câmera. Essa matriz é definida por:
d3dDevice->SetTransform (D3DTRANSFORMSTATE_VIEW, matrix address)
A implementação do Direct3D pressupõe que a última coluna dessa matriz seja (0, 0, 0, 1). Nenhum erro será retornado se o usuário especificar uma matriz com a última coluna diferente, mas a iluminação e a neblina estarão incorretas.
Matriz de projeção Mproj transforma vértices do espaço da câmera para o espaço de projeção. Essa matriz é definida por:
d3dDevice->SetTransform (D3DTRANSFORMSTATE_PROJECTION, matrix address)
A última coluna da matriz de projeção deve ser (0, 0, 1, 0) ou (0, 0, a, 0) para efeitos corretos de neblina e iluminação; O formulário (0, 0, 1, 0) é preferencial.
O volume de recorte para todos os pontos Xp = (Xp, Yp, Zp, Wp) no espaço de projeção é definido como:
-Wp < Xp <= Wp -Wp < Yp <= Wp 0 < Zp <= Wp
Todos os pontos que não atenderem a essas equações serão recortados.
Se um volume de exibição for definido como:
- Largura da janela sw-screen no espaço da câmera no plano de recorte próximo
- Altura da janela da tela sh no espaço da câmera no plano de recorte próximo
- Distância de Zn até o plano de recorte próximo ao longo dos eixos Z no espaço da câmera
- Distância Zf até o plano de recorte distante ao longo dos eixos Z no espaço da câmera
em seguida, uma matriz de projeção de perspectiva pode ser escrita da seguinte maneira:
em que Mij são membros do Mproj.
Para a projeção ortogonal que temos:
O Direct3D pressupõe que a matriz de projeção de perspectiva tenha a forma :
Se a matriz de projeção de perspectiva não tiver esse formulário, haverá alguns artefatos. Por exemplo, a neblina da tabela não funcionará.
O Direct3D permite que o usuário altere o volume de clipes da seguinte maneira:
Isso pode ser reescrito como:
em que:
Cx, Cy - dvClipX, dvClipY from D3DVIEWPORT9 Cw, Ch - dvClipWidth, dvClipHeight from D3DVIEWPORT9 Zmin, Zmax - dvMinZ, dvMaxZ from D3DVIEWPORT9
Essa transformação pode fornecer maior precisão e é equivalente a dimensionar e deslocar o volume de recorte.
A matriz mclip correspondente é:
Um vértice é transformado por:
dvClipWidth = 2 dvClipHeight = 2 dvClipX = -1 dvClipY = 1 dvMinZ = 0 dvMaxZ = 1
Se você não quiser dimensionar o volume de clipes, poderá definir parâmetros de visor como valores padrão:
(Xc, Yc, Zc, Wc) = (Xp, Yp, Zp, Wp) * Mclip
O estágio de recorte será opcional se o usuário especificar o sinalizador D3DDP_DONOTCLIP em uma chamada DrawPrimitive. Nesse caso, todas as matrizes (incluindo Mvs) podem ser combinadas.
A matriz de escala do visor Mvs dimensiona as coordenadas para estar dentro da janela do visor e inverte o eixo Y de cima para baixo:
em que:
dwX, dwY - viewport offsets in pixels from D3DVIEWPORT9 dwWidth, dwHeight - viewport width and height in pixels from D3DVIEWPORT9
Por fim, as coordenadas de tela são computadas e passadas para o rasterizador:
Dicas de uso
Aqui estão algumas dicas de como usar o Pipeline de Transformação Direct3D:
A última coluna do mundo e as matrizes de exibição devem ser (0, 0, 0, 1) ou a iluminação estará incorreta.
Defina os parâmetros de visor para criar uma matriz mclip de identidade, a menos que você entenda exatamente para que ela é necessária.
dvClipWidth = 2 dvClipHeight = 2 dvClipX = -1 dvClipY = 1 dvMinZ = 0 dvMaxZ = 1