Compartilhar via


Representando PRT com texturas (Direct3D 9)

O exemplo PRTDemo e o simulador PRTCmdLine incluídos no SDK do DirectX representam vetores de transferência nos vértices de uma malha. Para representar o sinal PRT com precisão, isso pode exigir mosaicos que podem ser impraticáveis para os jogos atuais. Representar vetores de transferência em mapas de textura é uma abordagem alternativa que tem o mesmo custo de dados independente da complexidade da malha. Há várias maneiras de gerar mapas de textura de vetor de transferência usando a Biblioteca D3DX PRT.

Pré-compilar vetores de transferência

Uma abordagem seria modificar as amostras PRTDemo e PRTCmdLine para calcular um vetor de transferência em cada texel em uma parametrização de uma superfície. Para fazer isso:

  1. Modifique a chamada para D3DXCreatePRTEngine para extrair coordenadas de textura da malha (ExtractUVs devem ser TRUE)
  2. Substitua as chamadas D3DXCreatePRTBuffer por D3DXCreatePRTBufferTex usando o mesmo tamanho de textura.

Todos os métodos ID3DXPRTEngine funcionam com simulações por texel, exceto para: ComputeBounceAdaptive, ComputeSSAdaptive, ComputeSS e ComputeDirectLightingSHAdaptive. Embora a simulação de espaço de textura gere o resultado correto, muitas vezes ela pode ser bastante lenta, pois provavelmente estará computando vetores de transferência em alta densidade.

Outra abordagem é calcular uma simulação de PRT adaptável por vértice (com coordenadas de textura que serão usadas para os dados por texel) e, em seguida, chamar ID3DXPRTEngine::ResampleBuffer (usando um buffer de saída criado usando D3DXCreatePRTBufferTex na resolução apropriada). Isso funciona com todas as funcionalidades de PRT D3DX no SDK e geralmente pode ser muito mais eficiente do que calcular diretamente um buffer de transferência por texel.

Cálculos de runtime

Se um único cluster for usado, os resultados poderão ser filtrados e mapeados como qualquer outra textura e o sombreador de pixel for idêntico ao código de sombreador de vértice fornecido com PRTDemo.

Se a compactação gerar vários clusters, você não poderá filtrar ou mipmapar os dados porque clustering índices não são contínuos. Aqui estão algumas alternativas para lidar com dados multi clusterizados:

  • Faça toda a filtragem por conta própria no sombreador de pixel. Infelizmente, isso geralmente é impraticável por motivos de desempenho.
  • Se as texturas forem texturas não mapeadas de mip de baixa resolução (ou seja: mapas de luz), provavelmente será mais eficiente apenas calcular a iluminação diretamente no espaço de textura , onde nenhuma filtragem ocorrerá e renderizar o objeto com uma textura sombreada. Esse é essencialmente um mapa de luz dinâmico que é criado inteiramente na GPU.
  • Se um atlas de textura for usado (consulte Usando UVAtlas (Direct3D 9)), você poderá agrupar manualmente a cena fazendo com que todos os vetores de transferência em um componente conectado no espaço de textura estejam no mesmo cluster. Dessa forma, você pode filtrar a textura porque todos os texels acessados estariam no mesmo cluster por construção. A ID do cluster para um determinado rosto pode ser propagada do sombreador de vértice.

Sombreadores de pixel têm muito menos registros constantes que não podem ser indexados, portanto, o sombreador de pixel é um pouco diferente do sombreador de vértice. Armazenar o trabalho por cluster em uma textura dinâmica de baixa resolução e usar cargas de textura seria a maneira mais eficiente de renderizar ao usar vários clusters.

Transferência de radiação pré-computada

Exemplo de demonstração de PRT

Simulador de PRT (prtcmdline.exe)