VIS Exercise #04
Visualisierung Übungsblatt #04
Medical 3D Data: Transfer Functions and Iso Surfaces
1. GLSL Shader Editor:
Fügen Sie dem Programm-Code aus der vorhergehenden Aufgabe einen GLSL Shader Editor hinzu. Sie benötigen dazu die folgenden Code-Abschnitte im Module glglwindow.cpp:
Im Globalen Namensraum:
GLuint prog_id; const char shader[] = "";
In der Methode initializeOpenGL():
prog_id = lglCompileGLSLProgram(shader); create_lgl_Qt_ShaderEditor("shader", &prog_id);
In der Methode renderOpenGL():
lglUseProgram(prog_id, false);
2. GLSL Texture-Lookup Shader:
Binden Sie die 3D Textur an einen 3D Sampler “sampler”, indem Sie den Namen des Samplers und die Textur-Objekt-Id der 3D Textur an lglSampler3D("sampler", texid)
übergeben (anstelle von fixed-function-style lglTexture3D).
Fügen Sie außerdem mit Hilfe des Shader Editors den folgenden GLSL Shader hinzu:
#version 120 attribute vec4 vertex_position; attribute vec4 vertex_texcoord; uniform mat4 mv; uniform mat4 mvp; varying vec3 frag_texcoord; void main() { frag_texcoord = ...; gl_Position = mvp * ...; } --- #version 120 uniform sampler3D sampler; varying vec3 frag_texcoord; void main() { vec4 color = texture3D(...); gl_FragColor = color; }
Implementieren Sie in obigem Code die fehlenden Stellen für eine 3D Texturierung, die wir im GLSL Shader selber programmieren müssen, weil wir nun keine Fixed-Function Pipeline sondern eine Programmable Pipeline verwenden. Analog gilt dies auch für den Alpha-Test, den wir ebenfalls selber programmieren.
Sie sollten nun dieselbe Darstellung wie in der letzten Aufgabe erhalten - mit dem Unterschied, dass Sie nun einen programmierbaren Shader einsetzen.
Mit diesem werden wir nun im Folgenden die Schnittbilddarstellung des MRI-Head.pvm Datensatzes verbessern.
3. GLSL Per-Fragment Operations:
Verändern Sie den Fragment-Shader, so dass Skalarwerte unterhalb eines Schwellwertes nicht mehr gezeichnet werden (GLSL: discard). Spielen im GLSL Shader Editor mit dem konkreten Wert des Schwellwertes und beobachten Sie, wie sich die Darstellung verändert.
4. GLSL Color-Mapping:
Verändern Sie den Fragment-Shader, so dass hohe Skalarwerte rötlicher dargestellt werden. Das Ergebnis ist auf der rechten Seite dargestellt. Optional: machen Sie niedrige Skalarwerte bläulicher (Cool-Warm-Shading).
5. GLSL Transferfunktionen:
Verändern Sie den den Fragment-Shader, so dass eine Transferfunktion verwendet wird, die einer Isokontur entspricht. Die Isokontur entspricht einem Peak in der Transferfunktion in Form einer schmalen Rechteck-Funktion. Den dazugehörigen Peak färben Sie bitte rot, alles andere farblos, grau oder transparent - je nach Geschmack.
Identifizieren Sie einen konkreten Peak zu einem entsprechenden normalisierten Isowert siso, der eine bestimmte Struktur wie z.B. die Hirnrinde charakterisiert.
Dokumentieren Sie dies mit einem Screenshot.
6. Interaktion (optional):
Überladen Sie die Methode mouseMoveEvent(QMouseEvent *event)
der QLGLWindow Klasse, greifen Sie in der Event-Struktur die X- und Y-Koordinaten der Maus ab und verschieben Sie damit den Mittelwert des Peaks entsprechend, wenn die rechte Maustaste gedrückt ist (linke Maustaste rotiert).
7. Isoflächen (optional):
Laden Sie denselben Datensatz in den QtV3 und extrahieren Sie die Isofläche zum Isowert siso, den sie vorher identifiziert hatten, mit Hilfe des unteren eingeklappten UI-Bereichs.
Tipp: der zu extrahierende Isowert wird per linker Windowing-Grenze eingestellt.
Sind Sie mit der Darstellung zufrieden oder ist ein prinzipielles Problem erkennbar?
Dokumentieren Sie dies abschließend mit einem Screenshot Ihrer Isofläche.
Hausaufgaben:
- Zeichnen Sie einen in 5 Tetraeder zerlegten Hexaeder von Hand!
- Ein Eckpunkt des Hexaeders soll unterhalb des Isowertes liegen, alle anderen oberhalb.
- Klassifizieren Sie alle Tetraeder und ermitteln Sie die Gesamtzahl der Dreiecke einer entsprechenden extrahierten Isofläche.
- Zeichnen Sie schematisch die sich ergebende Isofläche. Am besten eignet sich dazu eine Explosionszeichnung aller 5 Tetraeder.
- Angenommen wir betrachten eine bildebenenparallele Schicht (view-aligned slice), wie sie beim Volume Rendering vorkommt. Angenommen, die Schicht habe die Dicke d und den homogenen Absorptionskoeffizienten μ.
- Was für einen Abschwächungsfaktor ergibt sich für die Abschwächung von Licht auf diesem kleinen Wegstück mit d=1cm und einem Abschwächungskoeffizienten von 0.1cm−1 (Wasser)?
- Geben Sie den Faktor in Prozent an, d.h. wieviel Prozent des Lichts absorbiert diese Schicht?
- Wie sieht es bei 2 Schichten aus?
- Und bei 8 Schichten?
- Mit welchem Parameter korrespondiert der Abschwächungsfaktor beim Alpha-Blending?
- Mit welchem Parameter korrespondiert die Emission beim Alpha-Blending?
- Bearbeiten Sie den Lehrstoff auf und Überlegen Sie Sich Fragen für die folgende Frage-Stunde!