31.10.2013 Aufrufe

Download - Benjamin Granzow Portfolio

Download - Benjamin Granzow Portfolio

Download - Benjamin Granzow Portfolio

MEHR ANZEIGEN
WENIGER ANZEIGEN

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

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!