shader tesselation
Aus DGL Wiki
Inhaltsverzeichnis
Tesselation
Zurück zur Shadersammlung
Beschreibung | Autor | Version |
---|---|---|
Unterteilt ein Dreieck in vier kleinere Dreiecke. | dj3hut1 | 1.0 |
Bilder
Beschreibung
Dieser Shader nutzt einen Geometry Shader um ein Dreieck zu tesselieren.
Besondere Vorraussetzungen
OpenGL 2.0 und die Erweiterung GL_ARB_geometry_shader4.
Spezielle Linkparameter
Folgende Parameter wurden für den Geometry Shader mit glProgramParameterARB vor dem Linken gesetzt :
-
GL_GEOMETRY_INPUT_TYPE_ARB : GL_TRIANGLES
-
GL_GEOMETRY_OUTPUT_TYPE_ARB : GL_TRIANGLE_STRIP
-
GL_GEOMETRY_VERTICES_OUT_ARB : 12
Sonstiges : ein einfaches Dreieck, glPolygonMode( GL_FRONT_AND_BACK, GL_LINE
)
Code
Vertexshader
void main()
{
gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
}
Geometryshader
#version 120
#extension GL_EXT_geometry_shader4 : enable
//input GL_TRIANGLES
//output GL_TRIANGLE_STRIP
void triangle( vec4 v0, vec4 v1, vec4 v2 )
{
gl_Position = v0;
EmitVertex();
gl_Position = v1;
EmitVertex();
gl_Position = v2;
EmitVertex();
EndPrimitive();
}
void subdivide( vec4 v0, vec4 v1, vec4 v2 )
{
vec4 h[3];
h[0] = ( v1 + v2 ) * 0.5;
h[1] = ( v0 + v2 ) * 0.5;
h[2] = ( v0 + v1 ) * 0.5;
triangle( v0, h[2], h[1] );
triangle( h[2], v1, h[0] );
triangle( h[2], h[0], h[1] );
triangle( h[1], h[0], v2 );
}
void main()
{
vec4 v[3];
v[0] = gl_PositionIn[0];
v[1] = gl_PositionIn[1];
v[2] = gl_PositionIn[2];
subdivide( v[0], v[1], v[2] );
}
Fragmentshader
void main()
{
gl_FragColor = vec4( 1.0, 0.5, 0.0, 1.0 );
}