OpenGL: Zuweisung von Daten zu Shaderprogramm?
Verfasst: 13.06.2023, 07:40
Hi,
ich habe offenbar noch ein Grundlegendes Verständnisproblem, was die Zuweisung von Daten zu den Parametern im Shaderprogramm angeht.
Bisher habe ich in meiner Applikation nur Wireframes dargestellt: glPolygonMode(GL_FRONT_AND_BACK,GL_LINE) und das Shaderprogramm war extrem simpel:
Die Koordinaten wurden dann einfach mit Hilfe der Indexposition 0 übergeben, was offenbar klappt, da es außer den 3D-Koordinaten nichts weiter gibt:
Jetzt möchte ich aus meinem Wireframe aber eine Solid-Darstellung machen (glPolygonMode(GL_FRONT_AND_BACK,GL_FILL)), heißt also, ich benötige zusätzlich Licht und Normals. Der neue Shader sieht dann so aus:
Zusätzlich müssen die Normals übergeben werden:
Und genau das funktioniert nicht, weil offenbar die Zuweisung zwischen den Normal-Daten (Indexwert 1) und dem Parameter "Normal" aus dem Shader nicht klappt, das Objekt ist nach wie vor komplett schwarz. glGetAttribLocation(program, "Normal") liefert immer eine -1 zurück (wird wohl von dieser OpenGL-Version noch nicht unterstützt) und ein "layout(location=1) in vec3 Normal" im Shader compiliert nicht.
Deswegen meine Frage: wie funktioniert das, wie kann ich die Normals korrekt und eindeutig zuweisen?
Danke!
ich habe offenbar noch ein Grundlegendes Verständnisproblem, was die Zuweisung von Daten zu den Parametern im Shaderprogramm angeht.
Bisher habe ich in meiner Applikation nur Wireframes dargestellt: glPolygonMode(GL_FRONT_AND_BACK,GL_LINE) und das Shaderprogramm war extrem simpel:
Code: Alles auswählen
#version 130
uniform vec4 inputColor;
out vec4 fragment_color;
void main() {
fragment_color=inputColor;
}\0
Code: Alles auswählen
glBindVertexArray(entity->m_gl3Element.VAO);
glBindBuffer(GL_ARRAY_BUFFER,entity->m_gl3Element.coordVBO);
glBufferData(GL_ARRAY_BUFFER,m_vertexArray.size()*sizeof(float),m_vertexArray.data(), GL_STATIC_DRAW);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0);
glEnableVertexAttribArray(0);
glBindBuffer(GL_ARRAY_BUFFER, 0);
Code: Alles auswählen
#version 130
in vec3 Normal;
in vec3 fpos;
out vec4 fragment_color;
const vec3 lightPos = vec3(0.0,0.0,5.0);
const vec3 diffColor = vec3(1.0,0.5,0.0);
const vec3 specColor = vec3(1.0,1.0,1.0);
void main () {
vec3 normal = normalize(Normal);
vec3 viewDir = normalize(-fpos);
if (dot(normal, viewDir) < 0.0) normal *= -1.0;
vec3 lightDir = normalize(lightPos - fpos);
float lamb = max(dot(lightDir, normal), 0.0);
float spec = 0.0;
if (lamb > 0.0) {
vec3 refDir = reflect(-lightDir, normal);
float specAngle = max(dot(refDir, viewDir), 0.0);
spec = pow(specAngle, 4.0);
}
fragment_color = vec4(lamb * diffColor + spec * specColor, 1.0);
}\0";
Code: Alles auswählen
glBindBuffer(GL_ARRAY_BUFFER,entity->m_gl3Element.normalVBO);
glBufferData(GL_ARRAY_BUFFER, normalArray.size()*sizeof(float),normalArray.data(), GL_STATIC_DRAW);
glEnableVertexAttribArray(1);
glBindBuffer(GL_ARRAY_BUFFER,entity->m_gl3Element.normalVBO);
glVertexAttribPointer(1,3,GL_FLOAT,GL_FALSE,0,(void*)0);
Deswegen meine Frage: wie funktioniert das, wie kann ich die Normals korrekt und eindeutig zuweisen?
Danke!