Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
O Direct3D permite que uma aplicação aumente o realismo das suas cenas renderizando objetos poligonais segmentados - especialmente personagens - que têm articulações suavemente unidas. Estes efeitos são muitas vezes referidos como esfolamento. O sistema alcança 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.
A ilustração anterior mostra como você pode imaginar o processo de mistura de geometria. Numa única chamada de renderização, o sistema transforma os vértices da banana duas vezes - uma vez sem modificação e outra com uma simples rotação - e combina os resultados para criar uma banana curvada. O sistema combina a posição do vértice, bem como o vértice normal quando a iluminação está ativada. As aplicações não se limitam a dois caminhos de mistura; O Direct3D pode misturar geometria entre até quatro matrizes mundiais, incluindo a matriz mundial padrão, D3DTS_WORLD.
Observação
Quando a iluminação é ativada, as normais de vértice são transformadas por uma matriz de visão de mundo inversa correspondente, ponderada da mesma forma que os cálculos de posição de vértice. O sistema normaliza o vetor normal resultante se o estado de renderização D3DRS_NORMALIZENORMALS estiver definido como TRUE.
Sem a mistura de geometria, os modelos articulados dinâmicos são frequentemente renderizados em segmentos. Por exemplo, considere um modelo 3D do braço humano. Na visão mais simples, um braço tem duas partes: a parte superior do braço, que se conecta ao corpo, e a parte inferior do braço, que se conecta à mão. Os dois estão conectados no cotovelo, e a parte inferior do braço 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 mundial 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 esta técnica.
As diferenças entre a geometria misturada e a geometria não misturada são óbvias. Este exemplo é um pouco extremo. Em uma aplicação do mundo real, as juntas 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 os designers de modelos.
A mistura de geometria no Direct3D apresenta uma alternativa ao cenário clássico de modelagem segmentada. No entanto, a qualidade visual melhorada de objetos segmentados tem o custo dos cálculos de mistura durante a renderização. Para minimizar o impacto dessas operações adicionais, o pipeline de geometria do Direct3D é otimizado para combinar geometria com a menor sobrecarga possível. Os aplicativos que usam de forma inteligente os serviços de mistura de geometria oferecidos pelo Direct3D podem melhorar o realismo de seus personagens, evitando sérias repercussões no desempenho.
Misturando estados de transformação e renderização
O método IDirect3DDevice9::SetTransform reconhece as macros D3DTS_WORLD e D3DTS_WORLDn, que correspondem a valores que podem ser definidos pela macro D3DTS_WORLDMATRIX. Essas macros são usadas para identificar as matrizes entre as quais a geometria será misturada.
O tipo enumerado D3DRENDERSTATETYPE inclui o estado de renderização D3DRS_VERTEXBLEND, que permite e controla a mistura de geometria. Os valores válidos para esse estado de renderização são definidos pelo tipo D3DVERTEXBLENDFLAGS enumerado. Se a mistura de geometria estiver habilitada, o formato de vértice deve incluir o número apropriado de pesos de mistura.
Pesos de mistura
Um peso de mistura, às vezes chamado de peso beta, controla a extensão em que uma dada matriz mundial afeta um vértice. Os pesos de mistura são valores de vírgula flutuante que variam de 0,0 a 1,0, codificados no formato de vértice, onde um valor de 0,0 significa que o vértice não é misturado com essa matriz, e 1,0 significa que o vértice é afetado na íntegra pela matriz.
Os pesos de mistura de geometria são codificados no formato de vértice e aparecem imediatamente após a posição de cada vértice, conforme descrito em Fixed Function FVF Codes (Direct3D 9). Você comunica o número de pesos de mistura no formato de vértice ao incluir uma das constantes FVF, ou, 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 mistura. A equação a seguir é a fórmula de mistura completa.
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 mistura, um para cada matriz de mistura, exceto a última. O sistema gera automaticamente o peso para a última matriz mundial de modo que a soma de todos os pesos é 1,0, expressa em notação sigma aqui. Esta fórmula pode ser simplificada para cada um dos casos suportados pelo Direct3D, que é mostrado nas equações a seguir.
Estas são as formas simplificadas da fórmula de mistura completa para os dois, três e quatro casos de matriz de mistura.
Observação
Embora o Direct3D inclua descritores FVF para definir vértices que contêm até cinco pesos de mistura, apenas três podem ser usados nesta versão do DirectX.
Informações adicionais estão contidas nos tópicos a seguir.
- Usando a fusão de geometria (Direct3D 9)
- Mistura de vértices indexados (Direct3D 9)
- Interpolação de Vértice (Direct3D 9)
Tópicos relacionados