shader surface scattering(ARB)

Aus DGL Wiki
Version vom 15. August 2008, 14:36 Uhr von Dj3hut1 (Diskussion | Beiträge) (Die Seite wurde neu angelegt: =Surface Scattering= Zurück zur Shadersammlung {|{{Prettytable_B1}} width=100% !width=60%|Beschreibung !width=20%|Autor !width=20%|Version |- |Die Dicke des Materi...)

(Unterschied) ← Nächstältere Version | Aktuelle Version (Unterschied) | Nächstjüngere Version → (Unterschied)
Wechseln zu: Navigation, Suche

Surface Scattering

Zurück zur Shadersammlung

Beschreibung Autor Version
Die Dicke des Materials bestimmt die Durchlässigkeit des Lichtes. dj3hut1 1.0

Bilder

Bei Vorderansicht ist grösste Lichtdurchlässigkeit an den Ohren und am Kinn.
...im Gegensatz zur Seitenansicht.

Beschreibung

Viele Materialien, wie z.B. Glas, Pergament, Haut, Edelsteine, Alabaster oder Pflanzenblätter, sind lichtdurchlässig, d.h. wenn man sie gegen das Licht hält, leuchten sie abhängig von der Materialdicke verschieden stark. In der Grafikprogrammierung nennt sich diese Technik 'Surface Scattering' und lässt sich mit Shadern realisieren.

Im ersten Pass wird, ähnlich wie beim Shadowmapping, die Szene aus der Sicht der Lichtquelle gerendert und die Entfernungen vom Licht zum Objekt in einer Textur gespeichert. Diese werden dann im nächsten Pass mit den Tiefenwerten aus der Sicht des Betrachters verglichen und man erhält für jede Stelle die Länge des Weges, den das Licht im Material zurückgelegt hat.

Besondere Vorraussetzungen

Für die Shader werden nur die Erweiterungen GL_ARB_fragment_program und GL_ARB_vertex_program benötigt.

Code

scattering1.vp

!!ARBvp1.0

ATTRIB iPos = vertex.position;
ATTRIB iPrC = vertex.color.primary;

OUTPUT oPos = result.position;
OUTPUT oPrC = result.color.primary;

PARAM mvp[4] = { state.matrix.mvp };
PARAM mv[4] = { state.matrix.modelview };

#vector in light texture space
TEMP ltsv;

#vector in light space
TEMP lsv;

#output color
TEMP color;

#simple vertex transformation
DP4 ltsv.x, iPos, mvp[0];
DP4 ltsv.y, iPos, mvp[1];
DP4 ltsv.z, iPos, mvp[2];
DP4 ltsv.w, iPos, mvp[3];

MOV oPos, ltsv;

#vertex in light space
DP4 lsv.x, iPos, mv[0];
DP4 lsv.y, iPos, mv[1];
DP4 lsv.z, iPos, mv[2];
DP4 lsv.w, iPos, mv[3];

#length of vector in light space ( light source is in (0, 0, 0) )
DP3 color.x, lsv, lsv;
RSQ color.x, color.x;
RCP color.x, color.x;

#scale to [1, 0], values dependent from application
ADD color.x, color.x, -65;
MUL color.x, color.x, 0.02;

#save length value in output color
MOV oPrC, color.x;

END