shader normal debug 330

Aus DGL Wiki
Version vom 11. April 2015, 15:25 Uhr von Lord horazont (Diskussion | Beiträge)

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

Normalen Debugging mit OpenGL 3.3 Core

Zurück zur Shadersammlung

Beschreibung Autor Version
Nützlicher Shader um die Normalen eines Modells anzuzeigen. Lord Horazont, auf Basis von shader normal debug 1.0

Bilder

Terrain mit angezeigten Normalen

Beschreibung

Dieser Shader nutzt einen Geometry Shader (OpenGL 3.3 Core) um die Normalen eines Modells anzuzeigen. Dazu wird das Modell einmal normal gerendert und dann nochmal mit dem Geometrieshader und einem spezialisierten Fragmentshader.

Besondere Vorraussetzungen

OpenGL 3.30 Core

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


Code

Vom Vertex Shader wird angenommen, dass er die Normale als ``out vec3 normal;`` übergibt.

Geometry Shader:

#version 330 core

layout(triangles) in;
layout(line_strip, max_vertices=6) out;

// (projection * view * model) matrix
uniform mat4 proj_view_model;

// length of the normal (object space)
uniform float normal_length;

in vec3 normal;

out NDData {
    vec3 normal;
} nd_out;

void main() {
   for (int i = 0; i < 3; i++) {
       gl_Position = gl_in[i].gl_Position;
       nd_out.normal = normal;
       EmitVertex();
       gl_Position = gl_in[i].gl_Position +
           proj_view_model * vec4(normal * normal_length, 0.f);
       nd_out.normal = normal;
       EmitVertex();
       EndPrimitive();
   }
}

Fragment Shader:

#version 330 core

in NDData {
    vec3 normal;
} nd_in;

out vec4 color;

void main() {
    color = vec4(normalize(nd_in.normal) * 0.5 + 0.5, 1);
}