Freigeben über


Vorkompilierte Radiance-Übertragung (Direct3D 9)

Verwenden von vorkompilierten Strahlenübertragungen

Es gibt verschiedene Formen der Komplexität in interessanten Szenen, einschließlich der Modellierung der Beleuchtungsumgebung (d. h. Flächenbeleuchtungsmodelle im Vergleich zu Punkt/Richtungseffekten) und welche Art von globalen Effekten modelliert werden (z. B. Schatten, Interreflections, Subsurface Scattering).) Herkömmliche interaktive Renderingtechniken modelliert eine begrenzte Menge dieser Komplexität. PRT ermöglicht diese Effekte mit einigen erheblichen Einschränkungen:

  • Objekte werden als starr angenommen (d. s. keine Verformungen).
  • Es handelt sich um einen objektorientierten Ansatz (es sei denn, Objekte werden miteinander verschoben, diese globalen Effekte werden nicht zwischen ihnen beibehalten).
  • Nur niederfrequente Beleuchtung wird modelliert (was zu weichen Schatten führt.) Bei Hochfrequenzlichtern (scharfe Schatten) müssten herkömmliche Techniken eingesetzt werden.

PRT erfordert eine der folgenden, aber nicht beide:

  • Hochtessellierte Modelle und vs_1_1
  • ps_2_0

Diffuse Standardbeleuchtung im Vergleich zu PRT

Die folgende Abbildung wird mit dem traditionellen Beleuchtungsmodell (n · l) gerendert. Scharfe Schatten können mithilfe eines anderen Durchlaufs und einer Form von Schattentechnik (Schattentiefekarten oder Schattenvolumen) aktiviert werden. Das Hinzufügen mehrerer Lichter erfordert entweder mehrere Durchläufe (wenn Schatten verwendet werden sollen) oder komplexere Shader mit herkömmlichen Techniken.

Screenshot einer Illustration, die mithilfe des herkömmlichen Beleuchtungsmodells

Die nächste Abbildung wird mit PRT gerendert, wobei die beste Annäherung an ein einzelnes direktionales Licht verwendet wird, das gelöst werden kann. Dies führt zu weichen Schatten, die mit herkömmlichen Techniken schwer zu produzieren wären. Da PRT immer vollständige Beleuchtungsumgebungen modelliert, die mehrere Lichter hinzufügen oder eine Umgebungskarte verwenden, würden Sie nur die Werte (aber nicht die Anzahl) von Konstanten ändern, die vom Shader verwendet werden.

Screenshot einer Abbildung, die mithilfe von prt gerendert wird

PRT mit Interreflections

Direkte Beleuchtung erreicht die Oberfläche direkt vom Licht. Interreflektionen erreichen die Oberfläche, nachdem sie einige Male auf eine andere Oberfläche geworfen wurde. PRT kann dieses Verhalten modellieren, ohne die Leistung zur Laufzeit zu ändern, indem einfach der Simulator mit verschiedenen Parametern ausgeführt wird.

Die folgende Abbildung wird nur mit direct PRT erstellt (0 unzustellbarkeiten ohne Interreflections).

Screenshot einer Illustration, die mit direkt gerenderten Prt- gerendert wird

Die folgende Abbildung wird mithilfe von PRT mit Interreflections erstellt (2 Springen mit Interreflections).

Screenshot einer Illustration, die mithilfe von Prt mit Interreflections

PRT mit Untersurface Punktierung

Subsurface Scattering ist eine Technik, die modelliert, wie Licht durch bestimmte Materialien durchläuft. Als Beispiel drücken Sie eine beleuchtete Taschenlampe gegen die Handfläche. Das Licht aus der Taschenlampe durchläuft Ihre Hand, springt um (veränderliche Farbe im Prozess) und verlässt von der anderen Seite Ihrer Hand. Dies kann auch mit einfachen Änderungen am Simulator und ohne Änderungen an der Laufzeit modelliert werden.

Die folgende Abbildung zeigt PRT mit Streuung der Unteroberfläche.

Screenshot einer Illustration, die mithilfe von Prt mit Streuung

Funktionsweise von PRT

Die folgenden Begriffe sind nützlich, um zu verstehen, wie PRT funktioniert, wie im folgenden Diagramm dargestellt.

Quellradianz: Die Quellstrahlung stellt die gesamte Beleuchtungsumgebung dar. In PRT wird eine beliebige Umgebung mithilfe der sphärischen harmonischen Basis angenähert - diese Beleuchtung wird angenommen, relativ zum Objekt entfernt zu sein (die gleiche Annahme, die mit Umgebungskarten gemacht wird.)

