Textur Mapping

Transcrição

Textur Mapping
DistFracEx3D
Interaktive Visualisierung von Mandelbrotmengen als fraktale Landschaften
Teil 1
Fachhochschule Fulda
Fachbereich Angewandte Informatik und Mathematik
Lehrveranstaltung Graphikprogrammierung und Parallelverarbeitung
Eingereicht von:
Timo Götzelmann
Sturmiusstrasse 6
36037 Fulda
Fulda, 31. März 2004
Interaktive Darstellung von Mandelbrotmengen als fraktale Landschaften, Teil 1
Seite: 1
Inhaltsverzeichnis
Vorwort
3
1.
Struktur des Programms
4
2.
Generierung der Fraktale
4
3.
Generierung der Fraktallandschaft
5
3.1
Umwandlung in ein 3D-Landschaftsmodell
5
3.1.1
Umwandlung Koordinaten
5
3.1.2
Wahl der Primitive
6
3.1.2.1 GL_QUADS vs. GL_QUAD_STRIP
6
3.1.2.2
Betrachtung der Speicherkomplexität
7
3.1.2.3
Kritische Betrachtung
7
3.2
Logarithmierung
8
3.3
Normalisierung der Daten
8
3.4
Glättung der Fraktallandschaft
8
3.4.1
Mittelungsfilter
9
3.4.2
Medianfilter
10
4.
Texturerzeugung
11
4.1
Landschaftstextur
11
4.1.1
Einteilung der Ebenenregionen
11
4.1.2
Synthese der Teiltexturen
12
4.1.3
Spannen nicht erlaubt
13
4.2
Himmelstextur
13
4.2.1
Generierung mittels Fourierreihe
13
4.2.2
Generierung mittels Zufallswerten
15
5.
Optimierungen
17
5.1
Vernachlässigen der Rückseiten
17
5.2
Beseitigen des Flackerns
17
5.3
Nebeleffekt
18
5.4
Anpassung der Sichtweite
18
5.4.1
Maximal mögliche Sichtweite
18
5.4.2
Optimierungen der Sichtweite
19
Timo Götzelmann
Interaktive Darstellung von Mandelbrotmengen als fraktale Landschaften, Teil 1
Seite: 2
5.5
Textur-Detailstufen
20
5.6
Texturüberlagerung
21
5.7
Bäume
21
6
Ausblick und mögliche Erweiterungen
23
Quellenverzeichnis
25
Anhang
A
Systemvoraussetzungen
26
B
Benutzerdokumentaion
27
B.1
Grundlegende Interaktionsmöglichkeiten
27
B.2
Änderung der Auslösung/ des Anzeigemodus
28
B.3
Zusatzoptionen mittels Mausmenü
28
C
Installation der MPI-Implementierung MPICH 1.2.5 unter Windows NT
30
D
Quellenangaben für Texturen
33
Timo Götzelmann
Interaktive Darstellung von Mandelbrotmengen als fraktale Landschaften, Teil 1
Seite: 3
Vorwort
Im Rahmen einer Studienarbeit der Veranstaltung „Systemprogrammierung“ habe ich es mir als
Aufgabe gemacht, Mandelbrotmengen als 3D-Fraktallandschaft möglichst anschaulich
darzustellen. Des weiteren soll die Fraktallandschaft interaktiv unter OpenGL steuerbar sein, was
Echtzeitberechnungen bedingt.
Anschaulich bedeutet, dass ich durch einige Manipulationen an den fraktalen Daten eine
möglichst große Ähnlichkeit zu einer realen Landschaft herstelle. Dies verstößt zwar gegen das
Expressivitätskriterium (vgl. [Schu 00/1]), d.h. es bedeutet eine Verfälschung der
Ausgangsdaten, jedoch lassen sich die Daten zum größten Teil zu den Ausgangsdaten
rückführen, d.h. die Manipulationen sind reversibel und damit nicht verheerend.
Des weiteren sind diese Manipulationen im dargelegten Anwendungskontext unbedingt
notwendig, um die Daten auch anschaulich und landschaftsähnlich darzustellen. Dies entspricht
dem Grundsatz der Effektivität von Visualisierungen (vgl. [Schu 00/1]).
Aufgrund der Beschränkung des maximalen Umfangs der Dokumentation sind hier nur die
wichtigsten Aspekte zu finden. Weitere Informationen liefert jedoch die Dokumentation des
Quellcodes.
Als mögliche Anwendung habe ich beispielsweise den Tag der offenen Türen an der
Fachhochschule Fulda gesehen. Die entwickelte Lösung stellt eine anschauliche, geradezu
spielerische Einführung in die Thematik der Mathematik und Informatik dar, welche Brücken
zwischen verschiedenen Themenbereichen wie Algorithmen, Graphische Datenverarbeitung,
Parallelverarbeitung und den damit verbundenen Netzwerken schlägt.
Es ist denkbar, dass es möglich ist, bei Informatik-Interessierten weiteres Interesse an einem
Studium an der FH Fulda zu wecken.
Timo Götzelmann
Interaktive Darstellung von Mandelbrotmengen als fraktale Landschaften, Teil 1
Seite: 4
1. Struktur des Programms
LandschaftsFraktalBerechnung
TexturFraktalBerechnung
3DDrahtgitter
erstellen
Datenaufbereitung
Texturen
m ischen und
blenden
TexturEbenen
Laden
Mapping und
Erstellung
Displayliste
4
Him m elsDrahtgitter
berechnen
Him m elsTextur
berechnen
W asserfläche
erstellen
Mapping und
Erstellung
Displayliste
Szene
rendern
Interaktion
Benutzer
Mapping und
Erstellung
Displayliste
W assertextur
laden
1
Verteilung der
Grünflächen
Baum textur
laden
Baum Prim itive
erstellen
Mapping und
Erstellung
Displayliste
TransparenzTextur
erstellen
1
2. Generierung der Fraktale
Die entwickelte Lösung beschränkt sich auf Mandelbrotmengen und Juliamengen. Auf den
mathematischen Hintergrund will ich an dieser Stelle nicht eingehen, hierzu findet man in jeder
größeren Bibliothek reichhaltig Literatur.
Timo Götzelmann
Interaktive Darstellung von Mandelbrotmengen als fraktale Landschaften, Teil 1
Seite: 5
Es ist dem Benutzer überlassen, wie er seine Fraktale berechnen lassen will. Entweder auf nur
einem Prozessor oder mittels des Message- Passing- Interface (MPI) auf mehreren Prozessoren
lokal, oder aber auch auf jeweils mehreren Prozessoren auf mehreren Rechnern.
Die Berechnung von Mandelbrotmengen und Juliamengen ist ein massiv paralleles Problem und
daher unter Verwendung des MPI ideal zu verteilen. Die Berechnung erfolgt nach Übergabe der
Parameter und liefert zweidimensionale Daten zurück. Dies geschieht derart, dass der MPIServer das Problem aufbricht in n Teilprobleme, diese in eine Warteschlange einreiht und auf die
m Rechner verteilt.1
Hierbei hält der MPI-Server fest, welcher MPI-Client gerade welches Teilproblem bearbeitet.
Sobald die Anzahl der verbleibenden Teilprobleme kleiner ist als die Anzahl der verbleibenden
Rechner, also nRest < m gilt, schickt der MPI-Server die restlichen Teilprobleme ebenfalls an die
Rechner, die gerade nicht beschäftigt sind. Somit wird gleichzeitig durch einfache Weise eine
Lastverteilung und eine Minimierung der Berechungszeit erreicht.
Client 1
Teildaten
FraktalModul
Client n
Teildaten
FraktalModul
Server
Daten
Ergebnisse
3. Generierung der Fraktallandschaft
Die folgenden Algorithmen sind mitunter sehr rechenaufwändig, jedoch werden diese vorab
ausgeführt
und
beeinflussen
damit
die
Ausführungsgeschwindigkeit
Simulationsphase nicht.
3.1 Umwandlung in ein 3D-Landschaftsmodell
3.1.1 Umwandlung Koordinaten
Timo Götzelmann
während
der
Interaktive Darstellung von Mandelbrotmengen als fraktale Landschaften, Teil 1
Seite: 6
Die zweidimensionalen Daten werden in ein dreidimensionales Bezugssystem überführt, indem
die x- und y-Koordinaten auf ein regelmäßiges Gitter übertragen werden2 und der jeweilige
Farbwert der einzelnen Bildpunkte als z-Koordinate dient.
Man kann aber nicht von dreidimensionalen Daten sprechen, da die einzelnen Datenfelder im
dreidimensionalen Bezugssystem keinen Wert enthalten, oder bestenfalls einen unären. Ebenso
existiert pro x- beziehungsweise y-Koordinate in jedem Fall höchstens ein z-Wert.
Zwar wird im späteren Verlauf eine Textur auf diese Felder gemappt, sodass man sagen könnte,
diese Felder im dreidimensionalen Bezugssystem enthalten einen Wert, jedoch ist dieser Wert
eindeutig vom z-Wert abhängig.
3.1.2 Wahl der Primitive
3.1.2.1 GL_QUADS vs. GL_QUAD_STRIP
Für den Aufbau der Drahtgitters habe ich den Typ GL_QUAD_STRIP verwendet, da hiermit
Speicherplatz für die Vertices gespart werden kann, welches sich entscheidend auf die
Ausführungsgeschwindigkeit auswirken kann.
Beispiel:
Definiert man das Drahtgitter mittels GL_QUADS, muss man die angrenzenden Eckpunkte der
einzelnen Primitive mit den gleichen Koordinaten versehen. In
diesem Fall wären das die Vertices 2 und 4 bzw. 3 und 5.
Theoretisch dürfte keine Lücke zwischen den beiden Primitiven
existieren. Jedoch ist es implementierungsabhängig, ob dies auch
praktisch der Fall ist.3
Abbildung 1
Bei GL_QUAD_STRIP entstehen prinzipiell keine Lücken zwischen zwei aufeinander folgenden
Primitiven. Dieser Datentyp vermindert die Anzahl der
definierten Vertices (siehe hierzu auch 2.1.2.1) und spart damit
Speicherplatz. Dieser Speicherplatz wirkt sich ebenso auf die
Ausführungsgeschwindigkeit aus, da weniger Daten im Speicher
verschoben werden müssen. Da wir aber ein zweidimensionales
Drahtgitter verwenden, werden doch noch Lücken zwischen den
1
wobei gilt n ≥ m .
d.h. es gilt R → R
3
beispielsweise durch einen ungenauen Tiefenpuffer oder Rundungsfehler.
2
2
3
Timo Götzelmann
Abbildung 2
Interaktive Darstellung von Mandelbrotmengen als fraktale Landschaften, Teil 1
Seite: 7
einzelnen Zeilen der aneinander gefügten Quadrate auftreten, allerdings gelingt es uns mittels
dieser Technik, die Anzahl der möglichen Lücken auf die Hälfte zu reduzieren, indem wir Zeilen
von Quadraten erzeugen.
3.1.2.2 Betrachtung der Speicher-Komplexität:
Definiert man einen Streifen (x=2; Ausweitung in eine Dimension y) wie in unserem Beispiel, so
muss man also y-1 Quadrate definieren, d.h. 4(y-1) Vertices.
Ohne Verbindung der einzelnen Vertices an den Ecken der Quadrate (also mittels
 y
 y
GL_QUAD_STRIP) sind lediglich   Quadrate nötig und damit 4  Vertices. Demnach
2
2
wären also bei einer Ausdehnung in eine Richtung bei großen y nahezu die doppelte Anzahl
Vertices notwendig.
Genauer:




 fVerticesMitVerbinden ( y ) 
