Trasferimento di radianza pre-calcolata (Direct3D 9)

Uso del trasferimento di radiance pre-calcolata

Esistono diverse forme di complessità presenti in scene interessanti, tra cui il modo in cui l'ambiente di illuminazione viene modellato (ovvero, modelli di illuminazione ad area rispetto a quelli direzionali/punti) e quale tipo di effetti globali vengono modellati (ad esempio ombre, interfleszioni, dispersione sottosurface). Le tecniche di rendering interattivo tradizionali modellano una quantità limitata di questa complessità. Il token di aggiornamento primario abilita questi effetti con alcune restrizioni significative:

  • Si presuppone che gli oggetti siano rigidi (ovvero, nessuna deformazione).
  • Si tratta di un approccio incentrato sugli oggetti (a meno che gli oggetti non vengano spostati insieme, questi effetti globali non vengono mantenuti tra di essi).
  • Viene modellata solo l'illuminazione a bassa frequenza (con ombreggiature morbide). Per le luci ad alta frequenza (ombre nitide), le tecniche tradizionali devono essere utilizzate.

Il token di aggiornamento primario richiede una delle opzioni seguenti, ma non entrambe:

  • modelli a mosaico e vs_1_1
  • ps_2_0

Illuminazione diffusa standard e PRT

Il rendering della figura seguente viene eseguito usando il modello di illuminazione tradizionale (n · l). Le ombreggiature nitide possono essere abilitate usando un altro passaggio e una qualche forma di tecnica di ombreggiatura (mappe di profondità ombreggiatura o volumi di ombreggiatura). L'aggiunta di più luci richiederebbe più passaggi (se le ombreggiature devono essere usate) o shader più complessi con tecniche tradizionali.

screenshot di un'illustrazione di cui è stato eseguito il rendering usando il modello di illuminazione tradizionale

Il rendering della figura successiva viene eseguito con prt usando l'approssimazione migliore di una singola luce direzionale che può risolvere. Ciò comporta ombre morbide che sarebbero difficili da produrre con tecniche tradizionali. Poiché prt modella sempre ambienti di illuminazione completi aggiungendo più luci o usando una mappa dell'ambiente, è necessario modificare solo i valori (ma non il numero) di costanti usate dallo shader.

screenshot di un'illustrazione di cui è stato eseguito il rendering usando prt

PRT con interreflessione

L'illuminazione diretta raggiunge la superficie direttamente dalla luce. Le interflazioni sono la luce che raggiunge la superficie dopo aver rimbalzato su un'altra superficie un certo numero di volte. Il token di aggiornamento primario può modellare questo comportamento senza modificare le prestazioni in fase di esecuzione semplicemente eseguendo il simulatore con parametri diversi.

La figura seguente viene creata usando solo prt diretto (0 rimbalzi senza interflessione).

screenshot di un'illustrazione di cui è stato eseguito il rendering usando solo prt diretto

La figura seguente viene creata usando il token di aggiornamento primario con le interfleszioni (2 rimbalzi con interreflizioni).

screenshot di un'illustrazione di cui è stato eseguito il rendering usando prt con interflessione

PRT con dispersione sottosurface

La dispersione sottosurface è una tecnica che modella il modo in cui la luce passa attraverso determinati materiali. Ad esempio, premere una torcia accesa sul palmo della mano. La luce dalla torcia passa attraverso la mano, rimbalza intorno (cambiando colore nel processo) e esce dall'altro lato della mano. Questo modello può anche essere modellato con semplici modifiche al simulatore e nessuna modifica al runtime.

Nella figura seguente viene illustrato il token di aggiornamento primario con la dispersione sottosuperforma.

screenshot di un'illustrazione di cui è stato eseguito il rendering usando prt con dispersione sottosurface

Funzionamento del token di aggiornamento primario

I termini seguenti sono utili per comprendere il funzionamento del token di aggiornamento primario, come illustrato nel diagramma seguente.

