Compartilhar via


Combinação de geometria (Direct3D 9)

O Direct3D permite que um aplicativo aumente o realismo de suas cenas renderizando objetos poligonais segmentados - especialmente caracteres - que têm articulações suavemente combinadas. Esses efeitos são frequentemente chamados de esfoliação. O sistema obtém esse efeito aplicando matrizes de transformação de mundo adicionais a um único conjunto de vértices para criar vários resultados e, em seguida, executando uma mistura linear entre os vértices resultantes para criar um único conjunto de geometria para renderização. A ilustração a seguir de uma banana mostra esse processo.

ilustração do processo para mesclar dois objetos com textura de banana

A ilustração anterior mostra como você pode imaginar o processo de mesclagem de geometria. Em uma única chamada de renderização, o sistema pega os vértices para a banana, transforma-os duas vezes - uma vez sem modificação, e uma vez com uma rotação simples - e mistura os resultados para criar uma banana dobrada. O sistema combina a posição do vértice, bem como o vértice normal quando a iluminação está habilitada. Os aplicativos não estão limitados a dois caminhos de mesclagem; O Direct3D pode misturar geometria entre até quatro matrizes de mundo, incluindo a matriz de mundo padrão, D3DTS_WORLD.

Observação

Quando a iluminação está habilitada, os normais de vértice são transformados por uma matriz inversa de exibição de mundo correspondente, ponderada da mesma forma que os cálculos de posição do vértice. O sistema normaliza o vetor normal resultante se o estado de renderização D3DRS_NORMALIZENORMALS estiver definido como TRUE.

 

Sem a mesclagem de geometria, os modelos articulados dinâmicos geralmente são renderizados em segmentos. Por exemplo, considere um modelo 3D do braço humano. Na exibição mais simples, um braço tem duas partes: o braço superior que se conecta ao corpo e o braço inferior, que se conecta à mão. Os dois estão conectados no cotovelo, e o braço inferior gira nesse ponto. Um aplicativo que renderiza um braço pode reter dados de vértice para o braço superior e inferior, cada um com uma matriz de transformação de mundo separada. O exemplo de código a seguir ilustra isso.

typedef struct _Arm
{
    VERTEX upper_arm_verts[200];
    D3DMATRIX matWorld_Upper;

    VERTEX lower_arm_verts[200];
    D3DMATRIX matWorld_Lower;
} ARM, *LPARM;

ARM MyArm; // This needs to be initialized.

Para renderizar o braço, duas chamadas de renderização são feitas, conforme mostrado no código a seguir.

// Render the upper arm.
d3dDevice->SetTransform( D3DTS_WORLD, &MyArm.matWorld_Upper );
d3dDevice->DrawPrimitive( D3DPT_TRIANGLELIST, 0, numFaces );

// Render the lower arm, updating its world matrix to articulate
// the arm by pi/4 radians (45 degrees) at the elbow.
MyArm.matWorld_Lower = RotateMyArm(MyArm.matWorld, pi/4);
d3dDevice->SetTransform( D3DTS_WORLD, &MyArm.matWorld_Lower );
d3dDevice->DrawPrimitive( D3DPT_TRIANGLELIST, 0, numFaces );

A ilustração a seguir é uma banana, modificada para usar essa técnica.

ilustração de uma banana combinada sem mesclagem de geometria

As diferenças entre a geometria combinada e a geometria não se sobressaída são óbvias. Este exemplo é um pouco extremo. Em um aplicativo do mundo real, as articulações de modelos segmentados são projetadas para que as costuras não sejam tão óbvias. No entanto, as costuras são visíveis às vezes, o que apresenta desafios constantes para designers de modelo.

A mesclagem de geometria no Direct3D apresenta uma alternativa ao cenário clássico de modelagem segmentada. No entanto, a qualidade visual aprimorada dos objetos segmentados tem o custo da mesclagem de cálculos durante a renderização. Para minimizar o impacto dessas operações adicionais, o pipeline de geometria direct3D é otimizado para combinar geometria com a sobrecarga menos possível. Aplicativos que usam de forma inteligente os serviços de mesclagem de geometria oferecidos pelo Direct3D podem melhorar o realismo de seus caracteres, evitando sérias repercussões de desempenho.

Mesclando estados de transformação e renderização

O método IDirect3DDevice9::SetTransform reconhece as macros D3DTS_WORLD e D3DTS_WORLDn , que correspondem aos valores que podem ser definidos pela macro D3DTS_WORLDMATRIX . Essas macros são usadas para identificar as matrizes entre as quais a geometria será combinada.

O tipo enumerado D3DRENDERSTATETYPE inclui o estado de renderização D3DRS_VERTEXBLEND para habilitar e controlar a mesclagem de geometria. Os valores válidos para esse estado de renderização são definidos pelo tipo enumerado D3DVERTEXBLENDFLAGS . Se a mesclagem de geometria estiver habilitada, o formato de vértice deverá incluir o número apropriado de pesos de mesclagem.

Misturando pesos

Um peso de mesclagem, às vezes chamado de peso beta, controla até que ponto uma determinada matriz mundial afeta um vértice. Os pesos de mesclagem são valores de ponto flutuante que variam de 0,0 a 1,0, codificados no formato de vértice, em que um valor de 0,0 significa que o vértice não é combinado com essa matriz e 1,0 significa que o vértice é afetado na íntegra pela matriz.

Os pesos de mesclagem de geometria são codificados no formato de vértice, aparecendo imediatamente após a posição de cada vértice, conforme descrito em Códigos FVF de Função Fixa (Direct3D 9). Você comunica o número de pesos de mesclagem no formato de vértice, incluindo uma das constantes FVF na descrição do vértice que você fornece aos métodos de renderização.

O sistema executa uma mistura linear entre os resultados ponderados das matrizes de mesclagem. A equação a seguir é a fórmula de mesclagem completa.

equação de mesclagem linear, usando matrizes de transformação do mundo

Na equação anterior, vBlend é o vértice de saída, os elementos v são os vértices produzidos pela matriz mundial aplicada (D3DTS_WORLDn). Os elementos W são os valores de peso correspondentes dentro do formato de vértice. Um vértice misturado entre n matrizes pode ter - 1 valores de peso de mesclagem, um para cada matriz de mesclagem, exceto o último. O sistema gera automaticamente o peso da última matriz mundial para que a soma de todos os pesos seja 1,0, expressa na notação sigma aqui. Essa fórmula pode ser simplificada para cada um dos casos com suporte do Direct3D, que é mostrado nas equações a seguir.

equações de mesclagem linear para três casos de mesclagem

Estas são as formas simplificadas da fórmula de mesclagem completa para os dois, três e quatro casos de matriz de mesclagem.

Observação

Embora o Direct3D inclua descritores FVF para definir vértices que contêm até cinco pesos de mesclagem, apenas três podem ser usados nesta versão do DirectX.

 

Informações adicionais estão contidas nos tópicos a seguir.

Pipeline de vértice