2016-07-09 11 views
2

Ich habe zwei Shader für mein Programm erstellt, um einfache Objekte zu rendern.GLSL Shader Problem

Vertex-Shader-Quelle:

#version 400 core 
layout (location = 1) in vec4 i_vertexCoords; 
layout (location = 2) in vec3 i_textureCoords; 
layout (location = 3) in vec3 i_normalCoords; 
layout (location = 4) in int i_material; 

uniform mat4 u_transform; 

out VertexData { 
    vec3 textureCoords; 
    vec3 normalCoords; 
    int material; 
} vs_out; 

void main() { 
    vs_out.textureCoords = i_textureCoords; 
    vs_out.material = i_material; 
    gl_Position = u_transform * i_vertexCoords; 
    vs_out.normalCoords = gl_Position.xyz; 
} 

Fragment-Shader Quelle:

#version 400 core 
struct MaterialStruct { 
    int ambientTexutre; 
    int diffuseTexture; 
    int specularTexture; 
    int bumpTexture; 

    vec4 ambientColor; 
    vec4 diffuseColor; 
    vec4 specularColor; 

    float specularComponent; 
    float alpha; 
    int illuminationModel; 
}; 

in VertexData { 
    vec3 textureCoords; 
    vec3 normalCoords; 
    int material; 
} vs_out; 

layout (std140) uniform MaterialsBlock { 
    MaterialStruct materials[8]; 
} u_materials; 

uniform sampler2D u_samplers[16]; 

out vec4 fs_color; 


void main() { 
    MaterialStruct m = u_materials.materials[vs_out.material]; 
    fs_color = vec4(m.diffuseColor.rgb, m.diffuseColor.a * m.alpha); 
} 

Programm erstellt mit diesen beiden Shadern macht Bild 2 axes Wenn ich main() Funktion Inhalt zum nächsten ändern:

void main() { 
    MaterialStruct m = u_materials.materials[vs_out.material]; 
    fs_color = vec4(m.diffuseColor.rgb * (vs_out.normalCoords.z + 0.5), m.diffuseColor.a * m.alpha); 
} 

Es rendert Bild 1, aber Materialien existieren immer noch (wenn ich versuche, Material von u_materials.materials manuell auszuwählen, funktioniert es). Shader denkt, was vs_out.material ist konstant und gleich 0, aber es ist nicht. Daten werden nicht geändert (ohne Transformationsmatrix) Kann jemand die Lösung dieses Problems erklären?

+1

Nicht sicher, ich verstehe Ihren Kommentar 'Shader denkt, was vs_out.Material ist konstant und gleich 0, aber es ist nicht. Die einzige Änderung im Fragment-Shader scheint die Verwendung von '(vs_out.normalCoords.z + 0.5)' als Multiplikator in der Farbberechnung zu sein. Wenn man annimmt, dass die Farbe in Abbildung 1 ausgebleicht ist, ist es möglich, dass 'vs_out.normalCoords.z' einen großen Wert hat? –

+0

Nicht sicher, was Sie erwarten, wenn Sie eine Farbe mit einer normalen Komponente + 0,5 multiplizieren. Auch nicht sicher über den Vertex-Shader: 'vs_out.normalCoords = gl_Position.xyz;'. Das ist sicherlich nicht normal für den Vertex. – MadEqua

+0

vs_out.normalCoords ist nur eine gl_Position von Vertex in diesem Shader-Paar. vs_out.normalCoords.z passt in den Bereich [0.1 .. 0.9]. Wenn ich 'vs_out.material' in' MaterialStruct m = u_materials.materials [vs_out.material] 'zu explizitem Wert (0, 1 oder 2) ändere, ändert das vollständige Modell die Farbe entsprechend in Grau, Rot und Weiß. Das Problem von Shader ist die Ersetzung von 'vs_out.material' auf' 0' beim Kompilieren von Shadern. –

Antwort

2

GLSL 4.5 spec Die Zustände in Abschnitt 4.3.4 „Eingangsvariablen“:

Fragment-Shader-Eingänge, die mit oder ohne Vorzeichen ganze Zahlen, Ganzzahl-Vektoren oder jede doppelte Genauigkeit Gleitkommatyp mit qualifiziert werden muß signiert das Interpolationsqualifikationsmerkmal flat.

Sie können Interpolation mit diesen Typen nicht verwenden, und eigentlich sollte Ihr Code nicht auf einer strengen Implementierung kompilieren.

Verwandte Themen