4( y − 1) 



lim 
= 2.
 = lim
y →∞ f
 VerticesMitVerbinden ( y )  y →∞ 4  y  
   
 2 
Ferner muss man bei einem Drahtgitter mit Ausdehnung in eine Dimension x, wie auch in eine
Dimension y folglich (x-1 )(y-1 ) Quadrate und somit 4(x-1 )(y-1 ) Vertices definieren.
Wäre die Möglichkeit gegeben, dieses Verbinden der Polygone, wie es bei GL_QUAD_STRIP
der Fall ist, in eine Dimension x, wie auch in eine Dimension y anzuwenden, wären lediglich
 x  y 
 x  y 
 2   2  Quadrate notwendig und damit 4 2   2  Vertices. Demnach würde dies bei groß
gewählten x und y eine Ersparnis von beinahe Faktor 4 für die Anzahl der benötigten Vertices
darstellen.
Genauer:




 gVerticesOhneVerbinden ( x, y ) 
4( x − 1)( y − 1) 

 = lim
= 4.
lim 
x , y →∞  g
 VerticesMitVerbinden ( x, y )  x , y →∞ 4  x   y  
    
  2  2  
Wäre es also möglich einen Primitiven-Typ mit zwei nebeneinander liegenden Strip-Flächen zu
entwickeln1, könnte man noch einmal das Doppelte an Speicherbedarf gegenüber den
1
beispielsweise mit der Bezeichnung GL_QUAD_DOUBLE_STRIP oder GL_TRIANGLE_DOUBLE_STRIP.
Timo Götzelmann
Interaktive Darstellung von Mandelbrotmengen als fraktale Landschaften, Teil 1
Seite: 8
Primitiven-Typen mit einer Strip-Fläche einsparen. Diese Typen wären ideal, Drahtgitter zu
definieren.
3.1.2.3 Kritische Betrachtung
Bei Verwendung eines Dreiecksdrahtgitters - anstatt eines Vierecksdrahtgitters - hätte man zwar
mehr Dreiecke benötigt, jedoch wäre dies eventuell trotzdem schneller, denn heutige 3DBeschleuniger sind auf Dreiecke optimiert, da diese zwangsläufig planar und konvex sind. Dies
ist zwar bei unserer Anwendung mit Vierecken auch der Fall, jedoch könnten diese intern
automatisch in jeweils 2 Dreiecke umgewandelt werden, was zwar sehr schnell hardwareseitig
umgesetzt wird, jedoch dennoch bei extremer Ausreizung der Hardware ins Gewicht fallen kann.
3.2 Logarithmierung
Bei Betrachtung realer Gebirge fällt auf, dass ein nicht linearer Anstieg gegeben ist. Vielmehr
ähnelt die Gebirgskontur einem exponentiellen Anstieg. Zwar verstößt diese und die folgenden
Operationen gegen das Expressivitätskriterium1, doch tragen eben diese erheblich zur
Effektivität der Visualisierung bei.
3.3 Normalisierung der Daten
Die Höhendaten werden anschließend mit dem Kehrwert des Maximalwertes multipliziert.
D.h. für alle Höhenwerte gilt:
v′x , y = v x , y *
1
vmax

