Usando UVAtlas (Direct3D 9)
Observação
UVAtlas foi originalmente enviado na biblioteca de utilidade D3DX9 agora preterida. A versão mais recente está disponível na UV Atlas Command-Line Tool (uvatlas.exe).
Muitas técnicas de renderização e geração de conteúdo exigem um mapa exclusivo e não sobreposto de um sinal 2D (como uma textura) em uma malha. Essas técnicas incluem:
- Mapeamento normal/deslocamento
- Simulações de PRT de espaço de textura e mapas de luz
- Pintura de superfície
- Iluminação de espaço de textura
Gerar um mapeamento UV exclusivo manualmente geralmente é demorado e entediante; isso é especialmente verdadeiro quando a geometria de entrada é complexa e a utilização de espaço de textura eficiente/de baixa distorção é desejada. A ilustração a seguir mostra uma malha de exemplo e seu atlas de textura correspondente.
Este exemplo mostra uma malha (à esquerda) e o mapa normal de espaço UV correspondente (à direita). Observe que o atlas de textura contém vários grupos ou clusters de dados; cada cluster é chamado de gráfico e, no exemplo acima, exibe os dados normais de uma parte da malha.
As APIs D3DX UVAtlas geram automaticamente um atlas de textura ideal e não sobreposto. As APIs fornecem parâmetros de entrada que permitem:
- Minimize o alongamento de textura, distorção e subamostramento.
- Maximizar a densidade de empacotamento de espaço de textura para uso eficiente da memória.
- Forneça uma amostragem uniforme na malha, minimizando descontinuidades na frequência de amostragem.
Como funciona o UVAtlas
As APIs UVAtlas (consulte UVAtlas Functions) geram um atlas de textura particionando uma superfície em gráficos e empacotando os gráficos em um atlas de textura. Use D3DXUVAtlasPartition e D3DXUVAtlasPack para executar essas etapas separadamente; ou use D3DXUVAtlasCriar para particionar, parametrizar e empacotar em uma única chamada.
- Particionamento e parametrização de uma malha
- Usando tensores de métrica integrados para controlar a parametrização
- Usando dados de adjacência para vincos especificados pelo usuário
- Empacotando gráficos em um Atlas
Particionamento e parametrização de uma malha
Primeiro, a malha é particionada em gráficos e, em seguida, cada gráfico é parametrizado em seu próprio espaço UV [0,1]. Um cilindro pode ser parametrizado por um gráfico; uma esfera, por outro lado, exigirá dois gráficos, conforme mostrado na ilustração a seguir.
Uma malha que pode ser parametrizada com um único gráfico é classificada como "homeomórfica para um disco", o que significa que você pode espalhar um disco infinitamente flexível e infinitamente elástico sobre o gráfico e cobrir perfeitamente a geometria. Esse alongamento, chamado de homeomorfismo, é uma função bidirecional; o que significa que você pode ir de uma parametrização para a outra sem perder informações.
Poucas malhas do mundo real podem ser parametrizadas em duas dimensões sem separar a malha em clusters ou gráficos. A ilustração a seguir mostra outra malha de exemplo e seu atlas de textura correspondente.
Há dois parâmetros que determinam o número de gráficos criados:
- O número máximo de gráficos permitidos para o atlas
- A quantidade máxima de alongamento permitida para cada gráfico
A quantidade de alongamento determinará o número de gráficos gerados e a qualidade geral da amostragem. O trecho varia de 0,0 (sem estiramento) a 1,0 (qualquer quantidade de estiramento). D3DXUVAtlasCreate e D3DXUVAtlasPartition retornam o trecho máximo gerado pelo algoritmo. A ilustração a seguir mostra outra malha de exemplo e seu atlas de textura correspondente.
Usando tensores de métrica integrados para controlar a parametrização
A priorização de espaço de textura pode ser especificada por triângulo. Tensores de Métrica Integrados podem ser fornecidos para controlar como os triângulos são estendidos no atlas de espaço de textura resultante. IMTs podem ser especificados diretamente ou calculados com base em um sinal de entrada usando as funções de computação D3DX IMT. Um tensor de métrica integrado (ou IMT) é uma matriz 2x2 simétrica que descreve como um triângulo é estendido no atlas. Cada IMT é definido por 3 floats, chame-os (a,b,c). Eles podem ser organizados em uma matriz 2x2 simétrica como esta:
a b
b c
Em seguida, o IMT pode ser usado para localizar a distância entre dois vetores. Considerando dois vetores v1 e v2, em que :
vector v1
vector v2 = v1 + (s,t)
A distância entre v1 e v2 pode ser calculada como:
sqrt((s, t) * M * (s, t)^T)
Em outras palavras, o vetor (s,t) pode ser a magnitude do trecho em uma direção arbitrária no espaço u-v. Nesse caso, o vetor s é uma direção do primeiro para o segundo vértice e t é o produto cruzado do normal e s. Por exemplo:
(1,1) * (1,1) = (2,2)
(1,1)
IMT(1,1,1) scales by 2
(1,-1) * (1,1) = (0,0)
(1,1)
IMT(2,0,2) scales by 2 with no shearing
IMTs podem ser especificados diretamente ou computados com base em um sinal de entrada usando as funções de computação D3DX IMT: D3DXComputeIMTFromPerVertexSignal, D3DXComputeIMTFromPerTexelSignal, D3DXComputeIMTFromSignal e D3DXComputeIMTFromTexture_graphics.
Especifique os dados IMT diretamente se você quiser controlar como o espaço de textura é alocado para triângulos individuais. Ao fazer isso, aloque mais área no atlas para áreas importantes de uma malha (como o rosto ou logotipo do peito de um personagem, ou regiões de uma cena perto do caminho de caminhada de um jogador). Ao especificar IMTs que são múltiplos da matriz de identidade, os triângulos resultantes serão dimensionados uniformemente no espaço de textura.
Por exemplo, dado um mapa normal de alta resolução, você pode calcular a IMT para fornecer mais espaço de textura para áreas de sinal de maior frequência no mapa normal. Triângulos "planos" (mapeados para regiões constantes do mapa normal original) receberão menos espaço de textura. Triângulos que contêm uma grande quantidade de detalhes de mapa normal receberão mais área de textura no resultado final. Em seguida, você pode ressamploar o mapa normal em uma textura menor, mas manter detalhes, ou você pode recomputar o mapa normal com o mapeamento UV mais ideal.
Usando dados de adjacência para vincos especificados pelo usuário
As informações de adjacência definidas pelo usuário podem ser fornecidas à função de particionamento para descrever os vincos predefinidos na malha e, portanto, definir um limite de gráfico entre rostos adjacentes. Essa é uma maneira simples de o chamador especificar seu próprio particionamento de gráfico como entrada no algoritmo, o que refinará ainda mais os gráficos para colocar o trecho abaixo do máximo permitido.
Exemplo
Este exemplo ilustra como você pode usar as APIs UVAtlas e o Visualizador do DirectX (Dxviewer.exe) para localizar e corrigir descontinuidades em seu modelo que podem afetar drasticamente o tamanho do atlas de textura. Você pode obter Dxviewer.exe e aprender sobre isso no SDK do DirectX. Dxviewer.exe foi removido do SDK do DirectX após a versão de agosto de 2009, portanto, para obtê-lo, você precisará pelo menos do SDK do DirectX de agosto de 2009. Para obter informações sobre o SDK do DirectX, consulte Onde está o SDK do DirectX?.
Suponha que você começou com algum modelo em seu software de geração de conteúdo favorito (este exemplo usa um modelo de cabeça anão que foi criado em Maya). Exporte o modelo texturizado para um arquivo .x e crie um atlas de textura com D3DXUVAtlasCreate. O atlas de textura resultante seria semelhante à ilustração a seguir.
O atlas tem 22 gráficos e um trecho máximo de 0,994.
Agora, examine o modelo texturizado para ver o quanto o atlas de textura é mapeado para a geometria. Para fazer isso, carregue o modelo na ferramenta visualizador:
- Abra a ferramenta visualizador dos Utilitários DirectX.
- Carregue o arquivo .x clicando no botão Abrir.
- Habilitando a opção de visualização de vincos clicando no botão de exibição e selecionando Vincos no pop-up.
A ilustração a seguir mostra o que você deve ver na ferramenta visualizador.
Cada linha é um vinco que é uma borda adjacente entre dois gráficos no atlas de textura. O número de gráficos gerados pelo algoritmo é causado por pequenas diferenças, talvez devido a descontinuações nos normais. Essas pequenas diferenças podem ser reduzidas por dados de soldagem, ou seja, forçando dados quase iguais a serem iguais. Para soldar os normais e os pesos de pele:
- Execute a ferramenta DirectX Ops (dxops.exe) com a seguinte linha de comando na malha (substituindo 'modelName.x' pelo nome do modelo):
Dxops.exe -s "load 'modelName.x'; Optimize n:2.01 w:2.01 uv0:0.01; save 'newModelName.x';"
Isso compara os valores normais e skinweights e, quando eles diferem em valor inferior a 2,01, os dados são iguais. As ilustrações a seguir mostram um close-up do olho para ver os vincos antes da soldagem (à esquerda) e os vincos após a soldagem (à direita):
Figura 7: Removendo vincos por soldagem
Neste exemplo, a soldagem removeu 86 vértices da malha de entrada. Com menos vincos na malha, você pode regenerar o atlas, como mostra a ilustração a seguir.
O atlas tem apenas 7 gráficos e um trecho máximo de aproximadamente 0,0776. O novo atlas agora se encaixa em uma textura menor (aproximadamente 30% menor neste exemplo).
Empacotando gráficos em um atlas
Depois que uma malha é particionada em gráficos individualmente parametrizados, os gráficos precisam ser empacotados com eficiência em um único mapa de textura. Isso é executado como a segunda etapa de D3DXUVAtlasCreate ou pode ser invocado explicitamente chamando D3DXUVAtlasPack.
Os gráficos empacotados são separados por uma largura de medianiz especificada pelo usuário. A largura da medianiz é a quantidade de separação entre gráficos e permite a interpolação bilinear e o mapeamento de mip para evitar a renderização de artefatos nos limites do gráfico. O D3DX fornece uma interface para preencher automaticamente essas sarjetas – consulte ID3DXTextureGutterHelper para obter mais informações.
Integrando UVAtlas ao pipeline
Além de serem invocadas pelo artista antes da pintura de textura, essas funções podem ser integradas a um pipeline de arte automatizado. Por exemplo, uma chamada UVAtlas pode ser emitida automaticamente depois que um ativo é atualizado, antes de executar uma simulação de PRT ou uma passagem de mapeamento normal. Isso evita a necessidade de reparar manualmente o mapeamento UV de um objeto se a topologia da malha tiver sido modificada.
Consulte a Uv Atlas Command-Line Tool (uvatlas.exe) para obter, por exemplo, o uso das funções UVAtlas.
Tópicos relacionados