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 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?
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? –
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
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. –