Reflexionsmodelle, BRDF
-
Rechnung im Pixel-Shader: weiter im alten Skript
-
Simple Reflexionsmodelle (auch: Beleuchtungsmodelle)
-
Lambert-Reflexionsmodell
-
perfekt diffus, Abstrahlung gleichmäßig in alle Richtungen
-
Pixelfarbe = Grundfarbe mal (Normalenvektor*Einheitsvektor zum Licht),
wenn das nicht negativ ist
-
Abwandlung: Pixelfarbe = Grundfarbe mal Funktion(Normalenvektor*Einheitsvektor
zum Licht) z.B. für harten Übergang (Planeten!) oder Beleuchtung,
die etwas auf die Rückseite überstrahlt (Simulation von Subsurface
Scattering: Haut, Alabaster, Milch, ...)
-
Phong-Reflexionsmodell
-
Summe aus Lambert (diffuse reflection) und Glanzlicht (specular reflection)
-
In der Summe kann nicht "mehr als Weiß" herauskommen: Die Grafikkarte
schneidet Farbwerte automatisch nach oben ab (Clamping).
-
Glanzlicht = Glanzlichtfarbe mal ((Normalenvektor*Halbvektor) hoch Glanz),
damit die Reflexion in die Richtung Einfallswinkel = Ausfallswinkel konzentriert
ist.
-
Halbvektor := Einheitsvektor in die Richtung: (Einheitsvektor zum Licht
plus Einheitsvektor zum Betrachter)
-
Abwandlung: nicht einfach potenzieren, sonderen komplexere Funktion wählen.
-
Schräge Anwendung von Texturen: Pixelfarbe = 2D-Textur an den Koordinaten
(Normalenvektor*Einheitsvektor zum Licht, Normalenvektor*Halbvektor); dadurch
Aussehen weit steuerbar -- mit einem gemalten Bild.
-
BRDF (Bi-Directional Reflection [oder Reflectance] Distribution Function)
-
beschreibt Reflexionsstärke von Materialien vollständig als
f(Einfallsrichtung, Ausfallsrichtung), eigentlich sogar als f(Einfallsrichtung,
Ausfallsrichtung, Wellenlänge, Position) [siehe BTF, SBRDF]
-
kann (aufwendig) gemessen werden: mehr als bloß ein Modell
-
kann auf diverse Arten genähert werden, nicht nur simpel mit Lambert
und Phong
-
derzeit experimentelle Umsetzung auf Grafikkarten
-
noch nicht in großem Stil in 3D-Designsoftware eingesetzt
-
Bump-Mapping auf der Grafikkarte
-
siehe Demo-.fx
-
im Pixel-Shader den Normalenvektor kippen und den gekippten Vektor zur
Beleuchtungsberechnung einsetzen, gerne auch zur Reflexion einer Environment
Map
-
Gebe jedem Vertex ein "Dreibein" mit: Normalenvektor, Tangentialvektor,
Binormalvektor. Drücke die gekippte Normale als Überlagerung
dieser drei Vektoren mit passenden Anteilen aus. Speichere die drei Anteile
als Textur: "Normal-Map". Die Anteile liegen jeweils zwischen -1 und 1.
Damit das in eine Farbtextur passt (Wertebereich 0...1), addiert man 1
und teilt durch 2. Das muss beim Auslesen der Textur wieder rückgängig
gemacht werden.
-
Eine Normal-Map (Richtungen der Normalen kodiert als RGB) ist keine Bump-Map
(Höhenkarte in Graustufen), aber kann daraus gewonnen werden.