05.10.2013 Aufrufe

Integration von 3D-Visualisierungstechniken in 2D-Grafiksystemen

Integration von 3D-Visualisierungstechniken in 2D-Grafiksystemen

Integration von 3D-Visualisierungstechniken in 2D-Grafiksystemen

MEHR ANZEIGEN
WENIGER ANZEIGEN

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

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!