Compartilhar via


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

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

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 pontos/direcionais) 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:

  • Presume-se que os objetos sejam rígidos (ou seja, sem deformações).
  • É uma abordagem centrada em objeto (a menos que os 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 ela pode resolver. 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 iluminada na palma da mão. A luz da lanterna passa pela sua 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 sem alterações no runtime.

A ilustração a seguir demonstra PRT com dispersão de subsuperfície.

captura de tela de uma ilustração renderizada usando prt com de dispersão de subsuperfície

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 brilho 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).)

Radiance exit: o brilho 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: transferir vetores mapeiam Radiação de Origem para o radiamento 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 primeiro aproxima o ambiente de iluminação usando a base harmônica esférica, 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... 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 de iluminação final são calculados em um sombreador de vértice que implementa a seguinte equação de renderização compactada.

    equação de de renderização de prt

    Onde:

    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. Este é um vetor Order² de coeficientes.
    k A ID do cluster para o vértice p.
    L' A aproximação do brilho de origem nas funções de base SH. Este é 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. Este é um único coeficiente.
    Bkj O vetor de base jth PCA para cluster k. Este é um vetor Order² de coeficientes.

     

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

  2. Compute o brilho de origem.

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

    Função Propósito
    D3DXSHEvalDirectionalLight Aproxima uma luz direcional convencional.
    D3DXSHEvalSphericalLight Aproxima fontes de luz esféricas locais. (Observe que o PRT só funciona 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 pólo de uma esfera).

     

  3. Compute o brilho de saída.

    A equação 1 agora precisa ser avaliada em todos os pontos usando um vértice ou sombreador de pixel. Antes que o sombreador possa ser avaliado, as constantes precisam ser pré-computadas e carregadas na tabela constante (consulte o de exemplo de demonstração 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é-computadas

Funções matemáticas