wobei : vmax = max v x0 ,y0 ,


 x0 = 1,s x 
.


1
y
,s
=
0
y


Dadurch ist sichergestellt, dass eine maximale Höhe der Gebirgsformationen nie überschritten
werden kann.
Somit besteht keine Beschränkung mehr für die Eingabedaten, weitere Arten von Ausgangsdaten
und damit weitere Anwendungen der Graphikengine sind denkbar2.
3.4 Glättung der Fraktallandschaft
1
2
Siehe auch Vorwort.
Sofern die Darstellung von Daten als 3D-Landschaft Sinn macht.
Timo Götzelmann
Interaktive Darstellung von Mandelbrotmengen als fraktale Landschaften, Teil 1
Seite: 9
Die Punkte des Drahtgitters enthalten noch sehr sprunghafte Werte, sodass dies nicht sehr viel
Ähnlichkeit mit realen Landschaften aufweist. Reale Landschaften sind Verwitterungsprozessen
ausgesetzt, welche durch 2 verschiedene Algorithmen zur Kantenglättung nachgebildet werden.
Diese erzielen je nach Beschaffenheit der Landschaft mehr oder weniger realistische Ergebnisse.
Einige
weitere
Verfahren
zur
Glättung
der
Landschaft,
beispielsweise
mittels
Fouriertransformation bzw. Binominalfiltern, sind unter anderem in [Leh 97] und [Jäh 02]
beschrieben.
3.4.1 Mittelungsfilter
Der Mittelungsfilter glättet die einzelnen Höhenwerte, indem er den Mittelwert der benachbarten
Höhenwerte anteilig (oder nach Gewichtung) mit dem aktuellen Höhenwert verrechnet.
Für einen Filter, der sx*sy benachbarte Höhenwerte verrechnen soll, ist genauso eine sx*sy
Gewichtungsmatrix notwendig. Im Fraktalexplorer wird eine 3*3 Matrix wie folgt verwendet:
 1 1 1


1 1 1.
1 1 1


Abbildung 3
Die Berechnung der einzelnen Höhenwerte erfolgt im allgemeinen Fall ( s x , s y ∈ Ζ ):
 G sx −1 s y −1 L G s y −1 L G sx −1 s y −1 
 x− 2 , y − 2

, y−
x, y−
x+
2
2
2


M
M
M




L
L
G
G
G
s
x
y
s
−
−
,
1
1
Gewichtungsmatrix:
x− x , y
x+ x , y


2
2


M
M
M


 G x − sx −1, y + s y −1 L G x , y + s y −1 L G x + sx −1, y + s y −1 
2
2
2
2
2 

Formel:
wobei Summe der Gewichte:
v′x , y =
1
∑ Gs x , s y
∑ Gs x , s y =
s y −1
s x −1
2
2
∑
∑v
x + x0 , y + y0
s −1
s −1
x0 = − x y0 = − y
2
2
s x −1
2
∑
s y −1
2
∑G
s −1
s y −1
x0 = − x
y0 = −
2
2
x0 , y 0
Timo Götzelmann
.
G x0 , y0
Interaktive Darstellung von Mandelbrotmengen als fraktale Landschaften, Teil 1
Seite: 10
Für unseren konkreten Fall einer 3*3-Mittelungsmatrix wie in Abbildung 3 gilt der Sonderfall,
dass sämtliche Gewichte = 0 betragen, so dass man sagen kann Gx , y = 1 :
Summe der Gewichte:
∑ G3,3 =
1
1
∑ ∑ 1 = 9.
x0 = −1 y0 = −1
somit gilt für jeden der Höhenwerte:
v′x , y
=
1 1 1
∑ ∑ vx+ x , y+ y
9 x 0 = −1 y 0 = − 1 0 0
=
1
∑ (vx−1, y −1 , vx, y −1 , vx+1, y , vx−1, y −1 , vx, y , vx+1, y , vx−1, y +1 , vx, y +1 , vx+1, y +1 ).
9
Die Wahl der geeigneten Gewichtungsmatrix kann das Ergebnis maßgeblich beeinflussen, so
kann man auch durch eine geeignete Wahl der Werte der Matrix den gegenteiligen Effekt, eine
Schärfung der Konturen des Höhenfeldes, erreichen. Genaueres dazu in [Burdick 97], eine
Erklärung an dieser Stelle würde den Rahmen dieser Arbeit sprengen.
3.4.2 Medianfilter
Eine weitere Filtertechnik erschien für den Fraktalexplorer interessant zu sein, weil sie die
(Berg-) Spitzen der Höhenkarte nicht so gleichmäßig glättet wie der Mittelwert-Algorithmus.
Ebenso wird die Fraktallandschaft hiermit „sanfter“ geglättet, d.h. sehr große Schwankungen der
Höhenwerte beeinflussen nicht die Landschaft. Der Medianfilter behält durch die Wahl der
mittleren Werte in einem bestimmten Umkreis sx und sy des aktuellen Höhenwertes die Konturen
der ursprünglichen Höhenkarte weitgehend bei.
Somit werden die einzelnen Höhenwerte v jeweils wie folgt berechnet ( s x , s y ∈ Ζ ):

sx − 1
sx − 1 


 x0 = x − 2 , x + 2 
~

v′x , y = X v x0 , y0 , 
sy −1
sy −1 

 y0 = y −
,y+


2
2 


wobei s x = Breite des Filterfensters
s y = Höhe des Filterfensters.
In dieser Anwendung ist dies ein 3*3-Medianfilter, sodass hier gilt ( s x = s y = 3 ):
v′x , y
 x = x − 1, x + 1 
~

= X  v x0 , y0 ,  0

 y0 = y − 1, y + 1

