Integration von 3D-Visualisierungstechniken in 2D-Grafiksystemen
Integration von 3D-Visualisierungstechniken in 2D-Grafiksystemen
Integration von 3D-Visualisierungstechniken in 2D-Grafiksystemen
Erfolgreiche ePaper selbst erstellen
Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.
Kapitel 3. Realisierung<br />
5 uniform vec3 LightDirection ;<br />
6 uniform vec3 Scales ;<br />
7 attribute vec3 <strong>in</strong>_Vertex ;<br />
8 attribute vec3 <strong>in</strong>_Normal ;<br />
9 attribute vec3 <strong>in</strong>_Color ;<br />
10 vary<strong>in</strong>g vec4 Color ;<br />
11<br />
12 void ma<strong>in</strong>( void) {<br />
13 vec4 Position = ViewMatrix ModelMatrix ( vec4(Scales <strong>in</strong>_Vertex ,1) ) ;<br />
14 gl_Position=ProjectionMatrix Position ;<br />
15 vec3 Normal = vec3(ViewMatrix ModelMatrix vec4(<strong>in</strong>_Normal,0)).xyz;<br />
16 Color = vec4(<strong>in</strong>_Color ,1) ;<br />
17 float diffuse = Normal.z;<br />
18 if (dot(LightDirection ,LightDirection) > 0.001) {<br />
19 diffuse = dot(normalize(LightDirection),Normal);<br />
20 }<br />
21 diffuse = abs(diffuse);<br />
22 Color . rgb = diffuse Color . rgb ;<br />
23 }<br />
List<strong>in</strong>g 3.9: E<strong>in</strong> GLSL 1.2 Vertex-Shader für e<strong>in</strong>e Lambert’sche Oberfläche (di use<br />
Beleuchtung)<br />
Zum Verständnis muss gesagt werden, dass das Produkt zweier Vektoren <strong>in</strong> der GLSL<br />
standardmäßig das elementweise Produkt ist. Das Skalarprodukt ist <strong>in</strong> der (überladenen)<br />
Funktion dot(v,u) realisiert. Als uniform deklarierte Variablen s<strong>in</strong>d zur<br />
Laufzeit des Shader-Programms Konstanten, attribute Variablen s<strong>in</strong>d per-Vertex<br />
E<strong>in</strong>gaben und vary<strong>in</strong>g Variablen s<strong>in</strong>d per-Vertex Ausgaben des Vertex-Shaders (und<br />
per-Fragment E<strong>in</strong>gaben des Fragment-Shaders) 3 . Durch die zusätzliche Abfrage ob<br />
˛r ·˛r = ||˛r|| 2 ∫ 0 ist, wird sichergestellt, dass die Richtung zur Lichtquelle nicht auf<br />
den Nullvektor gesetzt wurde. Ist dies jedoch der Fall, dann wird stattdessen der<br />
Absolutbetrag der z-Komponente des Normalenvektors als Intensität verwendet. Dies<br />
entspricht e<strong>in</strong>er Lichtquelle h<strong>in</strong>ter der Kamera.<br />
Der zugehörige Fragment-Shader muss die vary<strong>in</strong>g Variable Color nur noch für den<br />
jeweiligen Pixel, beziehungsweise das jeweilige Fragment, setzen. Dabei wird implizit<br />
bil<strong>in</strong>ear <strong>in</strong>terpoliert, damit die per-Vertex berechneten Farben gleichmäßig <strong>in</strong>e<strong>in</strong>ander<br />
übergehen.<br />
1 #version 120<br />
2 vary<strong>in</strong>g vec4 Color ;<br />
3 void ma<strong>in</strong>( void) {<br />
4 gl_FragColor=Color ;<br />
5 }<br />
List<strong>in</strong>g 3.10: E<strong>in</strong> GLSL 1.2 Fragment-Shader<br />
3 Ab GLSL 1.3 wurden attribute und vary<strong>in</strong>g durch die besser verständlichen <strong>in</strong> und out ersetzt.<br />
Aus Gründen der Kompatibilität wurde allerd<strong>in</strong>gs die GLSL Version 1.2 verwendet, denn diese<br />
ist begleitend zu OpenGL 2.1 spezifiziert worden.<br />
20