Download - Benjamin Granzow Portfolio
Download - Benjamin Granzow Portfolio
Download - Benjamin Granzow Portfolio
Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.
YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.
4.3. BELEUCHTUNG 37<br />
Anhand der Länge des Gradienten-Vektors kann die Dichteänderung an der<br />
betrachteten Stelle bewertet werden. Dies kann dafür verwendet werden,<br />
dass nur Gradienten ab einer bestimmten Länge weiter verwendet werden.<br />
Dadurch kann die Wirkung der Beleuchtungsberechnung angepasst werden.<br />
Wenn zB. nur größere Änderungen berücksichtigt werden sollen, führt es<br />
dazu, dass die Konturen der Darstellung mehr betont würden.<br />
Es gibt zwei grundlegende Verfahren den Gradienten zu berechnen. Die erste<br />
Variante besteht darin, die Gradienten vorauszuberechnen (precomputed),<br />
die Zweite wäre es, den Gradienten individuell zu berechnen, wenn dieser<br />
benötigt wird(on the fly). Die zweite Variante würde direkt im Fragmentshader<br />
durchgeführt werden, und da damit auf Nachbarwerte zugegriffen werden<br />
müsste, würden 3D-Texturen benötigt werden. Diese sind in OpenGL<br />
ES nicht verfügbar, daher wurde für die Umsetzung die erste Variante gewählt.<br />
Dies hat noch einen weiteren Vorteil. Da die Daten schon vorhanden<br />
sind, fällt die benötigte Berechnungszeit während der Laufzeit weg. Diese<br />
Berechnungen müssen dennoch der Darstellung vorangehen, dies bietet sich<br />
beim Laden des Datensatzes an.<br />
Die in Listing 4.8 dargestellte Methode berechnet die Gradienten und speichert<br />
diese wieder in einer Textur. Bis jetzt wurde von den Texturwerten<br />
nur eine Komponente verwendet, da alle drei Farbwerte gleich sind (Graufarbenbild).<br />
Wenn der errechnete Gradienten-Vektor in den RGB-Werten<br />
der Textur und der alte Dichtewert in dem Alpha-Wert gespeichert wird,<br />
können alle Informationen in einer Textur untergebracht werden. Das hat<br />
den Vorteil, dass alle Informationen später mit einem Texturzugriff ausgelesen<br />
werden. Dabei ersetzt die Methode die ursprünglichen Daten mit den<br />
Neuen. Wenn die Datensätze für die anderen Ansichten aus dem Original<br />
zusammengesetzt werden, sind dadurch alle Datensätze mit den Gradienten<br />
versehen.<br />
Da sich Volumendaten in alle drei Dimensionen erstrecken, ist es auch nötig<br />
den Gradienten über diese zu bilden. Um dies zu tun, wird ein min-/<br />
und maxSample erstellt und die Differenz dieser ergibt den Gradienten. Die<br />
Sample werden jeweils um eine Einheit davor und danach gewählt.<br />
Da es auch möglich ist, dass der Gradient negative Werte annimmt, muss<br />
dieser zuerst in den positiven Wertebereich skaliert werden, damit er in einer<br />
Textur gespeichert werden kann. Dies geschieht mittels (gradientVec.x()+1)*125<br />
. Dadurch wird der normierte Vektor auf den Wertebereich [0,250] skaliert.<br />
Beim Auslesen der Werte in der Textur ist zu beachten, dass dieser auf<br />
den Wertebereich [-1,1] zurückskaliert wird. Der Wertebereich von 255 wird<br />
gezielt nicht komplett verwendet, da es bei Rechenungenauigkeiten dazu<br />
kommen könnte, dass der Grenzwert von 255 überschritten wird. Dadurch<br />
ist es sichergestellt, dass der Gradient in die Textur gespeichert werden kann.<br />
Um ein besseres optisches Resultat zu erhalten, ist zu empfehlen, nur größere<br />
Dichteänderungen in der Beleuchtung zu berücksichtigen. Das führt<br />
dazu, dass nur die Übergänge betont werden und sich die verschiedenen