~
= X (v x −1, y −1 , v x , y −1 , v x +1, y , v x −1, y −1 , v x , y , v x +1, y , v x −1, y +1 , v x , y +1 , v x +1, y +1 ).
Timo Götzelmann
Interaktive Darstellung von Mandelbrotmengen als fraktale Landschaften, Teil 1
Seite: 11
4. Textur-Erzeugung
Als erstes muss die fraktale Landschaft in verschiedene Höhenebenen eingeteilt werden. D.h. es
wird für jedes Quadrat ermittelt, ob es sich dabei um eine Talregion, eine der beiden
Mittelschichten oder eine Gebirgsregion handelt.
Zur Generierung der Gesamttextur werden zufallsweise pro Höhenschicht kleine Texturen
aneinandergereiht. Die 4 Teiltexturen werden aus Dateien ausgelesen und sind somit einfach
auszutauschen. Mehrere Texturstufen wären ohne großen Aufwand machbar, jedoch nicht
unbedingt notwendig.
4.1 Landschaftstextur
4.1.1 Einteilung der Ebenenregionen
Hierzu wird durch eine einfache Histogramm-Funktion gewährleistet, dass die Verteilung der
Texturen gemäß den vorab definierten Anteilen gleichmäßig und damit nicht abhängig ist von
der durchschnittlichen Höhe der Landschaft.
Vorlauf:
a)
Definition der Anteile der einzelnen Texturen Tn, z.B.:
wobei
∑ (T ) = 1.0
T1=0.5
T2=0.25
T3=0.20
T4=0.05
n
b)
Anzahl_Höhenwerte = HöhenlandschaftDimX * HöhenlandschaftDimY
1)
2)
3)
Sammle alle Werte im Feld Höhenlandschaft[][] in Feld Höhenwerte[]
sortiere Feld Höhenwerte[] (beispielsweise mit Quicksort)
Anteiln = 1 − ∑ (Tn )* Anzahl _ Höhenwerte
4)
Grenzwertn = HöhenwerteAnteiln
wobei gilt: für n Texturebenen gibt es (n-1) Grenzwerte
Komplexität des Algorithmus = Kosten der Sortierfunktion, mindestens jedoch O(n)
Timo Götzelmann
Interaktive Darstellung von Mandelbrotmengen als fraktale Landschaften, Teil 1
Seite: 12
4.1.2 Synthese der Teiltexturen
Hierbei werden den unterschiedlichen Höhenwerten der Fraktallandschaft die zugehörige Textur
(siehe 3.1.1) zugewiesen und somit die Landschaftstextur erzeugt.1
Hierbei wird ein Fehler berechnet, um zwischen den Teiltexturen überzublenden:
foreach y der Landschaftstextur do
foreach x der Landschaftstextur do
if Hoehe[y][x]<grenze1
ebene := 0
fi
else if Hoehe[y][x]<grenze2
ebene := 1
fehler := (Hoehe[y][x] - grenze1) / (grenze2 - grenze1)
fi
else if Hoehe[y][x]<grenze3
ebene := 2
fehler := (Hoehe[y][x] – grenze2) / (grenze3 – grenze2)
fi
else
ebene := 3
fehler := (Hoehe[y][x] – grenze3) / (Hoehemax – grenze3)
esle
Blende Texturen mittels ebene und fehler
od
od
Nun kennzeichnet ebene die zu wählende Textur und fehler den Faktor zur Überblendung von
der Texturebene zur Texturebene-1.
foreach farbe der aktuellen Pixels do
if ebene > 0
TexturPixel = Textur[ebene-1] * (1-fehler) +
Textur[ebene] * fehler
fi
else
TexturPixel = Textur[ebene]
esle
od
Die Zeit- Komplexität des Algorithmus zur Textursynthese beträgt O(n2).
1
Die einzelnen Ebenentexturen werden in einem Feld TexturAnzahlEbenen gehalten.
Timo Götzelmann
Interaktive Darstellung von Mandelbrotmengen als fraktale Landschaften, Teil 1
Seite: 13
4.1.3 Spannen nicht erlaubt
Durch das Einsparen der Primitive (siehe 2.1.2.1) erliegt man leicht dem Irrglauben, die Textur
nur über die vorhandenen Primitive spannen zu müssen, d.h. wie bei GL_QUADS zu verfahren,
mit dem Unterschied, dass lediglich Lücken zwischen den einzelnen Polygonen bestehen.
Dies führt jedoch zu einer Verzerrung der Textur an den Stellen der Lücken und ist bei unserer
Anwendung natürlich nicht erwünscht.
Beispiel:
Als
Textur
soll
zur
Demonstration
eine
Weltkarte
dienen
und
als
Polygon-Typ
GL_QUAD_STRIP. Um die Anzahl der Polygone zu verringern, versucht man also, die
Koordinaten der Vertices 2 und 4 bzw. 3 und 5 (gemäß Abbildung 2) so zu definieren, dass sie
einen gewissen Abstand haben, sodass man ein komplettes Quadrat (und damit in unserem
Beispiel 4 Vertices) einsparen kann. Wie beschrieben, wirkt sich dies positiv auf die
Ausführungsgeschwindigkeit aus. Verteilt man jedoch die Textur, wie bei GL_QUADS, führt
dies nicht zu dem gewünschten Ergebnis, wie Abbildung 44 zeigt.
Abbildung 4
Man kann hier gut erkennen, dass zwischen den beiden außen liegenden Quadraten eine
Streckung der Textur besteht.
Um also GL_QUAD_STRIP zu verwenden, ist es notwendig, dass man die Texturkoordinaten
definiert, als ob keine Lücken zwischen den definierten Vertices vorhanden wären.
4.2 Himmelstextur:
4.2.1 Generierung mittels Fourierreihe
Hier habe ich eine von [Gard 84] entwickelte Formel benutzt:
Timo Götzelmann
Interaktive Darstellung von Mandelbrotmengen als fraktale Landschaften, Teil 1
Seite: 14
n
n
i =1
i =1
T ( x, y ) = k ∑ [ci sin ( f i x + pi ) + T0 ]∑ [ci sin (g i y + qi ) + T0 ]
π
 y
sin  g i 
2  2
π  x
qi = sin  f i 
2  2
f i +1 = 2 f i
pi =
wobei :
g i +1 = 2 g i
ci +1 =
2
fi .
2
Hiernach habe ich einen Algorithmus zu Berechnung der Wolkenstruktur geschrieben.
Das dieser jedoch sehr viele Wiederholungen und erkennbare Muster auswies, musste ich einige
Erweiterungen vornehmen, damit bei jedem Start des Programms eine neue Wolkendecke
entsteht.
Gardners Formel habe ich wie folgt erweitert:
[
T ( x, y ) = k ∑ ci sin ( f i * (x + xOff )* zoom + pi ) + T0
n
i =1
wobei gilt :
]∑ [c sin (g * (y + y )* zoom + q ) + T ]
n
i =1
i
i
Off
i
0




(
)
+
y
y
π 
Off 
pi = sin g i * z1*
2 
 1 



 zoom  





(
)
+
x
x
π 
Off 
qi = sin f i * z 2 *
2 
 1 



 zoom  

