Compartilhar via


Transferência de radiação pré-compilada (Direct3D 9)

Usando a transferência de radiação pré-compilada

Há várias formas de complexidade presentes em cenas interessantes, incluindo como o ambiente de iluminação é modelado (ou seja, modelos de iluminação de área versus os de ponto/direcional) e que tipo de efeitos globais são modelados (por exemplo, sombras, interreflexões, dispersão subsuperficial).) As técnicas de renderização interativas tradicionais modelam uma quantidade limitada dessa complexidade. O PRT habilita esses efeitos com algumas restrições significativas:

  • Supõe-se que os objetos sejam rígidos (ou seja, sem deformações).
  • É uma abordagem centrada em objeto (a menos que objetos sejam movidos juntos, esses efeitos globais não são mantidos entre eles).
  • Somente a iluminação de baixa frequência é modelada (resultando em sombras suaves).) Para luzes de alta frequência (sombras afiadas), as técnicas tradicionais teriam que ser empregadas.

O PRT requer um dos seguintes, mas não ambos:

  • modelos altamente mosaicos e vs_1_1
  • ps_2_0

Iluminação Difusa Padrão versus PRT

A ilustração a seguir é renderizada usando o modelo de iluminação tradicional (n · l). Sombras afiadas podem ser habilitadas usando outra passagem e alguma forma de técnica de sombreamento (mapas de profundidade de sombra ou volumes de sombra). Adicionar várias luzes exigiria várias passagens (se as sombras forem usadas) ou sombreadores mais complexos com técnicas tradicionais.

captura de tela de uma ilustração renderizada usando o modelo de iluminação tradicional

A próxima ilustração é renderizada com PRT usando a melhor aproximação de uma única luz direcional que pode resolve. Isso resulta em sombras suaves que seriam difíceis de produzir com técnicas tradicionais. Como o PRT sempre modela ambientes de iluminação completos adicionando várias luzes ou usando um mapa de ambiente, você só alteraria os valores (mas não o número) de constantes usadas pelo sombreador.

captura de tela de uma ilustração renderizada usando prt

PRT com Interreflexões

A iluminação direta atinge a superfície diretamente da luz. Interreflexões são luz atingindo a superfície depois de saltar para fora de alguma outra superfície algumas vezes. O PRT pode modelar esse comportamento sem alterar o desempenho em tempo de execução simplesmente executando o simulador com parâmetros diferentes.

A ilustração a seguir é criada usando somente PRT direto (0 saltos sem interreflexões).

captura de tela de uma ilustração renderizada usando somente prt direto

A ilustração a seguir é criada usando PRT com interreflexões (2 saltos com interreflexões).

captura de tela de uma ilustração renderizada usando prt com interreflexões

PRT com dispersão de subsuperfície

A dispersão subsuperficial é uma técnica que modela como a luz passa por determinados materiais. Por exemplo, pressione uma lanterna acesa contra a palma da mão. A luz da lanterna passa pela mão, salta ao redor (alterando a cor no processo) e sai do outro lado da mão. Isso também pode ser modelado com alterações simples no simulador e nenhuma alteração no runtime.

A ilustração a seguir demonstra PRT com dispersão subsuperficial.

captura de tela de uma ilustração renderizada usando prt com dispersão subsuperficial

Como o PRT funciona

Os termos a seguir são úteis para entender como o PRT funciona, conforme ilustrado no diagrama a seguir.

Radiação de origem: o radiação de origem representa o ambiente de iluminação como um todo. No PRT, um ambiente arbitrário é aproximado usando a base harmônica esférica – essa iluminação é considerada distante em relação ao objeto (a mesma suposição feita com mapas de ambiente.)

Radiação de saída: o radiamento de saída é a luz que sai de um ponto na superfície de qualquer fonte possível (radiação refletida, dispersão subsuperficial, emissão).

Transferir vetores: os vetores de transferência mapeiam a Radiação de Origem para a radiação de saída e são pré-compilados offline usando uma simulação de transporte de luz complexa.

diagrama de como o prt funciona

O PRT fatora o processo de renderização em dois estágios, conforme mostrado no diagrama a seguir:

  1. Uma simulação de transporte leve cara pré-compila coeficientes de transferência que podem ser usados em tempo de execução.
  2. Um estágio de tempo de execução relativamente leve aproxima primeiro o ambiente de iluminação usando a base harmônica esférica e, em seguida, usa esses coeficientes de iluminação e os coeficientes de transferência pré-compilados (do estágio 1) com um sombreador simples, resultando em radiação de saída (a luz saindo do objeto).

diagrama do fluxo de dados prt

