2016-10-15 5 views
1

Ich arbeite an der Implementierung der indirekten diffuse in meinem Renderer und ich schaue Abschnitt 8.4.1 of this paper from Valve.Approximate Indirect Diffuse

In meinem Renderer mit Im ein Voxelraster von 256x256x256 mit Glanz und Schatten injizierte und Im Versuch, diesen Ausschnitt aus dem Papier zu konvertieren/verwenden, um Umgebungslicht gegen meine Voxel zu berechnen:

float3 AmbientLight(const float3 worldNormal) 
{ 
    float3 nSquared = worldNormal * worldNormal; 
    int3 isNegative = (worldNormal < 0.0); 
    float3 linearColor; 
    linearColor = nSquared.x * cAmbientCube[isNegative.x] + 
       nSquared.y * cAmbientCube[isNegative.y+2] + 
       nSquared.z * cAmbientCube[isNegative.z+4]; 
    return linearColor; 
} 

Das Problem ist, dass kann nicht herausfinden, was ist cAmbientCube in der Berechnung ...

Was ist diese Variable und woher kommt sie?

+0

Sieht aus wie eine Reihe von 6 Farben, nein? – Zouch

+0

Verwenden Sie Desktop-OpenGL oder OpenGL ES? –

Antwort

1

Der Abschnitt 8.4.1, in dem Sie den Code kopiert haben, erklärt es ziemlich genau. cAmbientCube ist eine Anordnung von sechs Lichtwerten, einer für jede Hauptrichtung: negativ x, positiv x, negativ y, positiv y, negativ z, positiv z. Während angenommen wird, dass ein typischer Umgebungsausdruck ein konstantes Licht ist, das aus allen Richtungen aufleuchtet, ist die in der Veröffentlichung beschriebene Ambient-Cube-Technik eine Verallgemeinerung von dieser, die ein anderes Licht aus jeder dieser Richtungen annimmt. Der von Ihnen gepostete Code ist für das Sampling dieser Ad-hoc-sechsseitigen Cube-Map-Textur zuständig.

+0

Also im Grunde seine nur 6 Werte, die eine Cubemap "gefälscht" und der Code oben einfach Probe von ihnen richtig? Wie werden diese 6 Werte berechnet? Verwendung von Kugelflächen? – McBob

+0

@McBob: Ja. Das Papier erwähnt nicht, wie man sie berechnet. Um es zu berechnen, glaube ich nicht, dass hier harmonische Oberschwingungen angebracht sind. Stattdessen sollten Sie jede Fläche der Umgebungskarte mit etwas wie * x² + y² + z² * kernel falten oder einfach jede ihrer Flächen mitteln. Alternativ können diese Werte vom Künstler manuell ausgewählt werden. – ybungalobill

Verwandte Themen