Bild-basierte Beleuchtung virtueller Objekte in Echtzeit ...cg/Studienarbeiten/hdrwavelet.pdf ·...
Transcript of Bild-basierte Beleuchtung virtueller Objekte in Echtzeit ...cg/Studienarbeiten/hdrwavelet.pdf ·...
Bild-basierte Beleuchtung virtueller Objekte in
Echtzeit mit Hilfe von Wavelets
Tobias Eble
18. Marz 2005
Inhaltsverzeichnis
1 Einleitung 2
2 Wavelets 3
2.1 anschaulich . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
2.2 mathematisch . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
2.3 Normalisierung . . . . . . . . . . . . . . . . . . . . . . . . . . 5
2.4 Wavelets in 2D . . . . . . . . . . . . . . . . . . . . . . . . . . 6
2.5 Komprimierung . . . . . . . . . . . . . . . . . . . . . . . . . . 7
3 Image-Based Lighting 11
3.1 Umgebungslicht . . . . . . . . . . . . . . . . . . . . . . . . . . 12
3.2 Reprasentation der Umgebung . . . . . . . . . . . . . . . . . . 12
3.3 Beleuchtung . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
4 Implementierung 15
4.1 Vorverarbeitung . . . . . . . . . . . . . . . . . . . . . . . . . . 15
4.2 Laufzeit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
4.3 Programmbeschreibung . . . . . . . . . . . . . . . . . . . . . . 19
4.4 Analyse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
5 Vergelich zu Spherical Harmonics 22
6 Resume und Ausblick 24
1
1 Einleitung
Ziel dieser Ausarbeitung ist es, Bild-basierte Beleuchtung mit Hilfe von wa-
velets zu beschleunigen. Wavelets sind ein mathematisches Werkzeug, mit
dem Bilder effizient komprimiert werden konnen. Durch die Komprimierung
wird der Datensatz auf einen Prozentanteil der ursprunglichen Werte redu-
ziert und somit der Rechenaufwand erheblich verringert. In Kapitel 2 werden
dir Grundlagen der wavelet Theorie erklart. Kapitel 3 beschreibt die Image-
Based Lighting(IBL) Technik. Die Beschreibung des eigentlichen Program-
mes und Details der Umsetzung finden sich in Kapitel 4. Kapitel 5 widmet
sich dem Vergleich zu Spherical Harmonics. Abschließend werden in Kapitel
6 die Ergebnisse zusammengefasst und weitere Moglichkeiten dieser Methode
diskutiert.
2
2 Wavelets
2.1 anschaulich
Dieser Abschnitt soll die Funktionsweise von Wavelets erklaren ohne wei-
ter auf mathematische Details einzugehen [1]. Betrachtet wird zunachst eine
eindimensionales Grauwert-Bild
[ 9 7 3 5]
Durch paarweise Mittelung erhalt man eine Naherung.
[8 4]
Hierbei sind Informationen verloren gegangen. Um das ursprungliche Bild
wieder herzustellen, werden die verlorenen Details gespeichert. Skaliert man
zunachst die Naherung auf die Große des Originalbildes, ergibt sich [8 8 4 4].
Die Differenz zum Original ist [1 -1 -1 1]. Wegen der Symmetrie des arithme-
tischen Mittels, brauchen wir nur einen Koeffizient pro Zahlenpaar. Hierfur
wird definiert, das der Detailkoeffizienten auf den linken Wert addiert und
vom rechten subtrahiert wird. Unsere Detailkoeffizienten sind somit [1 -1],
oder Naherung und Details zusammengefasst.
[ 8 4 | 1 -1 ]
Die verbleibende Naherung [8 4] kann wieder in eine Naherung und Detail-
koeffizienten aufgeteilt werden.
[6 | 2 1 -1]
Diese neue Reprasentation lasst sich ohne Verlust in das Originalbild zuruck-
verwandeln.
2.2 mathematisch
Im Folgenden betrachten wir unser eindimensionales Bild als Funktion uber
dem halboffenen Intervall [0 1). Die Anzahl der Pixel muss eine Zweierpotenz
sein. Zunachst zerlegen wir das Originalbild in einzelne Funktionen. Jedes
3
Pixel bekommt seine eigene Basisfunktion, die sich aus der verschobenen
und skalierten “Box“-Funktion ergibt (Abb. 1).
φ(x) =
1 0 ≤ x < 1
0 sonst
φji (x) = φ(2jx− i)
Die Basisfunktion lassen sich zu einem Vektorraum V j zusammenfassen. Es
gilt V 1 ⊂ V 2 ⊂ V 3 . . . . Ein weiterer Vektrorraum W j wird so gewahlt, dass
er V j zu V j+1 erganzt. Die Basisfunktionen ψ von W j werden als wavelets
bezeichnet. Fur diese Funktionen soll noch eine besondere Bedingung erfullt
sein. Jedes ψ aus W j soll zu jedem φ aus V j orthogonal sein. Orthogonalitat
bezieht sich auf ein inneres Produkt.
< f | g >=
∫ 1
0
f(x)g(x)dx
mit f, g beliebige Elemente aus V j+1 Die zur Box-Funktionen gehorenden
orthogonalen Funktionen sind die Haar wavelets(Abb. 2).
ψ(x) =
1 0 ≤ x < 1/2
−1 1/2 ≤ x < 1
0 sonst
ψji (x) = ψ(2jx− i)
Zuruck zu unserem Beispiel. Das Originalbild lasst sich als Linearkombi-
Abbildung 1: Box-Funktionen von V 2
nation der Basen von V 2 darstellen.
4
Abbildung 2: Haar wavelets von W 1
I(x) = c20φ20 + c21φ
21 + c22φ
22 + c23φ
23
Oder in einer graphischen Version, mit Intensitatswerten des Originalbildes
als Koeffizienten c2i .
Mit den Funktionen aus V 1 und W 1ergibt
Und nun mit den Bases aus V 0, W 0 und W 1
2.3 Normalisierung
Bisher hatten wir fur die Basen Orthogonalitat vorausgesetzt. Diese Forde-
rung werden wir noch verstarken. Eine Basis heist orthonormal, wenn deren
5
Basen zusatzlich normalisiert sind. Mit der L2 Norm ist eine Basis normali-
siert wenn gilt√
< u|u > = 1
Oder anders formuliert: Eine Basis ist orthonormal, wenn fur alle ui, uj
< ui|uj >= δij (1)
das Kronecker-Delta δij = 1 fur i = j, und ansonsten 0, ist. Diese Schreib-
weise wird spater bei der Komprimierung verwendet. Fur die Haar wavelets
werden die bisherigen Definitionen um den Normalisierungsfaktor 2j/2 erwei-
tert.
φji (x) = 2j/2φ(2jx− i)
ψji (x) = 2j/2ψ(2jx− i)
Fur unser Beispiel bedeutet dies, die j-ten Koeffizienten mit dem inversen
Normalisierungsfaktor 2−j/2 zu multiplizieren.
[6 | 2 1√2
−1√2
]
2.4 Wavelets in 2D
Um ein zweidimensionales Bild zu komprimieren gibt es zwei Ansatze. Die
standard decomposition und die non-standard decomposition. Beim Ersteren
6
wird, ahnlich wie bei der 2D Fourier Transformation, zuerst auf alle Bildzei-
len, die eindimensionale wavelet Transformation angewandt. Danach werden
alle Bildspalten umgewandelt.
Bei der non-standard decomposition werden, statt zuerst vollstandig alle Zei-
len und danach alle Spalten zu transformieren, die einzelnen Schritte der
Transformation abwechselnd auf Zeilen und Spalten angewandt. Dies wird
durch Abb. 3 und Abb. 4 verdeutlicht. Beide Versionen erzeugen unterschied-
liche Detailkoeffizienten. Fur die Implementation wurde die non-standard
Version bevorzugt, da die Basisfunktionen eine quadratische Form haben[1].
Abbildung 3: standard decomposition
2.5 Komprimierung
Ein Bild ist komprimiert, wenn weniger Speicher benotigt wird. Man unter-
scheidet zwischen Verlust-freien und -behafteten Kompressionsverfahren. Das
obige Beispiel wurde so gewahlt, dass bei der Transformation keine Bruche
entstehen. Ware dies der Fall, mussten wir die ubliche Quantisierung von
einem byte pro Farbkanal aufgeben und stattdessen auf Flieskommazahlen
7
Abbildung 4: non-standard decomposition
zuruckgreifen. Hierfur gibt es auch ein paar Tricks um die Speicherplatzan-
forderung beizubehalten.
Wir sind allerdings nicht so sehr an der Reduktion der bits pro Pixel in-
teressiert, sondern vielmehr an der Anzahl der Koeffizienten eines Bildes.
Warum, wird in spater deutlich. Wie zuvor bereits erlautert, lasst sich ein
Bild als Linearkombination von Basisfunktionen darstellen.
I(x) =M−1∑
i=0
ciui
Mit M der Anzahl der Basisfunktionen, den Koeffizienten ci und deren Basen
ui. Angenommen die Koeffizienten und die Basisfunktionen werden in einer
anderen Reihenfolge, festgelegt durch die Funktion σ(i), zusammengefasst.
I(x) =M−1∑
i=0
cσ(i)uσ(i)
8
Wir benotigen nun ein zweites Bild I, dass das Original in komprimierter
Form darstellt. Dies soll durch weglassen einiger Koeffizienten erreicht wer-
den.
I(x) =M ′−1∑
i=0
cσ(i)uσ(i)
Der Index i geht nun nur bis M ′, was durch die noch beliebige Abbildung σ
ermoglicht wird.
Der Fehler, der durch die Komprimierung entsteht, wird durch die L2 Norm
festgelegt. Da wir nur an einer Minimierung dieses Fehlers interessiert sind,
konnen wir ihn quadrieren, was dem inneren Produkt des Differenzbildes
entspricht.
||I − I||22 =< I − I | I − I > (2)
Mit M ′ < M kann die Differenz umgeschrieben werden.
I − I =M−1∑
i=0
cσ(i)uσ(i) −M ′−1∑
i=0
cσ(i)uσ(i) (3a)
=(
M ′−1∑
i=0
cσ(i)uσ(i) +M−1∑
i=M ′
cσ(i)uσ(i)
)
−M ′−1∑
i=0
cσ(i)uσ(i) (3b)
=M−1∑
i=M ′
cσ(i)uσ(i) (3c)
Nun wird (3c) in (2) eingesetzt. Hierbei erhalten die Summen unterschiedliche
Indizes, da es sich um zwei getrennt zu betrachtende Funktionen handelt.
||I − I||22 =⟨
M−1∑
i=M ′
cσ(i)uσ(i)
∣
∣
M−1∑
j=M ′
cσ(j)uσ(j)
⟩
=M−1∑
i=M ′
M−1∑
j=M ′
cσ(i)cσ(j) < uσ(i)|uσ(j) >
Nun kommen die orthonormalen Basen ins Spiel. Mit der Definition uber
Kronecker-Deltas (1), gilt < uσ(i)|uσ(j) >= 1, nur dann wenn σ(i) = σ(j),
9
ansonten 0. Somit vereinfacht sich der Fehler weiter zu
||I − I||22 =M−1∑
i=M ′
(cσ(i))2 (4)
In dieser Schreibweise wir klar wie die Abbildung σ auszusehen hat. Um
den durch die Komprimierung entstandenen Fehler zu minimieren, mussen
die Koeffizienten in absteigender Reihnfolge sortiert werden. Da jeder Pixel
einen Koeffizienten hat, kann die Sortierung fur großere Bilder zeitaufwen-
dig sein. Hierfur gibt es optimierte Verfahren [2]. Bei dieser Arbeit sind die
Bilder jedoch klein (16x16-128x128) und werden in einem Vorverarbeitung-
schritt transformiert. Wobei ein beliebiges Sortierverfahren ausreichend ist,
da die Laufzeiteigenschaften nicht betroffen sind.
Alternativ kann das Fehlermaß bezuglich einer anderen Norm definiert werden[1].
Die L∞ Norm stellt sicher, dass kein Pixel einen Fehler großer als ein be-
stimmter Schwellwert aufweist. Hingegen entspricht die L1 Norm mehr dem
vom menschlichen Sehapparat wahrgenommen Fehler [2]. Wegen der einfa-
chen Auswahl der Koeffizienten wurde die L2 Norm ausgewahlt, sie minimiert
den mittleren quadratischen Fehler.
10
3 Image-Based Lighting
Unter Image-Based Lighting(IBL) werden alle Methoden zusammengefasst,
die es ermoglichen, eine Szene oder Objekte unter realen Lichtverhaltnis-
sen mittels eines Bildes der Umgebung zu Beleuchten. Wobei die neu zu
beleuchtenden Objekte als Photographie oder als geometrisches Modell vor-
liegen konnen. IBL ist eine Weiterentwicklung von reflection mapping, einer
Technik, die spiegelnde Eigenschaften einer Oberflache durch ein Bild der
Umgebung simuliert.
Die Anwendungsbereiche liegen in der Bildsynthese, bei der Modelle moglichst
echt wirkend dargestellt werden sollen, und der Bildfusion. Fur eine Hollywood-
Film kann eine Szene gedreht werden, in der spater ein (virtueller) Schau-
spieler passend eingefugt wird. Beleuchtung und Schatten sind eine der wich-
tigsten Merkmale, die Bilder fur den menschlichen Sehapparat realistisch er-
scheinen lassen. IBL kann in folgende Schritte aufgeteilt werden[3]:
1. Das Umgebungslicht wird fur alle Einfallsrichtungen gemessen.
2. Abbilden des eingesammelten Lichtes auf eine Reprasentation der Um-
gebung.
3. Ein Objekt in diese Umgebung einfugen.
4. Beleuchtung des Objektes durch Lichtsimulation der Umgebung
Die Abbildung der gesamten Umgebung auf ein Bild hat seine Vorteile. Fur
eine reale Szene ist es die einfachste Methode um das gesamte Umfeld zu
reprasentieren, anstatt diese zu modellieren. Doch die Abbildung der kom-
plexen Umgebung in eine kompakte Form beinhaltet auch seine Nachteile,
die sich in Vereinfachungen wiedergeben. Es findet kein Austausch von Licht,
ausgehend vom Objekt, in Richtung Umgebung statt. Das Umgebungslicht
wird nur an einem Punkt gemessen, womit man entweder das Objekt als
unendlich klein oder die Umgebung unendlich weit weg annimmt. Fur ein
Punkt eines Objektes bedeutet dies, dass seine Position fur die Beleuchtung
uninteressant ist.
11
3.1 Umgebungslicht
Wie sammelt man Licht ein? Zunachst muss das gesamte Umfeld Photogra-
phiert werden. Manche Digitalkameras bieten sogar direkt die Moglichkeit
Panoramabilder zu erstellen. Hat man keine solche Kamera, gibt es zahlrei-
che Software die aus Einzelbildern ein Panorama-Mosaik erstellt. Verwendet
man ein fisheye Objektiv braucht man weniger Bilder, muss diese allerdings
entsprechend der Linse entzerren.
Weitaus eleganter ist eine Methode, bei der eine verspiegelte Kugel photogra-
phiert wird, auch lightprobe genannt. In dieser Kugel spiegelt sich das gesamte
Umfeld wieder, leider meist auch der Photograph oder zumindest die Kame-
ra. Wir wollen Licht, als photometrische Große, messen. Eine gewohnliche
Digitalkamera bildet jedoch das eingesammelte Licht nicht-linear ab. Einer-
seits um Speicherplatz zu sparen, andererseits um die Darstellung auf nicht-
linearen Ausgabegeraten, wie Kathodenstrahlrohren, fur den Betrachter zu
optimieren[3]. Wegen der ublichen Quantisierung von einem byte pro Farb-
kanal wird nur ein Teil des eigentlichen Wertebereiches des Lichtes erfasst.
Man spricht deshalb auch von Low-Dynamic-Range(LDR) beziehungsweise
High-Dynamic-Range(HDR). In[4] wird ein Verfahren vorgestellt, mit dem
aus einer Serie von Bildern, mit verschiedenen Belichtungszeiten, die Inverse
der nicht-linearen Abbildung genahert werden kann. Aus einer Bilderserie
wird der photometrische Wert des Lichtes rekonstruiert. Hierfur gibt es eine
frei verfugbare Software namens HDRShop(www.debevec.org/HDRShop).
3.2 Reprasentation der Umgebung
Wird Licht aus allen Richtungen einer Umgebung gesammelt, mussen diese in
irgendeiner Form abgespeichert werden. Eine Moglichkeit ist, die Bilder der
verspiegelten Kugel direkt zu verwenden, hat aber den Nachteil, dass Bereiche
unterschiedlich genau gesampelt werden. Eine Alternative besteht darin, alle
Richtungen einer lightprobe auf die sechs Seiten eines Wurfels zu projizieren.
Bei dieser Darstellung, sind alle Richtungen annahernd gleichstark vertreten.
12
Abbildung 5: Umgebungslicht im vertical cross format
3.3 Beleuchtung
Zunachst passen wir die rendering equation fur einfach-direkte Beleuchtung
durch eine environment map unseren Bedurfnissen an.
B(x, ωo) = E(x, ωo) +
∫
Ω
L(ωi)fr(x, ωi → ωo)V (x, ωi)(ωi · n(x)) dωi (5)
Die LichtintensitatB an einem Punkt x, wird durch die Betrachtungsrichtung
ωo, der Selbstemission E und dem Integral uber alle Einfallsrichtungen ωi
festgelegt. Die Lichtquelle besteht aus der Umgebung L. V ist eine binare
Funktionen die angibt, ob die Lichtquelle in einer Richtung verdeckt ist. Die
Reflektionseigenschaften sind durch fr festgelegt. Der Einfallswinkel ergibt
sich aus (ωi · n(x)) zwischen Einfallsrichtung und der Normale n(x).
Diese Funktion direkt zu berechnen ist sehr Rechenaufwendig. Deshalb treffen
wir einige Vereinfachungen. Die Selbstemission E wird weggelassen. Handelt
13
Abbildung 6: Umgebungslicht im lightprobe - angular map format
es sich um rein Diffuse Oberflachen, spielt der Ausfallswinkel ωo keine Rolle.
B(x) =
∫
Ω
L(ωi)fr(x, ωi)V (x, ωi)(ωi · n(x)) dωi (6)
Die vereinfachte Darstellung wird noch etwas umgeschrieben. Zuerst wird
eine Transportfunktion definiert.
T (x, ωi) = fr(x, ωi)V (x, ωi)(ωi · n(x))
Zusammen mit der Umwandlung des Integrals, mit entsprechenden Diskreti-
sierungsfaktoren, in die diskrete Form ergibt sich:
B(xj) =∑
i
T (xj, ωi)L(ωi) (7)
Anstatt der Summe, konnen die einzelnen Werte von L(ωi) zu einem Spal-
tenvektor L, und T (x, ωi) zu einem Zeilenvektor Tj zusammengefasst werden.
Sollen Intensitaten fur mehre Punkte xj, in unserem Fall sind dies die Punkte
eines Modelles, berechnet werden, kann man die Vektoren Tj wiederum zu
einer Matrix zusammenfassen. Womit sich folgende Gleichung in Matrizen-
schreibweise ergibt.
B = TL
14
In der j-ten Zeile von B steht nun die Lichtintensitat an einem Punkt xj.
In dieser Form ist die Gleichung allgemeiner als die rendering equation(5).
Sie erlaubt eine beliebige Parametrisierung der Lichtquellen L. Womit sich
nicht nur weit entferne Quellen als environment maps, sondern auch lokale
Lichtquellen beschreiben lassen. Zudem konnen in die Transportfunktion T
globale Beleuchtungseffekte, wie indirekte Beleuchtung oder subsurface scat-
tering, einfließen. Die einzige Bedingung, ist die Beschrankung auf diffuse
Materialien fur die endgultige Darstellung[5]. Allgemein werden diese Arten
unter pre-computed radiance transfer zusammengefasst.
4 Implementierung
In diesem Abschnitt wird der Ablauf des eigentlichen Programmes und dessen
Details beschrieben.
4.1 Vorverarbeitung
Ausgehend von jedem Vertex, der zu beleuchtenden Szene, wird die Sicht-
barkeit zur Umgebung ermittelt, die V -Matrix. Dies geschieht durch rendern
eine cubemap an jedem Punkt der Oberflache. Diese cubemaps mussen alle
gleich ausgerichtet sein. Hierfur werden pbuffers verwendet, eine Methode die
leider noch nicht in den OpenGL-Standard ubernommen wurde, aber wenigs-
tens Kartenunabhangig uber WindowsGL(WGL) Erweiterungen verfugbar
ist. Ein pbuffer ist ein OpenGL render context der nicht fur die direkte Dar-
stellung auf dem Bildschirm gedacht ist. Mit ihm kann direkt in den Speicher
der Grafikkarte gerendert werden. Zudem bietet sich die Moglichkeit, andere
render-states als fur die Darstellung zu setzten. Die dafur benotigten Erwei-
terungen sind[6]:
WGL ARB EXTENSION STRING Zur Uberprufung der OpenGL Er-
weiterungen
WGL ARB RENDER TEXTURE erlaubt die Verwendung des pbuffers
als Textur
15
WGL ARB PBUFFER Rendern in den Grafikkartenspeicher
WGL ARB PIXELFORMAT Auswahl eines geeigneten Pixelformates
anhand minimaler Kriterien
Zudem wird WGL TEXTURE RECTANGLE NV und WGL TEXTURE -
FLOAT RGBA NV fur die Verwendung von float-Werten benotigt. Wie dem
Namen anzusehen, sind dies Nvidia spezifische Erweiterungen, es existieren
jedoch gleichwertige Alternativen fur ATI-Karten. Ein pbuffer reicht fur die
Erstellung der Sichtbarkeit aus. Fur jeden Vertex und jeweils jede Seite der
cubemap wird die Szene gerendert und anschließend mit glReadPixels in den
Hauptspeicher gelesen. Alle Objekte der Szene werden in Schwarz gezeich-
net und die Seite der Lichtquellen-cubemap in Weiß. Hierbei mussen beide
Seiten eines Dreiecks gezeichnet werden. Somit wird, falls die Kamera einer
cubemap-Seite in das Objekt hineinschaut, dies als Verdeckung registriert.
Algorithmus 1 : Pseudocode fur die Erstellung der Sichtbarkeit
pbuffer.activate();
for each vertex v do
for each vide s of cubemap dosetCamera(v,s);
renderScene();
readPixels(main memory);
end
end
pbuffer.deactivate();
Bisweilen haben wir nur den binaren(schwarz/weiß) Verdeckungsterm V von
T (x, ωi) = fr(x, ωi)V (x, ωi)(ωi · n(x))
betrachtet. Der Punkt x entspricht einem Vertex und die Samples ωi entspre-
chen einem Pixel. Bei der Umwandlung des Integrals uber einem kontinuier-
lichen Wertebereich in eine diskrete Summe, mussen die einzelnen Samples
angepasst werden((6) → (7)). Betrachten wir zunachst eine Seite der cube-
map(Abb. 7). Die Flache, die ein Sample oder Pixel bei einer Auflosung N
16
Abbildung 7:
einnimmt, ist A = 4N2 . Diese wird zunachst mit dem Winkel zwischen der
normalisierten Normalen der Wurfelseite und dem Positionsvektor eines Pi-
xels cosα = n·vT
√v·vT
multipliziert. Wobei n ·vT hier stets 1 ergibt. Danach wird
die Flache durch Division mit dem Quadrat der Lange von v projiziert. Es
ergibt sich die Gleichung
Ap =A
√v · vT
3
Die Reflektionsfunktion fr wurde zur Vereinfachung konstant fur alle Ober-
flachenpunkte und Einfallswinkel gesetzt. Diese konnte aber in einer weiteren
Version in die Berechnung mit eingefugt werden, um die Reflektionseigen-
schaften verschiedener Oberflachen zu simulieren.
Zur Verdeutlichung eine Zusammenfassung:
1. Zuerst die Sichtbarkeit ermitteln.
2. Danach das Lambertsche Beleuchtungsmodell anhand der Oberflachen-
normale ausrechnen.
17
3. Die einzelnen Werte mit den Normalisierungsfaktoren multiplizieren.
4. Hieraus ergibt sich die Transportmatrix T .
In der Implementierung werden die ersten beiden Schritte zusammengefasst,
ein pixelshader berechnet den Lambertterm. Dies wird vom Grafikkarten-
speicher in den Hauptspeicher kopiert. Dort werden die Normalisierungsfak-
toren hinzu multipliziert. Dieser Normalisierungschritt konnte ebenfalls auf
der Grafikkarte stattfinden. Die anschließende Wavelettransformation wird
auf der CPU berechnet. Eine GPU Version ist ebenfalls denkbar, allerdings
werden somit beide Prozessoren genutzt.
4.2 Laufzeit
Nun fehlt nur noch der Lichtvektor L. Der Einfachheit wegen wird ein Wurfel
mit einer lightprobe im vertical cross-Format texturiert. Dieser wird um die
Szene rotiert. Fur jeden Frame werden die sechs Seiten eines kanonisch aus-
gerichteten Wurfels gerendert und in den Hauptspeicher zuruck gelesen und
anschließend wavelet transformiert. Die einfache Implementierung birgt eini-
ge Nachteile in sich. Durch noch fehlende Implementation bilinearer Inter-
polation fur float-Texturen, wird nur der nachstliegendste Texel verwendet.
Fur eine Punktlichtquelle in der Große von einem Texel in der lightprobe,
wird dieser manchmal auf ein oder mehrere Pixel in dem Lichtvektor ab-
gebildet. Bei Bewegung scheint das Licht zu flackern. Dies wird durch die
geringe Auflosung von 64x64 pro Seitenflache verstarkt. Alternativ konnte
das Umgebungslicht zunachst in einer hoheren Auflosung gerendert werden
und anschließend gemittelt werden. Doch die hohere Auflosung bedeutet auch
mehr Daten. Leider ist das zuruck lesen von float-Texturen nicht optimiert,
womit selbst die eigentlich geringe Große von ca. 1MB bei 128x128 viel Zeit
beansprucht. Statt der Grafikhardware-Version ist auch eine reine CPU Ver-
sion denkbar, die deutlich schneller sein sollte.
Die eigentliche Beleuchtung gestaltet sich nun recht einfach. Fur jeden
Vertex wird der Lichtvektor mit dem entsprechenden Zeilenvektor der Tran-
portmatrix multipliziert. Der Zeilenvektor besteht in der Implementierung
18
aus einer Reihe von structs, die den eigentlichen Wert der Koeffizient und
desses ursprunglichen Indizes beinhaltet.
Algorithmus 2 : Pseudocode fur Vektormultiplikation
Vector sum = (0,0,0);
for each vertex v do
for each struct s of v.transportVector dosum += s.value*lightVector[s.index];
end
end
4.3 Programmbeschreibung
Das Programm ladt zunachst eine Beispielszene mit den entsprechenden
visibility-maps. Mittels rechter Maustaste erscheint ein glut-Menu mit fol-
genden Optionen:
load scene Ladt eine Szene im *.g Dateiformat.
load lightprobe Ladt eine Lightprobe im vertical cross Format.
auto tonemap Gleicht die Lichtintensitaten fur die Darstellung auf einem
Monitor an.
rotation → Camera/Lightprobe Legt fest, ob die Kamera oder die light-
probe mit der Maus rotiert werden kann.
drawmode → filled/wireframe Einstellen des rendering-Modus.
visibility map → generate/load/save Verwalten der visibility map.
quality → null/.../full Festlegen von vordefinierten Qualitatsstufen.
Die linke Maustaste aktiviert den Rotationsmodus. Mit den Tasten w/a/s/d
wir im Kamerarotationsmodus nach vorne/links/hinten/rechts bewegt. In der
Konsole erscheinen Statistiken uber das Programm wie zum Beispiel Anzahl
der vertices pro mesh, benotigte Zeit zum Erstellen/Laden/Speichern der
19
Transportmatrix und die gemittelte Anzahl der verwendeten Koeffizienten
bei einer Qualitatsstufe.
Die Auflosung der Seitnenflachen der cubemap werden momentan noch
wahrend der compile-time festgelegt. Alle gezeigten Bilder in dieser Ausar-
beitung wurden mit einer Auslosung von 64x64 erstellt.
4.4 Analyse
An der Implementierung lasst sich sicherlich noch einiges Verbessern, vor al-
lem die Geschwindigkeit. Ziel war es, IBL in Echtzeit zu erreichen. Zunachst
benotigt der Vorverarbeitungsschritt selbst fur kleinere Szenen mit 11k verti-
ces 4 Minuten. Da dieser teilweise auf der Grafikkarte ausgefuhrt wird und da-
nach in den Hauptspeicher kopiert wird ergibt sich ein Maximum bei 8x AGP
von ca. 160 MB/s oder ungefahr 6000 Vertex-Sichtbarkeiten. In der momen-
tanen Implementierung wird lediglich ein Datendurchsatzt von 1-2MB/s er-
reicht. Die Grunde hierfur liegen zum einen in dem ungeeigneten Zeichenmo-
dus mittels glBegin()/glVertex()/glEnd(). Die Daten mussen jedesmal erneut
der Grafikkarte gesendet werden, zudem ergibt sich ein function-overhead der
eine schnelle Ubertragung hindert. Zum anderen wird die Parallelarchitektur
von CPU/GPU nicht ausgenutzt, da erst Daten in den Hauptspeicher zuruck
gelesen werden konnen, wenn der rendering Schritt vollstandig durchgefuhrt
wurde und umgekehrt wartet glReadPixels auf die vollstandige Ubertragung
der Daten. Dies betrifft lediglich den Vorverarbeitungsschritt, der im Idealfall
nur einmal pro Szene durchgefuhrt werden muss.
Gravierend ist die mangelnde Optimierung bei der Beleuchtung in Echt-
zeit. Gerendert wird hier ebenfalls mittels primitive calls. Schneller ware
hierbei sicherlich die Ubertragung per vertex arrays oder gar vertex buffer
objects. Eine genauere Analyse des Programmes ergab, dass die meiste Zeit
fur die Berechnung des wavelet-Integrals benotigt wird. Hauptgrund hierfur
ist die Verteilung der Daten auf dem Hauptspeicher. Die cache-Architektur
wird hierbei sehr schlecht ausgenutzt. Eine Sortierung der Daten fur eine
bessere cache Ausnutzung kann die Laufzeiteigenschaften des Algorithmus
sicherlich wesentlich verbessern. Zudem wurde eine Umstellung der Vektor
20
(a) medium Qualitat (b) low Qualitat
(c) wireframe Darstellung (d) Menu Anzeige
Abbildung 8: screenshots
21
Klasse auf SSE/MMX Erweiterungen die benotigte Zeit pro Bild annahernd
halbieren.
Ein Graph, der die Abhangigkeit von der mittleren Koeffizienten zu Ren-
derzeit pro Bild zeigt, ist in Abbildung 9 zu sehen. Die roten Punkte bzw.
Kreise beziehen sich auf das Beethoven Modell, die blauen Sterne auf das
Harley Modell. Gemessen wurde lediglich die benotigte Zeit fur die Beleuch-
tung des Modells inklusive der Wavelet Transformation des Umgebungslich-
tes. Fur das Beethoven Modell wurden zwei Messungen vorgenommen. In
roten Punkten wurde ein Datensatz mit einer durchschnittlichen Koeffizien-
tenanzahl von 550, in roten Kreisen mit durchschnittlich 416 Koeffizienten,
verwendet. Bemerkenswert ist hierbei das nichtlineare Erscheinugsbild der
Graphen. Dies lasst sich mit der hoheren Wahrscheinlichkeit eines cache hits
bei Verwendung der gesamten Anzahl der Koeffizienten eines Datensatzes
erklaren. In Abbildung 10 ist derselbe Graph zu sehen hier lediglich mit den
Zeiten fur das Harley Modell mittels der Anzahl der vertices skaliert. Als
Testrechner wurde ein 3.3GHz P4 verwendet.Beethoven Harley
#Vertices 11.431 29.898
5 Vergelich zu Spherical Harmonics
Eine Einfuhrung in Spherical Harmonics(SH) und deren Anwendung in IBL
wird in [7] gegeben. Ahnlich wie bei diesem wavelet Ansatz wird zunachst die
Funktion des Umgebungslichtes auf eine neue Basis projiziert. Diese besteht
aus einer orthonormalen Basis aus assozierten Legendre Polynomen. Diese
Funktionen sind, wie der Name SH schon verrat, direkt auf einer Kugelober-
flache definiert. Die einzelnen Basen von SH sind auf der ganzen Oberflache
der Kugel definiert. Lediglich an kleinen Bereichen sind die einzelnen Funk-
tionen nahe an 0. Dies bedeutet das ein Koeffizient einer Basis viele Punkte
auf der Oberflache beeinflusst. Die Annaherung der eigentlichen Funktion
des Lichtes durch SH Koeffizienten erscheint weich. Hierin ist der Hauptun-
terschied zwischen dem wavelet und dem SH Ansatz begrundet. SH eignet
sich sehr gut, um mit wenigen Koeffizienten niederfrequente Beleuchtung
22
0 100 200 300 400 500 6000
10
20
30
40
50
60
70
80
90
100tim
e in
ms
average coefficients
beethovenbeethovenharley
Abbildung 9: Laufzeiteigenschaften
anzunahern, hingegen hat diese Methode ein Problem bei hochfrequenten
Anteilen diese zu lokalisieren. Zum Beispiel bei einer Punktlichtquelle. Wa-
velets hingegen brauchen, Aufgrund der unstetigen Basisfunktionen, fur eine
”weiche“ Beleuchtung eine hohe Anzahl an Koeffizienten (Abbildung 11).
Jedoch lasst sich die Anzahl der Koeffizienten beim wavelet Ansatz durch
nicht-lineare Komprimierung verringern. Fur SH ist mir kein vergleichbarer
Ansatz bekannt.
Die eigentliche Berechnung der Beleuchtung gestaltet sich bei beiden
Ansatzen ahnlich. Sie besteht im wesentlichen aus einer Summation von Pro-
dukten. Jedoch kommt bei dem wavelet Ansatz der unregelmaßige Speicher-
zugriff Aufgrund der nichtlinearen Komprimierung hinzu. Dieser Effekt kann
durch Sortierung oder Komprimierung des Umgebungslichtes und geschickte
Anordnung der Daten verringert werden.
23
0 100 200 300 400 500 6000
5
10
15
20
25
30
35
40
45
50
average coefficients
time
in m
s
Abbildung 10: Laufzeiteigenschaften mit Harley skaliert
6 Resume und Ausblick
Die Qualitat der Darstellung hat noch zwei Probleme. Durch die Berech-
nung der Beleuchtung pro Vertex und ungunstiger Triangulierung entsteht
am Rand von Schatten ein deutlich sichtbares ZickZack Muster. Alterna-
tiv konnte auch jeder Oberflache eine Textur zugewiesen werden und die
Berechnung pro Pixel durchgefuhrt werden. Durch bilineare Interpolation
verschwindet dieses Artefakt. Zudem wird die unregelmaßige Verfeinerung
eines 3D Modells durch eine gleichmaßige ersetzt. Das zweite Problem be-
trifft die Rotation der lightprobe. Dieser Schritt wird mittels OpenGL geren-
dert. Durch die niedrige Auflosung enstehen aliasing-Artefakte die sich bei
Bewegung durch Flackern bemerkbar machten Dies entsteht durch die feh-
lende Interpolation bei Flieskommazahlen gangiger Grafikhardware. Die neue
Generation der Geforce6800 bietet diese Funktion. Eine Moglichkeit dies zu
umgehen bestunde darin, die Auflosung fur die Erstellung der rotierten light-
24
Abbildung 11: Vergleich von SH und wavelets Naherung von St.Peters Ba-silica mit hochfrequenten Anteil links und niederfrequent auf der rechtenSeite.
probe zu erhohen und danach zu mitteln. Ebenfalls konnte die Berechnung
der sechs Seitenflachen auf der CPU stattfinden und dort mittels subsampling
verbessert werden. Zudem wird beim Vorverarbeitungsschritt die Tranport-
matrix in der spater verwendeten Auflosung erstellt. Aliasing Artefakte, die
durch feine Strukturen entstehen, gehen somit in die Berechnung der Beleuch-
tung mit ein. Antialiasing oder multisampling wurde Abhilfe schaffen, sind
aber nicht implementiert worden. Interessant ware auch die Untersuchung,
wie sich dieser Ansatz auf andere orthonormale wavelet Basen auswirkt, spe-
ziell ob er sich auf Spherical Wavlets anwenden lasst [8].
Literatur
[1] Eric J. Stollnitz, Tony D. DeRose, David H. Salesin
Wavelets for Computer Graphics: A Primer
University of Whashington, Technical Report 94-09-11
[2] R. DeVore, B. Jawerth, B. Lucier
Image compression through wavelet transform coding
IEEE Transactions on Information Theroy, 38(2):719-746, Marz 1992
25
[3] Paul Debevec
Image-Based Lighting
IEEE Computer Graphics and Applications, March/April 2002
[4] Paul Debevec, Jitendra Malik
Recovering High Dynamic Range Radiance Maps from Photographs
SIGGRAPH 97, August 1997
[5] Ren Ng, Ravi Ramamoorthi, Pat Hanrahan
All-Frequency Shadows Using Non-linear Wavelet Lighting Approxima-
tion
ACM Transactions on Graphics, July 2003
[6] Chris Wynn
OpenGL Render-to-Texture
developers.nvida.com
[7] Robin Green
Spherical Harmonic Lighting: The Gritty Details
[8] Peter Schroeder, Wim Sweldens
Spherical Wavelets: Efficiently Representing Functions on the Sphere
26
Abbildung 12: Beethoven mit 250 Koeffizienten
Abbildung 13: Beethoven mit 53 Koeffizienten
27
Abbildung 14: Beethoven mit 43 Koeffizienten
Abbildung 15: Harley mit 340 Koeffizienten und uberlagertem mesh
28