Como usar a API prt

  1. Compute os vetores de transferência com um dos cálculos... métodos de ID3DXPRTEngine.

    Lidar diretamente com esses vetores de transferência requer uma quantidade significativa de computação de memória e sombreador. A compactação reduz significativamente a quantidade de memória e a computação de sombreador necessária.

    Os valores finais de iluminação são calculados em um sombreador de vértice que implementa a seguinte equação de renderização compactada.

    equação de renderização prt

    Em que:

    Parâmetro Descrição
    Rp Um único canal de radiação de saída no vértice p e é avaliado em cada vértice na malha.
    Mk A média para o cluster k. Esse é um vetor Order² de coeficientes.
    k A ID do cluster para o vértice p.
    L' A aproximação do radiamento de origem nas funções de base SH. Esse é um vetor Order² de coeficientes.
    j Um inteiro que soma o número de vetores PCA.
    wpj O peso JTH PCA para o ponto p. Esse é um único coeficiente.
    Bkj O vetor de base jth PCA para cluster k. Esse é um vetor Order² de coeficientes.

     

    O Extração... os métodos de ID3DXPRTCompBuffer fornecem acesso a dados compactados da simulação.

  2. Compute o radiance de origem.

    Há várias funções auxiliares na API para lidar com uma variedade de cenários comuns de iluminação.

    Função Finalidade
    D3DXSHEvalDirectionalLight Aproxima uma luz direcional convencional.
    D3DXSHEvalSphericalLight Aproxima fontes de luz esféricas locais. (Observe que o PRT funciona apenas com ambientes de iluminação à distância.)
    D3DXSHEvalConeLight Aproxima uma fonte de luz de área distante. Um exemplo seria o sol (ângulo de cone muito pequeno).
    D3DXSHEvalHemisphereLight Avalia uma luz que é uma interpolação linear entre duas cores (uma em cada poste de uma esfera).

     

  3. Compute o radiação de saída.

    A equação 1 agora precisa ser avaliada em cada ponto usando um sombreador de vértice ou pixel. Antes que o sombreador possa ser avaliado, as constantes precisam ser pré-compilados e carregados na tabela constante (consulte o Exemplo de Demonstração de PRT para obter detalhes). O sombreador em si é uma implementação simples dessa equação.

    struct VS_OUTPUT
    {
        float4 Position   : POSITION;   // vertex position 
        float2 TextureUV  : TEXCOORD0;  // vertex texture coordinates 
        float4 Diffuse    : COLOR0;     // vertex diffuse color
    };
    
    VS_OUTPUT Output;   
    Output.Position = mul(vPos, mWorldViewProjection);
    
    float4 vExitR = float4(0,0,0,0);
    float4 vExitG = float4(0,0,0,0);
    float4 vExitB = float4(0,0,0,0);
    
    for (int i=0; i < (NUM_PCA_VECTORS/4); i++) 
    {
       vExitR += vPCAWeights[i] * 
           vClusteredPCA[iClusterOffset+i+1+(NUM_PCA_VECTORS/4)*0];
       vExitG += vPCAWeights[i] * 
           vClusteredPCA[iClusterOffset+i+1+(NUM_PCA_VECTORS/4)*1];
       vExitB += vPCAWeights[i] * 
           vClusteredPCA[iClusterOffset+i+1+(NUM_PCA_VECTORS/4)*2];
    }
    
    float4 vExitRadiance = vClusteredPCA[iClusterOffset];
    vExitRadiance.r += dot(vExitR,1);
    vExitRadiance.g += dot(vExitG,1);
    vExitRadiance.b += dot(vExitB,1);
    
    Output.Diffuse = vExitRadiance;
    

Referências

Para obter mais informações sobre PRT e harmônicos esféricos, consulte os seguintes artigos:

Precomputed Radiance Transfer for Real-Time Rendering in Dynamic, 
Low-Frequency Lighting Environments 
P.-P. Sloan, J. Kautz, J. Snyder
SIGGRAPH 2002 

Clustered Principal Components for Precomputed Radiance Transfer 
P.-P. Sloan, J. Hall, J. Hart, J. Snyder 
SIGGRAPH 2003 

Efficient Evaluation of Irradiance Environment Maps 
P.-P. Sloan 
ShaderX 2,  W. Engel 

Spherical Harmonic Lighting: The Gritty Details 
R. Green 
GDC 2003 

An Efficient Representation for Irradiance Environment Maps 
R. Ramamoorthi, P. Hanrahan 

A Practical Model for Subsurface Light Transport 
H. W. Jensen, S. R. Marschner, M. Levoy, and P. Hanrahan 
SIGGRAPH 2001 

Bi-Scale Radiance Transfer 
P.-P. Sloan, X. Liu, H.-Y. Shum, J. Snyder
SIGGRAPH 2003 

Fast, Arbitrary BRDF Shading for Low-Frequency Lighting Using Spherical 
Harmonics 
J. Kautz, P.-P. Sloan, J. Snyder
12th Eurographics Workshop on Rendering 

Precomputing Interactive Dynamic Deformable Scenes 
D. James, K. Fatahalian 
SIGGRAPH 2003 

All-Frequency Shadows Using Non-linear Wavelet Lighting Approximation 
R. Ng, R. Ramamoorth, P. Hanrahan 
SIGGRAPH 2003 

Matrix Radiance Transfer 
J. Lehtinen, J. Kautz
SIGGRAPH 2003 

Math World 
E. W. Weisstein, Wolfram Research, Inc. 

Quantum Theory of Angular Momentum 
D. A. Varshalovich, A.N. Moskalev, V.K. Khersonskii 

Tópicos Avançados

Equações prt (Direct3D 9)

Representando PRT com texturas (Direct3D 9)

ID3DXPRTBuffer

ID3DXPRTCompBuffer

ID3DXPRTEngine

ID3DXTextureGutterHelper

Funções de transferência de radiação pré-compiladas

Funções Matemáticas