17
1 Praktikum Praktikum Globale Beleuchtung Thorsten Grosch Wer bin ich Thorsten Grosch Seit September 2009 Juniorprofessor für CV in Magdeburg Davor… Studium Informatik TU Darmstadt Fraunhofer IGD Lichtsimulation (Radiosity) Universität Koblenz Landau (die andere CV Uni) Aufbau der Computergrafik Lehre Doktorarbeit Doktorarbeit Erweiterung von realen Bildern mit korrekter Beleuchtung Post-Doc am MPI Informatik Saarbrücken Echtzeit-Beleuchtung mit der GPU

Praktikum Globale Beleuchtung...1 Praktikum Globale Beleuchtung Thorsten Grosch Wer bin ich Thorsten Grosch Seit September 2009 Juniorprofessor für CV in Magggdeburg Davor… –

  • 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