Warp Shader

Deformation entlang von Normalen

Ein grosser Vorteil von Vertex Shadern ist, dass man auch nach dem glBegin/End Block über alle Vertex Attribute des Objektes frei verfügen kann. So kann man zum Beispiel Vertices entlang der Normalen verschieben. In diesem Beispiel soll gezeigt werden, wie man einfache Deformationen entlang von Normalen in der OpenGL Shading Language realisieren kann.

Extrude und Intrude

Beim extrudieren werden Polygone entlang der Normalen verschoben. Dies ergibt den Effekt des ‹zerfallens› eines Objektes. Beim intrudieren wird entlang der negativen Normalen (also nach innen) verschoben.

Screenshot: Extrude

Ein Vertex Shader kennt die Topologie der Polygone nicht. Wir transformieren einen einkommenden Vertex in Objekt-Koordinaten zu einen Vertex in clip-Koordinaten.
Der Variablen ‹a› enthält irgendein Vertex vom jeweiligen Objekt. Die Vektoraddition a + d*N verschiebt den Vertex entlang der Normalen. Dies führt zu einem animierten Intrude resp. Extrude. Das C++ Programm hat die Kontrolle über den Wert ‹d›, in unserem Fall pendelt es zwischen 0 bis π hin-und her.

Vertex Shader Source Code
uniform float Position;
varying vec4 color;
void main(void)
{
vec4 N = Position* vec4(normalize(gl_Normal),0.0);
vec4 a = gl_Vertex;
//Intrude:
//float d = -Position;
//Extrude:
float d = Position;
a = a + d*N;
gl_Position = gl_ModelViewProjectionMatrix * a;
color = gl_Color;
}

«Warp-Effekt»

In vec4 a wird ein Vertex von dem jeweiligen Objekt übergeben.
Position ist eine Variable dessen Wert von 0 bis π hin- und her pendelt.
Die Funktion, die die Varibale d beschreibt, ist abhängig von dem x-Wert und dem pendeltem Wert.

uniform float Position;
varying vec4 color;
void main(void)
{
vec4 N = Position* vec4(normalize(gl_Normal),0.0);
vec4 a = gl_Vertex;
//Warp-Effekt
float d = 0.5*sin(a.x * Position );
a = a + d*N;
gl_Position = gl_ModelViewProjectionMatrix * a;
color = gl_Color;
}

×