2017-08-11 2 views
1

Ich habe einen grundlegenden Shader, der nur ein Fragment basierend auf einer Stichprobenattributfarbe darstellt. Die Schattierung wird jedoch auch bei eingeschaltetem gl_Smooth als blocky/flat angezeigt. Ich verstehe Gourad und Phong, wenn es um eine Augenposition und ein Licht geht, aber ich versuche, eine diffuse Schattierung mit nur "Umgebungslicht" zu erreichen; Vielmehr treten die Lichtwerte als Teil der Farbe auf, wie sie mit realen Kameradaten erfasst werden. Meine Welt wird über die rgbd-Eingabe konstruiert und erzeugt sehr polygonisierte Netze (marschierende Würfel) mit abgetasteten Farben. Meine Frage ist, wie man die Schattierung pro Fragment glätten kann, wenn es keine direkte Lichtrichtung gibt. Ich habe meinen Shader so eingerichtet, dass Farben, Position und Normalen Vertex-Attribute sind.Selbstleuchtende diffuse Schattierung - interpolierende Normalen pro Fragment

Mein aktueller Shadern:

vert:

#version 330 

uniform mat4 ProjectionModelView; 

layout(location = 0) in vec3 Position; 
layout(location = 1) in vec3 Color; 
layout(location = 1) in vec3 Normal; 

out vec3 VertexPosition; 
out vec3 VertexColor; 
out vec3 VertexNormal; 

void main(void) 
{ 
    VertexColor = Color; 
    VertexPosition = Position; 
    VertexNormal = Normal; 
    gl_Position = ProjectionModelView*vec4(Position, 1.0); 
} 

Fragment

#version 330 
in vec3 VertexPosition; 
in vec3 VertexColor; 
in vec3 VertexNormal; 

out vec4 FinalColor; 

void main(void) 
{ 
    float intensity = dot(VertexPosition, VertexNormal); 
    FinalColor = vec4(VertexColor.x, VertexColor.y, VertexColor.z, 1)*intensity; 
} 

Stromausgang: enter image description here

Und als Referenz, das Drahtgitter, das ist ziemlich hoch Dreieck Zahl :

enter image description here

Mit Normalen gemacht:

enter image description here

Und mit nur der Rendering pro Vertex Farbe ohne Modifikationen: enter image description here

Antwort

1

Die VertexPosition nicht normalisiert und die VertexNormal ist nicht normalisiert werden nach Interpolation vom Vertex-Shader zum Fragment-Shader.

Die Einheitsvektorrichtung vom Fragment zur Kamera ist die normalisierte Richtung von der Fragmentposition zur Augenposition. Während die Augenposition (0, 0, 0) im Augenraum ist, ist die Fragmentposition die interpolierte Vertexposition, transformiert durch die Modellmatrix und die Ansichtsmatrix.

Hinweis, auch der Normalvektor muss in das gleiche Bezugssystem (Augenraum) transformiert werden.

Der Vertex-Shader wie folgt aussehen irgendwie sollte:

#version 330 

uniform mat4 ModelView; 
uniform mat4 Projection; 

layout(location = 0) in vec3 Position; 
layout(location = 1) in vec3 Color; 
layout(location = 1) in vec3 Normal; 

out vec3 VertexPosition; 
out vec3 VertexColor; 
out vec3 VertexNormal; 

void main(void) 
{ 
    vec4 pos  = ModelView * vec4(Position, 1.0); 
    VertexColor = Color; 
    VertexPosition = Position.xyz; 
    VertexNormal = mat3(ModelView) * Normal; 
    gl_Position = Projection * pos; 
} 

Und das Fragment-Shader sollte wie folgt aussehen irgendwie:

#version 330 

in vec3 VertexPosition; 
in vec3 VertexColor; 
in vec3 VertexNormal; 

out vec4 FinalColor; 

void main(void) 
{ 
    float intensity = dot(normalize(vec3(0.0) - VertexPosition), normalize(VertexNormal)); 
    FinalColor  = vec4(VertexColor.rgb * intensity, 1.0); 
} 
+0

Ah !! Ich denke, ich verstehe, dass ich den Vektor von der Kamera zur Oberfläche bringen muss ... Ich muss die Intensität eingrenzen, da ich nur "falsche" Beleuchtung oder eher vorberechnete Beleuchtung habe –

Verwandte Themen