f i +1 = 2 f i
g i +1 = 2 g i
ci +1 =
2
fi .
2
Wobei für die Parameter gilt:
Der Faktor ci ist zur Steuerung des Kontrastes dienlich. Wir verwenden einen Kontrastfaktor von
0.1 welcher in unserer Anwendung am realistischsten erscheint. Der von Gardner gegebene
Faktor k leistet ähnliches, nur eben auf die Summe der beiden Teilsummen und ist somit als ein
Timo Götzelmann
Interaktive Darstellung von Mandelbrotmengen als fraktale Landschaften, Teil 1
Seite: 15
Helligkeitsfaktor zu verstehen. Da ci in dieser Anwendung den Wert 1.0 besitzt, könnte er also
einfach entfallen.
Die von Gardner gegebene Variable T0 ist ähnlich wie k für die Helligkeit zuständig, allerdings
als ein Offset. In dieser Anwendung ergab der Wert -0.045 die besten Resultate.
Die Veränderung der Startwerte für f bzw. g streckt bzw. staucht die überlagerten Sinuswellen in
x-Richtung (für f) bzw. y-Richtung (für g). In dieser Anwendung haben beide den Wert 0.07,
welcher sehr realistische Wolken ergab.
Für die Anzahl der Iterationen n habe ich 20 gewählt, da dies einen guten Kompromiss zwischen
Rechenaufwand und Berechnungsqualität darstellt. Zu bemerken ist, dass man bei Änderung der
Anzahl der Iterationen auch die Kontrast- und Helligkeitsfaktoren anpassen muss, damit die
beiden Teilsummen wieder akzeptable Werte ergeben.
Hier wäre bei einer erneuten Erweiterung der Formel eine automatische Steuerung betreffs der
Iterationenzahl gegenüber dem Kontrastwert ci bzw. dem Helligkeitsoffset T0 denkbar. Dies
würde aber den Rahmen dieser Ausarbeitung sprengen.
xOff und yOff haben bei dieser Anwendung Zufallswerte im Bereich von [0..1000]. Sie variieren
den Ausschnitt der Berechnung, um erkennbare Wiederholungen und Muster zu vermeiden.
Ähnlich sind z1 und z2 Zufallsfaktoren im Wertebereich zwischen [0..1] und sichern somit die
Generierung immer neuer Wolkengebilde.
Die Variable zoom definiert, inwieweit in die Berechnung hineingezoomt wird. Große
Zoomfaktoren ergeben weicher verlaufende Wolkentexturen, kleine Zoomfaktoren härtere.
Bei weiterem Interesse zu dieser Formel verweise ich auf den von mir entwickelten „GardnerExplorer“. Dies ist eine von mir entwickelte OpenGL Applikation, mit welcher sich sämtliche
Variablen von Gardners Formel variieren lassen und die direkten Auswirkungen auf das
Ergebnis sofort ersichtlich werden. Auf Anfrage gebe ich gerne dessen Quellcode frei.
4.2.2 Generierung mittels Zufallswerten
Nach Generierung von Zufallswerten erfolgt eine Mehrfachanwendung des so genannten
„Diamond-Square“- Algorithmus um eine Mittelung der Werte herbeizuführen.
Diamond-Square Algorithmus:
Timo Götzelmann
Interaktive Darstellung von Mandelbrotmengen als fraktale Landschaften, Teil 1
Seite: 16
Dieser ursprünglich von [Mil 86] zur Generierung von fraktalen Landschaften durch
Zufallswerte entwickelte Algorithmus kann ebenso zur Generierung von fraktalen Wolken
angewendet werden. Dieser Algorithmus ist in vielen Bildverarbeitungsprogrammen wie
beispielsweise Photoshop implementiert.
Die Größe der Bitmap hat immer 2n+1 zu sein. Die vier Eckpunkte werden mit Zufallswerten
initialisiert. Hier zur Veranschaulichung in der linken der 5x5 Matrizen.
Anschließend wird der „Diamond“- Schritt ausgeführt (Mitte). Dazu wird der Mittelwert der vier
Punkte errechnet und dieser in das Pixel in der Mitte der vier Punkte geschrieben.
Nun wird im „Square“- Schritt dieser Mittelwert jeweils mit einer Zufallsfunktion verrechnet
und in die Punkte zwischen den vier Eckpunkten geschrieben.
Dieser Schritt wird nun mit reduzierter Kantenlänge für jedes Teilquadrat wiederholt. Hierbei
wird dann auch die fraktale Selbstähnlichkeit ersichtlich.
Dieser Algorithmus kann nicht ohne Scheduling- Algorithmus rekursiv implementiert werden.
Es muss unbedingt Ebene für Ebene iteriert werden, da sonst fehlerhafte Werte berechnet
werden.
Betrachtung der Speicher- Komplexität:
Timo Götzelmann
Interaktive Darstellung von Mandelbrotmengen als fraktale Landschaften, Teil 1
Seite: 17
Bei einfacher Anwendung des Algorithmus kommt es zu einer Vervierfachung der Vertices:
 fVerticesDiamondSquared ( x, y ) 
 ( 2 x − 1)( 2 y − 1) 
2
lim 
= lim 

=2 .

x , y →∞ 
x
y
→∞
,
xy


 fVerticesUnsquared ( x, y ) 
Allgemein lässt sich also sagen, dass bei n-facher Anwendung dieses Algorithmus bei m
Dimensionen1 eine Speicherkomplexität von O( 2 n*m ) Vertices ergibt.
5. Optimierungen
In diesem Abschnitt sind einige der wichtigsten Optimierungen in Bezug auf Realismus der
Szene und Ausführungsgeschwindigkeit näher erläutert.
5.1 Vernachlässigung der Rückseiten
Zur Geschwindigkeitsoptimierung wird eine Technik namens „Back Face Culling“ angewendet,
welche die Textur lediglich in einer Richtung auf die Primitive mappt. Schließlich ist es bei
dieser Anwendung nicht nötig, auch auf die „Rückseite“ der generierten Landschaft zu blicken.
Die hierfür benutzten Befehle:
- glEnable(GL_CULL_FACE);
Um das Back Face Culling anzuschalten
- glFrontFace(GL_CW);
Um die sichtbare Seite der Textur festzulegen
5.2 Beseitigen des Flackerns
Wegen der Vielzahl von Vertices und dem zeitraubenden Mapping der Textur habe ich mir das
so genannte „Double-Buffering“ zunutze gemacht, um ein Flackern zu vermeiden. Hierzu
werden zwei Puffer verwendet, einer zum Anzeigen der aktuellen Szene und einer zum Zeichnen
der nächsten Szene. Erst wenn das Zeichnen der nächsten Szene abgeschlossen ist, wird diese
auch durch ein Umschalten der beiden Puffer angezeigt.
Timo Götzelmann
Interaktive Darstellung von Mandelbrotmengen als fraktale Landschaften, Teil 1
Seite: 18
Hierzu benutzte Befehle:
- glutInitDisplayMode(GLUT_DOUBLE) Um die Unterstützung von DoubleBuffering anzuschalten.
- glutSwapBuffers();
Zum Umschalten der beiden Puffer
5.3 Nebeleffekt
Der verwendete Nebel ist exponentieller Nebel und hat zugleich zwei Funktionen. Zum einen
gibt er der Szene mehr Realismus und zum anderen wird er dafür benötigt, um eine Schwäche
des Tiefenpuffers (siehe auch 5.4) auszugleichen.
Für noch mehr Realismus hätte so eine weitere OpenGL Extension, so genannter „Volumetric
Fog“ gesorgt. Dieser ist ab der OpenGL Version 1.3 verfügbar. Man hätte damit Nebel in den
tiefen Regionen der fraktalen Landschaft erzeugen können. Dieses Säumen der Täler mit Nebel
belastet jedoch erheblich die GPU, was nicht im Verhältnis mit der optischen Effekt stand.
5.4 Anpassung der Sichtweite
5.4.1 Maximal mögliche Sichtweite
Mit dem Befehl gluPerspective wird unter anderem die minimale und maximale Sichtweite
eingestellt. Die minimale Sichtweite wählt man sehr klein, damit man möglichst nahe an die
Oberfläche der Landschaft heran fliegen kann. Da die sichtbare Szene je nach Blickpunkt sehr
weitläufig sein kann, muss man normalerweise auch eine große maximale Sichtweite einstellen.
Die maximalen Sichtdistanzen betragen in unserem Fall für x = 12000, y = 12000, z = 350.
In unserem Fall wäre dies der Distanzvektor der Szene:
Distanzmax
= x2 + y 2 + z 2
= 120002 + 120002 + 3502
≈ 16974.
1
In unserem Fall gilt zwar nur m=2, also zwei Dimensionen, jedoch ist es durchaus denkbar, den Algorithmus für
Timo Götzelmann
Interaktive Darstellung von Mandelbrotmengen als fraktale Landschaften, Teil 1
Seite: 19
5.4.2 Optimierung der Sichtweite
Normalerweise stellt eine wie in 5.4.1 berechnete Sichtweite kein Problem dar. Jedoch enthält
die Szene durch die Verwendung einer Wasseroberfläche mehrere coplanare oder zumindest
nahezu coplanare Polygone im Uferbereich.
Bei großen Differenzen im Viewing-Volumen zwischen dem Near- und Far-Wert kommt es zu
Ungenauigkeiten im Tiefenpuffer von OpenGL, welche besonders in der Ferne zu erheblichen
Rendering-Fehlern führt. Diese Fehler lassen sich auch nicht mit einem Tiefentest auf
GL_LEQUAL oder GL_EQUAL beseitigen.
Es gibt 2 Möglichkeiten, um dieses Problem zu beseitigen:
-
Die Verringerung der Differenz zwischen Distanzmin und Distanzmax
-
Der Gebrauch der Polygon Offset Extension.
Da ich wie in Punkt 5.3 beschrieben, exponentiellen Nebel zum Depth-Cueing einsetze, habe ich
mich für die erste Alternative entschieden, da ab einer bestimmten Distanz der Nebel für das
Auge des Benutzers undurchdringbar dicht ist.
Da ich die Nebelfarbe als reines weiß definiert habe, habe ich auch als Hintergrundfarbe die
Farbe weiß gewählt, damit man keinen Unterschied zwischen Nebel und den Polygonen, die
außerhalb des Viewing-Volumens sind, feststellen kann.
Normalerweise ist es für das menschliche Auge unmöglich, Helligkeitsunterschiede von einem
Prozent zu differenzieren [Schu 00/2]. Allerdings lässt sich dieser Wert sehr von
psychologischen Gesichtspunkten beeinflussen und gilt nur unter optimalen Bedingungen.
Tatsächlich ist bei der von mir entwickelten Anwendung bei einem Helligkeitsunterschied von
10 % zwischen Wolken und weißem Hintergrund mit dem Auge unter Normalbedingungen kein
Unterschied auszumachen.
Dieser exponentielle Nebel entspricht der Formel: e(
− Nebeldichte*Dis tan z )
.
m>2 zu erweitern. Ein Beispiel hierfür wäre die Generierung von dreidimensionalen Wolken.
Timo Götzelmann
Interaktive Darstellung von Mandelbrotmengen als fraktale Landschaften, Teil 1
Seite: 20
Die Nebeldichte d von 0.00025 sieht in unserer Szene realistisch aus. Wenn man nun fordert, die
Distanz z so zu wählen, dass eine Sichtbarkeit s von höchstens 10 Prozent gegeben ist1, bevor
man nicht mehr zwischen Nebel und weißem Hintergrund unterscheiden kann, kommt man zu
folgender Gleichung:
s
= e(
− d * zmax )
log ( s )
= −d * zmax .
Mit einer Nebeldichte 0.00025 und max. 10% Lichtdurchlass ergibt dies
 10 
