VisExercises

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 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 Shader:
Fügen Sie Ihrem Programm-Code den folgenden GLSL Shader hinzu:

const char shader[] =
 "#version 120\n"
 "attribute vec4 vertex_position;\n"
 "attribute vec4 vertex_texcoord;\n"
 "uniform mat4 mv;\n"
 "uniform mat4 mvp;\n"
 "varying vec3 frag_texcoord;\n"
 "void main()\n"
 "{\n"
 "   frag_texcoord = ...;\n"
 "   gl_Position = mvp * ...;\n"
 "}\n"
 "---\n"
 "#version 120\n"
 "uniform sampler3D sampler;\n"
 "varying vec3 frag_texcoord;\n"
 "void main()\n"
 "{\n"
 "   vec4 color = texture3D(...);\n"
 "   gl_FragColor = color;\n"
 "}\n";

Implementieren Sie in obigem Code die fehlenden Stellen. Binden Sie außerdem den 3D Textur Sampler in obigen GLSL Shader, indem Sie die Textur-Objekt-Id der 3D Textur an lglSampler3D() übergeben.

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 verbessern. Im Folgenden verwenden wir den MRI-Head.pvm Datensatz.

3. GLSL Per-Fragment Operations:
Verändern Sie den Fragment-Shader, so dass Skalarwerte nicht mehr gezeichnet werden, die nahezu 0 sind (GLSL: discard).

VIS-Colormap

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. Für die Isokontur stehe ein 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.

VIS-TF

Identifizieren Sie einen konkreten Peak zu einem entsprechenden normalisierten Isowert $s_{iso}$, 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 Peak der MPR-Darstellung entsprechend, wenn die rechte Maustaste gedrückt ist (linke Maustaste rotiert).

7. Isoflächen:
Laden Sie denselben Datensatz in den QtV3 und extrahieren Sie die Isofläche zum Isowert $s_{iso}$, 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.
    • Zeichnen Sie schematisch die sich ergebende Isofläche. Am besten eignet sich dazu eine Explosionszeichnung aller 5 Tetraeder.
  • Was für ein Alphawert entspricht einer Abschwächung von Licht auf einem Wegstück von 1cm, 4cm und 8cm mit einem Abschwächungskoeffizienten von $0.1cm^{-1}$?

Options: