Condividi tramite


Trasferimento di radianza pre-calcolata (Direct3D 9)

Uso del trasferimento di radianza pre-calcolata

Esistono diverse forme di complessità presenti in scene interessanti, tra cui il modo in cui viene modellato l'ambiente di illuminazione (ovvero i modelli di illuminazione dell'area rispetto a quelli punta/direzionali) e il tipo di effetti globali modellati (ad esempio, ombre, interreflazioni, dispersione sottosurface). Le tradizionali tecniche di rendering interattivo modellano una quantità limitata di questa complessità. PrT 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 conseguente ombreggiatura morbida). 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 ombre devono essere usate) o shader più complessi con tecniche tradizionali.

screenshot di un'illustrazione sottoposta a 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, è possibile modificare solo i valori (ma non il numero) di costanti usate dallo shader.

screenshot di un'illustrazione sottoposta a rendering usando prt

PRT con interreflizioni

L'illuminazione diretta raggiunge la superficie direttamente dalla luce. Le interfleszioni sono leggere che raggiungono la superficie dopo il rimbalzo di qualche altra superficie alcune volte. PrT 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 interreflizioni).

schermata di un'illustrazione di cui è stato eseguito il rendering usando solo direct prt

La figura seguente viene creata usando PRT con interreflizioni (2 rimbalzi con interreflizioni).

schermata di un'illustrazione di cui è stato eseguito il rendering usando prt con interreflizioni

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 della torcia passa attraverso la mano, rimbalza intorno (cambiando colore nel processo) e esce dall'altro lato della mano. Può anche essere modellato con semplici modifiche al simulatore e nessuna modifica al runtime.

La figura seguente illustra il token di aggiornamento primario con la dispersione della sottosurface.

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

Funzionamento della richiesta pull

I termini seguenti sono utili per comprendere il funzionamento della richiesta pull, come illustrato nel diagramma seguente.

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

Radianza uscita: la radiazione di uscita è la luce che lascia da un punto sulla superficie da qualsiasi possibile sorgente (raggi riflesse, dispersione sottosurfacea, emissione).

Vettori di trasferimento: i vettori di trasferimento mappano Laradianza dell'origine nellaradianza di uscita e sono precompilate offline usando una simulazione complessa del trasporto di luce.

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 prima 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 una delle risorse di calcolo... 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 di di 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 cluster k. Si tratta di un vettore Order² di coefficienti.
    Okay ID cluster per vertex p.
    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.
    wpj Peso jth PCA per il punto p. Si tratta di un singolo coefficiente.
    B Vettore di base JTH PCA per il cluster k. Si tratta di un vettore Order² di coefficienti.

     

    Estrazione... 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 prT funziona solo con ambienti di illuminazione a distanza.
    D3DXSHEvalConeLight Approssima una fonte di luce distante. Un esempio sarebbe il sole (angolo cono molto piccolo).
    D3DXSHEvalHemisphereLight Valuta una luce che è un'interpolazione lineare tra due colori (una 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 precompilate e caricate nella tabella costante .Per informazioni dettagliate, vedere l'di esempio demo PRT. 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;
    

Referenze

Per altre 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)

che rappresenta prt con trame (Direct3D 9)

ID3DXPRTBuffer

ID3DXPRTCompBuffer

ID3DXPRTEngine

ID3DXTextureGutterHelper

funzioni di trasferimento pre-calcolate

Funzioni matematiche