ln 
 ≤ −0.00025* z
 100 
−2.30
≤ −0.00025* z
≥ 9210.4.
z
Somit ist bei einem Abstand von 9210 Einheiten tatsächlich kein Unterschied zu dem vorherigen
Abstand von ~16974 Einheiten festzustellen.
Ein positiver Nebeneffekt dieser Optimierung ist die Reduzierung der Anzahl der zu rendernden
Polygone, und der damit verbundene Geschwindigkeitszuwachs.
5.5 Textur- Detailstufen
Ohne die Technik des Bildens so genannter „Mip-Maps“ kommt es unter Umständen bei
Verkleinerungen von Texeln2 (in der Ferne) zu Farbwertsprüngen und Mustern, welche man in
einer Animation als störend empfindet.
Texturen haben unter OpenGL immer 2n Pixel pro Dimension (abgesehen von einem möglichen
Rand von 2 Pixeln). Man berechnet nun also vorab für die Texturen die in Betracht kommen, alle
Detailstufen 2n-1 pro Dimension mit n → 1 . Dabei werden bei jedem Durchgang 2 Pixel zu
einem Pixel durch Mittelwertbildung zusammengefasst.
Zur Laufzeit wird nun also, falls mehrere Texel einem Pixel zugeordnet werden, das MittelwertPixel der jeweiligen Detailstufe benutzt. Durch die Vorberechnung gibt es hier keine
1
2
D.h. dass höchstens 10 % des Restlichts durch den Nebel sichtbar ist.
Pixel einer Textur.
Timo Götzelmann
Interaktive Darstellung von Mandelbrotmengen als fraktale Landschaften, Teil 1
Seite: 21
Geschwindigkeitseinbußen, jedoch lässt sich zeigen, dass nahezu der doppelte Speicheraufwand
anfällt.
5.6 Texturüberlagerung
Hier habe ich mir eine OpenGL Erweiterung namens „Multitexturing“ (OpenGL Standart 1.1) zu
Nutze gemacht.
Diese erlaubt es, zwei oder mehrere Texturen zu überlagern. Diese Funktion ist in modernen
Graphikkarten hardwaretechnisch unterstützt, womit sich keinerlei Geschwindigkeitsnachteil
ergibt.
Durch diese Technik ist es möglich, die eine Textur über eine Vielzahl von Polygonen zu
spannen (in diesem Falle die vorab berechnete Fraktal-/Landschafts-Textur1), während die
zweite Textur über die Szene gekachelt wird.
Der Vorteil dieser Technik ist, dass bei Vergrößerungen2 eines Texels der Fraktal-/LandschaftsTextur (im Nahbereich) die zweite Textur als Detailtextur wirkt und somit für mehr Realismus
sorgt.
5.7 Bäume
Um die Szene noch mehr an ein Landschaftsbild erinnern zu lassen, habe ich zusätzlich in einer
gewissen Höhenlage Bäume gesetzt.
Die ursprüngliche Textur ist ein normales Bitmap, welches durch ein Programm „Xfrog“ von
Oliver Deussen (siehe [Deussen 97]) erzeugt wurde. Dieses Programm erzeugt fraktale
botanische Gewächse, so genannte „L-Systeme“ sehr realistisch. Diese Datei habe ich derart
modifiziert, dass ich ähnlich wie bei „GIF“-Dateien eine einheitliche Farbe als transparente
Farbe definiert habe und diese dann als normale „BMP“-Datei abgespeichert habe.
Diese Datei habe ich dann mit meinem normalen Bitmap-Lader in ein Feld eingelesen und in
einem zweiten Schritt in ein Feld mit einem Alpha-Wert übertragen.
1
2
Siehe Punkt 4.1.
D.h. mehrere Pixel sind einem Texel zugeordnet.
Timo Götzelmann
Interaktive Darstellung von Mandelbrotmengen als fraktale Landschaften, Teil 1
Seite: 22
Hierbei habe ich dann unterschieden, ob sich die Farbe um die vorher definierte transparente
Farbe handelt oder nicht, und habe somit eine Textur mit Alpha-Wert erzeugen können.
Mittels der Alpha-Funktion konnte ich damit die Bäume mit Zweigen und Blättern darstellen,
ohne dass sichtbar wurde, dass die Textur eigentliche auf ein Quadrat gespannt wurde, denn dort
wo die Textur als transparent definiert war, war sie auch komplett durchsichtig.
Um zu verhindern, dass die Bäume von der Seite gesehen nicht sichtbar sind, habe ich pro Baum
zwei gekreuzte Quadrate verwendet.
Anmerkung: Die Generierung der Orientierungspfeil-Textur erfolgt nach der gleichen Technik,
nur wird diese zusätzlich mit der Blend-Funktion von OpenGL teiltransparent dargestellt.
Timo Götzelmann
Interaktive Darstellung von Mandelbrotmengen als fraktale Landschaften, Teil 1
Seite: 23
6. Ausblick und mögliche Erweiterungen:
Es ist im Rahmen dieser Studienarbeit gelungen, den Gedanken der anschaulichen
Visualisierung von Mandelbrotmengen als Fraktallandschaft umzusetzen. Da es aber so gut wie
immer etwas zu verbessern gibt, vorausgesetzt man hat genügend Zeit, will ich einige meiner
Gedanken zu den Verbesserungsmöglichkeiten schildern.
Eine Optimierung, welche man beispielsweise „UnTesselate“ nennen könnte, wäre denkbar. Dies
würde, unter Berücksichtigung eines zulässigen Fehlers die einzelnen Vierecke des Drahtgitters
derart zusammenfassen, dass ein Drahtgitter mit weniger Primitiven entsteht, ohne dass die
Qualität darunter merklich leidet (dazu u.a. [Strot 02/1]). Dies hätte aber einen komplett neuen
Algorithmus zur Erstellung der aneinander gehängten Polygone zur Folge. Eventuell würde es
nicht möglich sein, zusammenhängende Polygone zu definieren, sodass der positive Effekt
aufgehoben werden würde. Eine gute Lösung wäre eine Aufwandsschätzungsfunktion, welche
Fall für Fall entscheidet, welches Verfahren angewendet wird.
Ebenso denkbar wäre eine Kombination mit einer „Level-of-Detail“ Logik, welche einen
weiteren Geschwindigkeitszuwachs zur Folge hätte.
Eine weitere interessante Verbesserung wäre die Entwicklung eines einfachen Algorithmus, der
die Texturen über die Polygone derart verteilt, dass es bei unterschiedlicher Steigung zu keiner
Streckung der Texturen kommt. Dadurch würden die Texturen auf dem regelmäßigen Gitter auch
bei großen Steigungen nicht oder zumindest weniger verzerrt werden, was sich positiv auf den
Realismus auswirken würde.
Da es sich um eine Fraktallandschaft handelt, die zur besseren Optik auch Bäume enthält, wäre
es ideal, wenn auch die Texturen für die Bäume durch Fraktale1 erzeugt würden. Siehe dazu auch
[Strot 02/2] und [Deussen 97].
Es wäre wirklich interessant, all diese Verbesserungen zu verwirklichen, jedoch würden sie bei
Weitem den Rahmen dieser Arbeit in Zeit und Umfang sprengen.
1
so genannte Lindenmayer-Systeme.
Timo Götzelmann
Interaktive Darstellung von Mandelbrotmengen als fraktale Landschaften, Teil 1
Seite: 24
Es sind durchaus Anwendungen denkbar, in denen die entwickelte Graphikengine ohne größere
Veränderung gleichdimensionale Daten anderer Herkunft ebenso als Landschaft darstellen kann,
vorausgesetzt es macht Sinn, dies zu tun.
Timo Götzelmann
Interaktive Darstellung von Mandelbrotmengen als fraktale Landschaften, Teil 1
Seite: 25
Quellenverzeichnis:
[Burdick 97]
Howard E. Burdick; Digital Imaging; 1. Edition; Computing McGraw- Hill;
ISBN 0-07-913059-3; 1997; S.140
[Deussen 97]
O. Deussen, B. Lintermann; Erzeugung komplexer botanischer Objekte in der
Computergraphik, Informatik Spektrum 20/4; Springer-Verlag; ISSN 01706012
[Gard 84]
Foley, van Dam, Feiner, Hughes; Computer Graphics: Principles and Practice,
2. Edition; Addison Wesley; ISBN 0-201-12110-7; 1993
[Jäh 02]
Bernd Jähne; Digitale Bildverarbeitung; 5. Auflage; Springer-Verlag; ISBN 3540-41260-3; S. 307
[Leh 97]
T. Lehmann, W. Oberschelp, Erich Pelikan, Rudolf Repges; Bildverarbeitung in
der Medizin; Springer Verlag; ISBN 3-540-61458-3; 1997; S.346
[Mil 86]
Gavin S. P. Miller; The definition and rendering of terrain maps; ACM
SIGGRAPH Computer Graphics; ACM Press New York; ISBN: 0-89791-1962;1986; S. 39-48
[Schu 00/1]
H. Schumann, W. Müller; Visualisierung: Grundlagen und allgemeine
Methoden; Springer Verlag; ISBN 3-540-64944-1; S. 9-13
[Schu 00/2]
H. Schumann, W. Müller; Visualisierung: Grundlagen und allgemeine
Methoden; Springer Verlag; ISBN 3-540-64944-1; S. 85
[Strot 02/1]
T. Strothotte, S. Schlechtweg; Non-realistic Computer Graphics; Morgan
Kaufmann Publishers; ISBN 1-55860-787-0; S.229 – 233
[Strot 02/2]
T. Strothotte, S. Schlechtweg; Non-realistic Computer Graphics; Morgan
Kaufmann Publishers; ISBN 1-55860-787-0; S.321 – 325
Timo Götzelmann
Interaktive Darstellung von Mandelbrotmengen als fraktale Landschaften, Teil 1
Seite: 26
Anhang
A. Systemvorsetzungen
Getestete Betriebssysteme: - Windows NT
- Windows 2000
- Windows XP
- Solaris Sparc 9.0
- Solaris X86 9.0
- Linux 8.2 / 9.0
Notwendig:
- Graphikkarte
- mindestens 32 MB Speicher
- OpenGL- Unterstützung ab Version 1.1
- Graphiktreiber mit OpenGL Unterstützung als Schnittstelle
- schneller Prozessor (>= 1.5 GHz)
- freier Festplattenspeicher
- Installation 10 MBytes
- zur Laufzeit je nach Auflösung:
- niedrig
4 MBytes
- mittel
16 MBytes
- hoch
64 MBytes
- Maus
Optional:
- bei Mehrprozessorbetrieb:
- MPI – Implementierung für jeweiliges Betriebssystem
- freigegebener Ordner für das Programm
- unter Windows-Systemen:
- Temporär- Verzeichnis „c:\tmp“
Timo Götzelmann
Interaktive Darstellung von Mandelbrotmengen als fraktale Landschaften, Teil 1
Seite: 27
B. Benutzerdokumentaion
B.1 Grundlegende Interaktionsmöglichkeiten
Die Benutzung der Anwendung ist erdenklich einfach. Mittels der Tasten „+“ bzw. „-„ erhöht
beziehungsweise verringert man die Bewegungsgeschwindigkeit in die Blickrichtung. Man
steuert die „Kamera“ mittels der Maus in die gewünschte Richtung, indem man die linke
Maustaste zur Richtungsänderung gedrückt hält. Eine Kollisionsabfrage verhindert, dass man
sich zu weit von der Szene entfernt, wie auch dass man nicht mit der fraktalen Landschaft
kollidiert oder aber durch sie hindurch „fliegt“.
Für die bessere Orientierung geben zwei Anzeigen über Position und Blickrichtung Auskunft:
Karte
Position (weißer Punkt)
Timo Götzelmann
Richtungspfeil
Interaktive Darstellung von Mandelbrotmengen als fraktale Landschaften, Teil 1
Seite: 28
B.2 Änderung der Auflösung/ des Anzeigemodus
Mittels der Funktionstasten kann man, soweit vom Computer unterstützt, die Auflösung
verändern, beziehungsweise zwischen Fenster- und Vollbildmodus wechseln.
Funktionstaste:
F1: Vollbild- Modus: 640x480 Pixel
F2: Vollbild- Modus: 800x600 Pixel
F3: Vollbild- Modus: 1024x768 Pixel
F4: Vollbild- Modus: 1280x1024 Pixel
F5: Vollbild- Modus: 1600x1200 Pixel
F10: Fenster- Modus: 640x480 Pixel
F11: Fenster- Modus: 800x600 Pixel
F12: Fenster- Modus: 1024x768 Pixel
Achtung:
der Wechsel zwischen den Auflösungen bewirkt erneute Initialisierung der
Szene und somit eine Verzögerung.
B.3 Zusatzoptionen mittels Mausmenü (nur Fenstermodus)
Befindet man sich im Fenster-Modus1 kann man zusätzlich mit der rechten Maustaste eine
Zusatzoption aus dem Mausmenü auswählen.
1
Mausmenüs werden im Vollbildmodus nicht von OpenGL unterstützt.
Timo Götzelmann
Interaktive Darstellung von Mandelbrotmengen als fraktale Landschaften, Teil 1
Seite: 29
Im Filtermenü kann man sich die Originallandschaft wiederherstellen lassen. Daraufhin kann
man so oft man will testen, wie sich die beiden Filter auf die Landschaft auswirken, oder aber
einfach die zerklüftete Originallandschaft erkunden.
Die Option „Regen“ ermöglicht den Regeneffekt zur Laufzeit an und aus zu stellen.
Wählt man „Drahtgitter“ kann man sich die Landschaft als ein solches anzeigen lassen und somit
etwas über den Aufbau der Szene erfahren.
Beenden lässt sich die Anwendung entweder durch Drücken der Escape-Taste oder durch den
entsprechenden Eintrag im Mausmenü.
Timo Götzelmann
Interaktive Darstellung von Mandelbrotmengen als fraktale Landschaften, Teil 1
Seite: 30
C. Installation der MPI- Implementierung MPICH 1.2.5 unter Windows NT
1. Herunterladen der aktuellen Version:
http://www-unix.mcs.anl.gov/~ashton/mpich.nt/
2. Installation mit Administrator-Rechten
Beispielsweise unter C:\Programme\MPICH 1.2.5
3. Einrichten der Umgebung
- Ausführen des Konfigurations-Programms
Start -> Programme -> MPICH -> mpd -> MPICH Configuration tool
- Unter Punkt 1. alle Rechnernamen (z.B. CAE01) eintragen.
- Unter Punkt 2. falls notwendig besondere Einstellungen vornehmen .
- Anschließend unter Punkt 2. „APPLY“ Änderungen übernehmen.
- Falls Fehler auftreten:
- Rechnernamen überprüfen.
- Unter Punkt 1. „SELECT“ auswählen und Fehlermeldungen
beachten.
- Jeder Benutzer kann nun unter
[Installations-Verzeichnis]/mpd/bin/ MPIRegister.exe
seinen Benutzernamen und Passwort verschlüsselt in der Registry abspeichern
lassen (Nur notwendig für komfortablere Arbeitsweise mit dem
Kommandozeilen-Programm mpirun.exe).
Timo Götzelmann
Interaktive Darstellung von Mandelbrotmengen als fraktale Landschaften, Teil 1
Seite: 31
4. Kompilieren von MPI- Programmen unter C
- Folgende Dateien müssen zu den Programmen gebunden werden
wsock32.dll (unter DEV C++ „libwsock32.a“)
mpich.dll ([Installations-Verzeichnis]/SDK/Lib)
Eventuell zusätzlich
mpichd.dll ([Installations-Verzeichnis]/SDK/Lib)
mpe.lib ([Installations-Verzeichnis]/SDK/Lib)
mped.lib ([Installations-Verzeichnis]/SDK/Lib)
- Folgende Include- Dateien müssen im Quellcode eingebunden werden
winsock.h
mpi.h ([Installations-Verzeichnis]/SDK/Include)
- In Windows- Systemen notwendig
Am Programmeinsprungspunkt (main(...)- Routine)
WSADATA wsaData;
if ( WSAStartup(0x101, &wsaData) )
{
printf("Kann leider nicht WinSock- Bibliothek initialisieren.\n");
exit(1);
}
5. Starten des Programms
- mittels MPIRUN.EXE
- von Kommandozeile wie unter Solaris/ Linux
- zusätzliche Optionen:
„ -localonly“ : nur auf lokalem Rechner (bsp. zwei Prozessoren)
„ -logon“
: Erzwingt Eingabe von Benutzer/Passwort
Timo Götzelmann
Interaktive Darstellung von Mandelbrotmengen als fraktale Landschaften, Teil 1
Seite: 32
- mittels graphischem Tool „guiMPIRun.exe“
- Start -> Programme -> MPICH -> mpd -> MPIRun
oder
[Installations-Verzeichnis]/mpd/bin/ guiMPIRun.exe
- Anwendung auswählen
- Zu benutzende Rechner auswählen
- Anzahl Prozesse auswählen
- eventuell erweiterte Optionen wählen
Beispielsweise: „Always prompt for password“ (wie „ –logon“)
- Starten mit „Run“
- ACHTUNG: die zu startende Datei muss sich in einem Netzlaufwerk
beziehungsweise freigebenen Verzeichnis befinden
6. Besondere Hinweise zum Debuggen
- Falls anhand von Textausgaben debuggt wird, ist es speziell unter Windows
wichtig, den Ausgabepuffer nach einer Textausgabe zu leeren, da sonst unter
Umständen die Ausgabe im Datennirvana endet.
Also: „fflush(stdout)“ nach printf… !
Timo Götzelmann
Interaktive Darstellung von Mandelbrotmengen als fraktale Landschaften, Teil 1
Seite: 33
D. Quellenangaben für Texturen
Landschaftsebenen:
„Ebene0.bmp“: http://www.the3dstudio.com/(rfktit55lnwger55zfwkpsvr)/textures.asp?id=93
Nachbearbeitet mit Photoshop 7.0
„Ebene1.bmp“: http://www.the3dstudio.com/(rfktit55lnwger55zfwkpsvr)/ textures.asp?ct=Grass
Nachbearbeitet mit Photoshop 7.0
„Ebene2.bmp“: http://www.the3dstudio.com/(rfktit55lnwger55zfwkpsvr)/textures.asp?ct=Stone
Nachbearbeitet mit Photoshop 7.0
„Ebene3.bmp“: http://www.the3dstudio.com/(rfktit55lnwger55zfwkpsvr)/textures.asp?id=182
Nachbearbeitet mit Photoshop 7.0
Detailtextur:
„Detail.bmp“: http://www.the3dstudio.com/(rfktit55lnwger55zfwkpsvr)/textures.asp?id=88
Nachbearbeitet mit Photoshop 7.0
Wasser:
„Wasser.bmp“: http://www.the3dstudio.com/(rfktit55lnwger55zfwkpsvr)/textures.asp?id=275
Nachbearbeitet mit Photoshop 7.0
Baum:
„Baum.bmp“: http://www.xfrogdownloads.com/greenwebNew/gallery/galleryStart.htm
Nachbearbeitet mit Photoshop 7.0
Diese Textur ist mit Photoshop 7.0 erstellt:
- CockpitPfeil.bmp
Sämtliche weiteren Texturen und graphischen Effekte werden eigenständig berechnet.
Timo Götzelmann

Documentos relacionados