Ausgangsradianz: Ausgangsstrahlung ist das Licht, das von einem Punkt auf der Oberfläche aus einer beliebigen Quelle ablässt (reflektierte Strahlung, Subsurface-Streuung, Emission).

Transfervektoren: Transfervektoren ordnen Quellradianz in Ausgangsstrahlung ab und werden mit einer komplexen Lichttransportsimulation vorab kompiliert.

Diagramm der Funktionsweise von prt

PRT faktoren den Renderingprozess in zwei Phasen, wie im folgenden Diagramm dargestellt:

  1. Eine teure Lichttransportsimulation kompetiert Transferkoeffizienten, die zur Laufzeit verwendet werden können.
  2. Eine relativ leichte Laufzeitstufe nähert zunächst die Beleuchtungsumgebung mit der sphärischen harmonischen Basis an und verwendet dann diese Lichtkoeffizienten und die vorkompilierten Übertragungskoeffizienten (von Stufe 1) mit einem einfachen Shader, was zu einer Ausgangsstrahlung (dem Licht, das das Objekt verlässt).

Diagramm des prt-Datenflusses

So verwenden Sie die PRT-API

  1. Berechnen Sie die Übertragungsvektoren mit einem der Compute... Methoden von ID3DXPRTEngine.

    Der direkte Umgang mit diesen Übertragungsvektoren erfordert eine erhebliche Menge an Arbeitsspeicher und Shaderberechnung. Die Komprimierung reduziert die erforderliche Arbeitsspeicher- und Shaderberechnung erheblich.

    Die endgültigen Beleuchtungswerte werden in einem Vertex-Shader berechnet, der die folgende komprimierte Renderinggleichung implementiert.

    Formel des prt-Renderings

    Wo:

    Parameter Beschreibung
    RP Ein einzelner Kanal der Ausgangsstrahlung bei Vertex p und wird bei jedem Scheitelpunkt im Gitter ausgewertet.
    Mk Der Mittelwert für Cluster k. Dies ist ein Order²-Vektor von Koeffizienten.
    k Die Cluster-ID für Vertex p.
    L' Die Annäherung der Quellstrahlung in die SH-Basisfunktionen. Dies ist ein Order²-Vektor von Koeffizienten.
    j Eine ganze Zahl, die über die Anzahl der PCA-Vektoren addiert wird.
    wpj Die jth PCA-Gewichtung für Punkt p. Dies ist ein einzelner Koeffizienten.
    Bkj Der jth PCA-Basisvektor für Cluster k. Dies ist ein Order²-Vektor von Koeffizienten.

     

    Der Extrakt... Methoden von ID3DXPRTCompBuffer den Zugriff auf komprimierte Daten aus der Simulation ermöglichen.

  2. Berechnen sie die Quellstrahlung.

    Es gibt mehrere Hilfsfunktionen in der API, um eine Vielzahl gängiger Beleuchtungsszenarien zu verarbeiten.

    Funktion Zweck
    D3DXSHEvalDirectionalLight Nähert sich einem herkömmlichen richtungsgerichteten Licht an.
    D3DXSHEvalSphericalLight Nähert lokale sphärische Lichtquellen an. (Beachten Sie, dass PRT nur mit Fernbeleuchtungsumgebungen funktioniert.)
    D3DXSHEvalConeLight Nähert sich einer entfernten Bereichslichtquelle an. Ein Beispiel wäre die Sonne (sehr kleiner Kegelwinkel).
    D3DXSHEvalHemisphereLight Wertet ein Licht aus, bei dem es sich um eine lineare Interpolation zwischen zwei Farben handelt (eine auf jedem Pol einer Kugel).

     

  3. Berechnen sie die Ausgangsstrahlung.

    Formel 1 muss jetzt an jedem Punkt mit einem Vertex- oder Pixel-Shader ausgewertet werden. Bevor der Shader ausgewertet werden kann, müssen Konstanten vorkompiliert und in die Konstantentabelle geladen werden (einzelheiten hierzu finden Sie im PRT Demo Sample). Der Shader selbst ist eine einfache Implementierung dieser Formel.

    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;
    

Referenzen

Weitere Informationen zu PRT und sphärischen Harmonien finden Sie in den folgenden Artikeln:

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 

erweiterten Themen

PRT-Formeln (Direct3D 9)

, die PRT mit Texturen (Direct3D 9)

ID3DXPRTBuffer

ID3DXPRTCompBuffer-

ID3DXPRTEngine

ID3DXTextureGutterHelper

Precomputed Radiance Transfer Functions

mathematische Funktionen