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.1. 2D TEXTURE-SLICED VOLUMEN RENDERING 27<br />

nur bilinear interpoliert, also entlang der Achsen zwischen denen die Ebene<br />

aufgespannt wird. Optisch wirkt sich dies in der Art aus, dass beim Volumen<br />

Stufenartefakte sichtbar sind. Um diese Beschränkung aufzuheben, kann auf<br />

zwei Texturen zurückgegriffen und aus diesen dann eine dazwischenliegende<br />

Ebene interpoliert werden.<br />

Die Problematik bei der Umsetzung besteht darin, die benachbarten Texturen<br />

zu finden, zwischen welchen die neue Ebene erstellt werden soll. Dafür<br />

muss die Position innerhalb des Einheitswürfels dZPos auf die Texture-Indizes<br />

abgebildet werden, was mittels float dZPosTex = (ZCOUNT * (dZPos + 1.0)/ 2.0)<br />

; geschieht. Dabei bildet (dZPos + 1.0)/ 2.0) die Position auf den Bereich [0.0,<br />

1.0] ab und durch Multiplikation mit der Gesamtanzahl der vorhandenen<br />

Ebenen erhält man eine Fließkommazahl, welche die Position der zu errechnenden<br />

Ebene entspricht. Um den unteren Textur-Index zu erhalten, wird<br />

davon der Ganzzahlteil verwendet. Die zweite Textur ist der nächst höhere<br />

Index bzw. der nächst tiefere darauf. Die Nachkommastellen der Zahl<br />

symbolisieren die Position zwischen den beiden Texturen.<br />

Da die Interpolation erst im Fragmendshader erfolgt, muss der Offset zwischen<br />

den Texturen dem Shader übergeben werden. Um keine zusätzlichen<br />

uniform Variablen verwenden zu müssen, bietet es sich an, die Texturkoordinaten<br />

um eine Dimension zu erweitern und dort den Offset zu speichern.<br />

Bei der Verwendung von Texturen im Zusammenhang mit dem Errechnen<br />

von Texturkoordinaten, kann es durch Rechenungenauigkeiten zu Darstellungsfehler<br />

kommen. Dadurch das die Rechengenauigkeit limitiert ist, kann<br />

es vorkommen, dass die Koordinaten, welche für den Texturzugriff verwendet<br />

werden, den Wertebereich von [0.0,1.0] weit in den Nachkommastellen<br />

verlassen. Dies kann damit behoben werden, dass beim Laden der Textur in<br />

die Grafikkarte (glBindTexture) das Verhalten für das Verlassen des Wertebereiches<br />

angegeben wird. In Listing 4.4 wird aufgeführt, wie die Texturparameter<br />

s und t beim Überschreiten auf den Grenzwert beschränkt werden.<br />

Diese Parameter beschreiben einen Punkt auf der Textur mit s als Breite<br />

und t als Höhe. Weitere Beschreibungen von Texturparametern können in<br />

der OpenGL SuperBible[9] nachgeschlagen werden.<br />

glTexParameteri (GL TEXTURE 2D,GL TEXTURE WRAP S,GL CLAMP TO EDGE<br />

) ;<br />

glTexParameteri (GL TEXTURE 2D,GL TEXTURE WRAP T,GL CLAMP TO EDGE<br />

) ;<br />

Listing 4.4: Textureinstellung zum begrenzen des Wertebereichen<br />

Durch ein paar Änderungen im Fragmentshader kann eine Interpolation<br />

zwischen die beiden Texturen vorgenommen werden. Dafür werden die beiden<br />

Texturen einzeln ausgewertet und zwischen den Ergebnissen, durch den<br />

Textur-Offset, welcher sich nun in den Texturkoordinaten befindet, linear<br />

interpoliert.

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!