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.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.