Upload
others
View
4
Download
0
Embed Size (px)
Citation preview
1
PraktikumPraktikumGlobale Beleuchtung
Thorsten Grosch
Wer bin ichThorsten GroschSeit September 2009 Juniorprofessor für CV in Magdeburgg gDavor…– Studium Informatik TU Darmstadt– Fraunhofer IGD
Lichtsimulation (Radiosity)– Universität Koblenz Landau (die andere CV Uni)
Aufbau der Computergrafik LehreDoktorarbeitDoktorarbeit
– Erweiterung von realen Bildern mit korrekter Beleuchtung
– Post-Doc am MPI Informatik SaarbrückenEchtzeit-Beleuchtung mit der GPU
2
Was ist Globale BeleuchtungGlobale Beleuchtung– Simulation aller Lichtwege von der Lichtquelle bis zum Auge
Indirektes Licht, Spiegelungen, weiche Schatten, …– Ziele:
Photorealistische DarstellungEchtzeitdarstellung, also mind. 25 Bilder / sek.
Lokale Beleuchtung:Nur direktes Licht
Schnell, aber künstlich
Globale Beleuchtung:Photorealistisch, aber
zeitaufwändig
Virtuelle 3D Szene,keine Beleuchtung
Aufgabe im PraktikumGlobale Beleuchtung mit intuitiver BedienungNicht nur einfach Lichtquellen einfügen
Klassisch: Setze Position Orientierung Farbe– Klassisch: Setze Position, Orientierung, Farbe, …
Stattdessen: Vorgabe des gewünschten EffektsCinematic Lighting
Lichtquellen werden dann indirekt platziert
3
IdeensammlungVerschiedene Ideen für die Steuerung der Beleuchtung
Ni ht ll i P ktik i l ti t dNicht alles muss im Praktikum implementiert werden
Beispiel GlanzlichtBenutzer klickt auf Glanzlicht und bewegt GlanzlichtLichtquelle wird passend zu neuer Glanzlichtposition bewegt
– Einfallswinkel = Ausfallswinkel
Heuristik für Abstand der Lichtquelle
– z.B. Abstand bleibt konstant– Nur wenn sich ein Blocker
d i h b fi d t i d didazwischen befindet, wird die Lichtquelle vor den Blocker gesetzt
4
Beispiel SchattenBenutzer klickt auf Schatten und zieht Schatten an neue PositionLichtquelle wird für neuen Schatten gesetztHeuristiken, z.B.– Abstand Lichtquelle –
Blocker bleibt gleichBlocker bleibt gleich– Test, ob Lichtquelle jetzt
evtl. ausserhalb der Szene Lichtquelle nach innen bewegen
Indirekte BeleuchtungOhne indirektes Licht wirkt alles ziemlich künstlich
V hi d O tiVerschiedene Optionen– Erstmal ignorieren– Von Hand indirekte Lichtquellen setzen (z.B. rote
Lichtquelle auf roter Wand)Indirekte Schatten: Optionen
– IgnorierenEinen oder mehrere Schatten zeichnen (weiche Schatten)– Einen oder mehrere Schatten zeichnen (weiche Schatten)
– Soft Shadows (schwierig)
– Instant Radiosity (schwierig)– „Normales“ Radiosity (langsam)
5
Zusammensetzung der Beleuchtung
System sollte mit interaktiver Geschwindigkeit laufen
Vorschlag:Direktes Licht mit OpenGL LichtquellenHardware Schatten– Shadow Maps oder Shadow Volumes
Indirektes Licht mit einem der vorgestellten Verfahren
Beide Anteile addieren
Direktes und indirektes Licht
Grobe Patchauflösung Radiosity (mit schlechten Schattenkanten)
Direktes Licht pro Pixel addieren
T. Grosch - 10 -Herausnehmen des direkten Lichts(indirektes Licht ist „weich“)
6
RadiosityProgressive Refinement– Aufteilung in PatchesAufteilung in Patches– Berechnung von
Formfaktoren & Sichtbarkeit
– Radiosity Übertragung
– Darstellung mit
0 Iterationen 1 Iteration 5 Iterationen
100 Iterationen 500 Iterationen 1000 IterationengGouraud Shading
Nur auf Nachfrage Aktualisierung, dauert ein paar Sekunden
100 Iterationen 500 Iterationen 1000 Iterationen
Mit Gouraud Shading
Weitere Ideen erwünschtErwünscht: Eigene Ideen zur Kontrolle der Beleuchtung mit einbringenHier ein paar Vorschläge von mirHier ein paar Vorschläge von mir…
Constraints: Hier auf jeden Fall Schatten, hier auf keinen Fall Schatten, …Malen der Beleuchtung, Lichtquellen werden durch Optimierungsverfahren bestimmtCheating: Benutzer kontrolliert selektiv die Stärke des Color Bleeding (Formfaktoren erhöhen oder indirekte Lichtquellen einfügen)Weiche Schatten, Benutzer kontrolliert HalbschattenbreiteIdee für gemeinsames Projekt mit Prof. Dachselt: Kontrolle der Beleuchtung durch Gesten…
7
Constraints[Pellacini et al. 2002]
Bereich immer im Schatten Bereich nie im Schatten
Editierbare Globale Beleuchtung[Pellacini et al. 2007]
Indirekte Steuerung der globalen BeleuchtungBenutzer malt die gewünschte LichtverteilungPosition, Farbe, … der Lichtquellen werden über ein Optimierungsverfahren bestimmt
8
Editierbare Globale Beleuchtung[Obert et al. 2008]
iCheatiCheatAusgehend von einer globalen Beleuchtungssimulation kann der Benutzer manuell das Licht verändern– z.B. Color Bleeding selektiv verändern
iCheat Video
9
WerkzeugeC++OpenGL (GLUT)E tl GLSL Sh dEvtl. GLSL Shader
Evtl. Library für Benutzerinterface, z.B. Qt
Versionskontrolle mit SVNVersionskontrolle mit SVNWiki
HilfreichVorlesung Photorealistische Computergrafik– Ray Tracer aus Übung
Diverse Klassen (Dreieck, Kugel, …) und Funktionen (Strahl,Diverse Klassen (Dreieck, Kugel, …) und Funktionen (Strahl, Schnittpunkt, …)
– Beispielprogramme für Shadow Volumes und Shadow Maps
Fragen bis hierher ?
10
Bis nächste WocheHausaufgaben– Welche Features sollen integriert werden ?
Ray Tracer aus PCG Vorlesung ansehen– Ray Tracer aus PCG Vorlesung ansehen
Nächste Woche– Festlegung der Features– Aufteilung der Aufgaben– Festlegung Datum Projektende
Wöchentliches Treffen
Wöchentliches TreffenDo 13:00 ct Raum G29 335– Do, 13:00 ct, Raum G29-335
– Berichte aus letzter Woche– Aufgaben für nächste Woche– Bitte vorher Bescheid sagen, falls verhindert
Projektende– Präsentation– Dokumentiertes Programm– Demo
11
Ein einfacher Raytracer
Einfacher RaytracerEigenschaften– Objekte (einfache Liste)
Kugel und Dreieck– Schnittpunkt Strahl - Objekt
Primärstrahlen (Pixel) und Schatten (Punktlichtquellen)– Diffuse und spekulare Reflexion (Phong Modell) Aufgabe– C++, OpenGL und GLUT
Mögliche ErweiterungenLichtbrechung Transparenzen Fresnel Reflexion– Lichtbrechung, Transparenzen, Fresnel Reflexion, …
– Besseres Oberflächenmodell (Mikrofacetten, Anisotropie usw.)
– Andere Objekte (Kegel, Zylinder, Polygon, …)– Szene einladen, Bounding Volume Hierarchie, …– …
12
Raytracer Klassen
LightsourceM t i l
Vector Ray
List CameraObject
LightsourceMaterial
Intersection
Scene
Raytracer
Sphere Triangle
Raytracer KlassenVector Klasse– Rechnen mit Vektoren und Punkten– Operatoren werden überladenOperatoren werden überladen
float s;Vector a, b, c;a = b + c; // Vektoradditiona = s * b; // Skalierungs = dot(a,b); // Skalarprodukta = cross(b, c); // Kreuzprodukta.normalize(); // Normalisierung
– Rechnen mit Farben (komponentenweise Multiplikation)Vector col1 = col2 * col3;
13
Raytracer KlassenLightsource Klasse– Einfache Punktlichtquelle
Vector mLocation; // PositionVector mLocation; // PositionVector mColor; // Lichtstärke I als Farbe I_rgb
Material Klasse– Phong BRDF
Vector mColor; // Farbe der OberflächeVector mColor; // Farbe der Oberfläche float mDiffuse; // Diffuser Reflexionsgrad [0..1],
// diffuser Reflexionsgrad als Farbe: mDiffuse * mColor
float mSpecular; // Spekularer Reflexionsgrad [0..1] float mPhongExponent; // Phong Exponent
Raytracer KlassenRay Klasse– Strahl
Vector mOrigin; // StrahlanfangVector mOrigin; // StrahlanfangVector mDirection; // Strahlrichtung (nicht normalisiert)
Intersection Klasse– Speichert Information über Schnittpunkt
Ray mRay; // Strahlfloat mLambda; // Geradenparameter Lambda; pObject* mObject; // Geschnittenes ObjektVector mLocation; // SchnittpunktVector mNormal; // Normale am Schnittpunkt
14
Raytracer KlassenObject Klasse– Abstrakte Basisklasse für alle Geometrieobjekte
– Schnittpunkt von Strahl mit Objekt
virtual bool closestIntersection(Intersection& hit)=0; virtual bool anyIntersection(Ray& ray, float maxLambda)=0;
– Normale am Schnittpunkti t l id l N l(I t ti & hit) 0virtual void calcNormal(Intersection& hit)=0;
int getMaterialIndex() const; // Material des Objekts
Raytracer KlassenSphere Klasse– Kugel, speichert Mittelpunkt und Radius– Abgeleitet von ObjectAbgeleitet von Object
Triangle Klasse– Dreieck, speichert Eckpunkte– Abgeleitet von Object
15
Raytracer KlassenList Klasse– Speichert Liste von Objekten
typedef std::vector<Object*> ObjectList;ObjectList items; //! Vector mit den hinzugefuegten Objekten
void addObject(Object* newChild); // Fuegt ein Objekt der Liste hinzu
S O– Schnittpunkt mit Liste von Objekten bestimmen
bool closestIntersection(Intersection& hit); bool anyIntersection(Ray& ray, float maxLambda);
Raytracer Klassen
Camera Klasse– Alle Eigenschaften der Kamera
from, at, up, angleIntern umgerechnet in Vektor „nach rechts“ und „nach unten“
– Generiert Primärstrahlen durch Pixel (x,y)
Scene Klasse– Speichert alle Daten der Szene
Liste aller ObjekteListe aller MaterialienListe aller LichtquellenKamera
16
Raytracer Klassen
Raytracer Klasse– Hauptklasse
– trace und shade Methoden
– renderLine: eine Zeile berechnenRufe trace() pro Pixel der Zeile auf (Primärstrahl)Setze Pixelfarbe
– Speichert Bild als out.ppm ab
Raytracer Ablauf
main.cpp– Generiere einfache Szene
4 bunte Kugeln auf grüner Bodenfläche (2 Dreiecke)Alle Objekte sind halb diffus, halb spekular2 Lichtquellen Kamera
Danach läuft nur noch die display() Funktion– In der OpenGL display() Funktion wird immer eine Zeile
berechnet (renderLine) und dann ausgegeben
17
Raytracer AblaufRaytracer– Vector trace(Strahl)
Falls Schnittpunkt mit Szene gefundeng– return shade(Schnittpunkt)
sonst– return BackgroundColor
– Vector shade(Schnittpunkt)Für alle Lichtquellen
– Falls Schnittpunkt nicht im Schattenp» Berechne diffuse und spekulare Beleuchtung » color = color + material->shade()
Falls Material spekular– Berechne reflektierten Vektor– color = color + rhoSpecular * trace(reflect)
AufgabeVector Material::shade(Intersection& hit, Lightsource& light)
– Gegebenglight: Punktlichtquelle (farbige Lichtstärke, Position)aktuelle Klasse: Material (Farbe, diffuser und spekularer Reflexionsgrad von aktuellem Material)hit: Schnittpunkt, Oberflächennormale und aktueller Strahl
– Gesucht(farbige) Leuchtdichte nach Phong Beleuchtungsmodell
Lichtquelle
StrahlNormale
Lichtquelle