Partilhar via


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

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

Existem 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 modelos pontuais/direcionais) e que tipo de efeitos globais são modelados (por exemplo, sombras, interreflexões, dispersão subsuperficial). As técnicas tradicionais de renderização interativa modelam uma quantidade limitada dessa complexidade. A PRT permite estes efeitos com algumas restrições significativas:

  • Os objetos são assumidos como rígidos (isto é, sem deformações).
  • É uma abordagem centrada em objetos (a menos que os objetos sejam movidos juntos, esses efeitos globais não são mantidos entre eles).
  • Apenas a iluminação de baixa frequência é modelada (resultando em sombras suaves). Para as luzes de alta frequência (sombras nítidas), teriam de ser utilizadas técnicas tradicionais.

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

  • modelos e vs_1_1 altamente tessellated
  • 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 nítidas podem ser ativadas 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 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ê alteraria apenas 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 a luz que atinge a superfície depois de saltar de alguma outra superfície algumas vezes. 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 apenas PRT direto (0 saltos sem interreflexões).

captura de tela de uma ilustração renderizada usando apenas 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 subsuperficial

A dispersão subsuperficial é uma técnica que modela como a luz passa através de determinados materiais. Por exemplo, pressione uma lanterna acesa contra a palma da mão. A luz da lanterna passa pela sua mão, quica (mudando de cor no processo) e sai do outro lado da sua mão. Isso também pode ser modelado com alterações simples no simulador e sem alterações no tempo de execução.

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 funciona o PRT

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

Brilho da fonte: O brilho da fonte representa o ambiente de iluminação como um todo. Em PRT um ambiente arbitrário é aproximado usando a base harmônica esférica - esta iluminação é assumida como distante em relação ao objeto (a mesma suposição que é feita com mapas de ambiente).

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

Vetores de transferência: Os vetores de transferência mapeiam o brilho da fonte para o brilho de saída e são pré-calculados off-line usando uma simulação complexa de transporte de luz.

diagrama de como o PRT funciona

A PRT considera o processo de renderização em duas etapas, como mostra o diagrama a seguir:

  1. Uma simulação de transporte leve cara pré-calcula 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 se aproxima do ambiente de iluminação usando a base harmônica esférica, depois usa esses coeficientes de iluminação e os coeficientes de transferência pré-calculados (do estágio 1) com um sombreador simples, resultando em brilho de saída (a luz que sai do objeto).

diagrama do fluxo de dados PRT

Como usar a API PRT

  1. Calcule os vetores de transferência com um... métodos de ID3DXPRTEngine.

    Lidar diretamente com esses vetores de transferência requer uma quantidade significativa de memória e computação de 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. Este é um vetor de coeficientes Order².
    k O ID do cluster para o vértice p.
    L' A aproximação do brilho da fonte nas funções de base SH. Este é um vetor de coeficientes Order².
    j Um inteiro que soma sobre o número de vetores PCA.
    wpj O peso do jth PCA para o ponto p. Trata-se de um coeficiente único.
    Bkj O vetor de base jth PCA para o cluster k. Este é um vetor de coeficientes Order².

     

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

  2. Calcule o brilho da fonte.

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

    Função Finalidade
    D3DXSHEvalDirectionalLight Aproxima-se de uma luz direcional convencional.
    D3DXSHEvalSphericalLight Aproxima as fontes de luz esféricas locais. (Note que o PRT só funciona com ambientes de iluminação à distância.)
    D3DXSHEvalConeLight Aproxima-se de 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 polo de uma esfera).

     

  3. Calcule o brilho de saída.

    A equação 1 agora tem que ser avaliada em cada ponto usando um vértice ou sombreador de pixel. Antes que o sombreador possa ser avaliado, as constantes devem ser pré-calculadas e carregadas na tabela constante (consulte o de demonstração PRT de para obter detalhes). O sombreador em si é uma implementação direta desta 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 documentos:

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é-calculadas

Funções matemáticas