shader normal debug

Aus DGL Wiki
Wechseln zu: Navigation, Suche

Normalen Debugging

Zurück zur Shadersammlung

Beschreibung Autor Version
Nützlicher Shader um die Normalen eines Modells anzuzeigen. dj3hut1 1.0

Bilder

Utah-Teapot mit Normalen.

Beschreibung

Dieser Shader nutzt einen Geometry Shader um die Normalen eines Modells anzuzeigen. Dazu wird das Modell einmal normal gerendert und dann nochmal im Shader-Modus.

Besondere Vorraussetzungen

OpenGL 2.0 und die Erweiterung GL_ARB_geometry_shader4.

Die Länge der anzuzeigenden Normalen wird über die Uniform-Variable nLength gesteuert.

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_LINE_STRIP
  • GL_GEOMETRY_VERTICES_OUT_ARB : 6

Hinweis : In diesem Fall wird das Modell komplett mit den Dreiecksflächen übergeben, aus Performancegründen kann man auch nur die Vertices statt den Flächen benutzen ( dann muss man als Input GL_POINTS statt GL_TRIANGLES setzen ).

Code

Vertexshader

varying vec4 V;
varying vec3 N;

void main() 
{
    V = gl_Vertex;
    N = gl_Normal;
	
    gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
}

Geometryshader

#version 120
 
#extension GL_ARB_geometry_shader4 : enable
 
//input GL_TRIANGLES
//output GL_LINE_STRIP

varying in vec4 V[3];
varying in vec3 N[3];

uniform float nLength;

void createNormal( vec3 V, vec3 N )
{
    gl_Position = gl_ModelViewProjectionMatrix * vec4( V, 1.0f );
    EmitVertex();

    gl_Position = gl_ModelViewProjectionMatrix * vec4( V + N * nLength, 1.0f );
    EmitVertex();
    
    EndPrimitive();
}
 
void main()
{
    for ( int i = 0; i < 3; ++i )
    {
        createNormal( V[i].xyz, N[i] );
    }
}

Fragmentshader

void main()
{
    gl_FragColor = vec4( 1.0, 1.0, 0.0, 1.0 );
}