Radiance di origine: la radiazione di origine rappresenta l'ambiente di illuminazione nel suo complesso. In PRT un ambiente arbitrario è approssimativo usando la base armonica sferica. Si presuppone che questa illuminazione sia distante rispetto all'oggetto (lo stesso presupposto che viene fatto con le mappe dell'ambiente).

Radiance uscita: la luce di uscita è la luce che lascia da un punto sulla superficie da qualsiasi fonte possibile (raggi riflessi, dispersione sottosuperforma, emissione).

Vettori di trasferimento: i vettori di trasferimento mappano l'origine Radiance alla radiazione di uscita e vengono pre-calcolati offline usando una simulazione di trasporto chiaro complessa.

diagramma del funzionamento di prt

Prt fattori il processo di rendering in due fasi, come illustrato nel diagramma seguente:

  1. Una simulazione di trasporto leggera costosa precomputa i coefficienti di trasferimento che possono essere usati in fase di esecuzione.
  2. Una fase di runtime relativamente leggera approssima l'ambiente di illuminazione usando la base armonica sferica, quindi usa questi coefficienti di illuminazione e i coefficienti di trasferimento precompilata (dalla fase 1) con un semplice shader, con conseguente raggi di uscita (la luce che lascia l'oggetto).

diagramma del flusso di dati prt

Come usare l'API PRT

  1. Calcolare i vettori di trasferimento con uno dei calcoli... metodi di ID3DXPRTEngine.

    La gestione diretta di questi vettori di trasferimento richiede una quantità significativa di memoria e calcolo dello shader. La compressione riduce significativamente la quantità di memoria e il calcolo dello shader necessari.

    I valori di illuminazione finali vengono calcolati in un vertex shader che implementa l'equazione di rendering compressa seguente.

    equazione del rendering prt

    Dove:

    Parametro Descrizione
    Rp Un singolo canale di raggi di uscita al vertice p e viene valutato in ogni vertice della mesh.
    Mk Media per il cluster k. Si tratta di un vettore Order² di coefficienti.
    k ID cluster per vertex p.
    L' L'approssimazione della radiazione di origine nelle funzioni di base SH. Si tratta di un vettore Order² di coefficienti.
    j Intero che somma il numero di vettori PCA.
    w pj Peso jth PCA per il punto p. Si tratta di un singolo coefficiente.
    Broute Vettore di base jth PCA per il cluster k. Si tratta di un vettore Order² di coefficienti.

     

    Estrai... i metodi di ID3DXPRTCompBuffer forniscono l'accesso ai dati compressi dalla simulazione.

  2. Calcolare la luminosità di origine.

    Nell'API sono disponibili diverse funzioni helper per gestire diversi scenari di illuminazione comuni.

    Funzione Scopo
    D3DXSHEvalDirectionalLight Approssima una luce direzionale convenzionale.
    D3DXSHEvalsphericalLight Approssima le sorgenti di luce sferica locali. Si noti che il token di aggiornamento primario funziona solo con ambienti di illuminazione a distanza.
    D3DXSHEvalConeLight Approssima una fonte di luce di area distante. Un esempio è il sole (angolo cono molto piccolo).
    D3DXSHEvalHemisphereLight Valuta una luce che rappresenta un'interpolazione lineare tra due colori (uno su ogni polo di una sfera).

     

  3. Calcolare la luminosità di uscita.

    L'equazione 1 deve ora essere valutata a ogni punto usando un vertice o un pixel shader. Prima di poter valutare lo shader, le costanti devono essere pre-calcolate e caricate nella tabella costante (vedere l'esempio demo PRT per informazioni dettagliate). Lo shader stesso è un'implementazione semplice di questa equazione.

    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;
    

Riferimenti

Per ulteriori informazioni su PRT e armonica sferica, vedere i documenti seguenti:

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 

Argomenti avanzati

Equazioni PRT (Direct3D 9)

Rappresentazione di PRT con trame (Direct3D 9)

ID3DXPRTBuffer

ID3DXPRTCompBuffer

ID3DXPRTEngine

ID3DXTextureGutterHelper

Funzioni di trasferimento di radianza precompilate

Funzioni matematiche