shader tesselation

Aus DGL Wiki
Version vom 10. März 2009, 19:34 Uhr von DGLBot (Diskussion | Beiträge) (Der Ausdruck ''<glsl>(.*?)</glsl>'' wurde ersetzt mit ''<source lang="glsl">$1</source>''.)

(Unterschied) ← Nächstältere Version | Aktuelle Version (Unterschied) | Nächstjüngere Version → (Unterschied)
Wechseln zu: Navigation, Suche

Tesselation

Zurück zur Shadersammlung

Beschreibung Autor Version
Unterteilt ein Dreieck in vier kleinere Dreiecke. dj3hut1 1.0

Bilder

Dreieck ohne Tesselierung.
Dreieck mit Tesselierung.

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 );
}