J'essaie de mettre en œuvre un éclairage diffus avec OpenGL. J'ai débogué le fragment shader pour un cube et j'ai trouvé que le vecteur normal est toujours (0,0,0), même si je spécifie des normales dans mes données de vertex et j'active l'attribut vertex.Pourquoi l'attribut vertex du vecteur normal ne fonctionne-t-il pas?
code OpenGL significatives:
GLfloat vertices[] = {
-0.5f, -0.5f, -0.5f, 0.0f, 0.0f, -1.0f,
0.5f, -0.5f, -0.5f, 0.0f, 0.0f, -1.0f,
0.5f, 0.5f, -0.5f, 0.0f, 0.0f, -1.0f,
0.5f, 0.5f, -0.5f, 0.0f, 0.0f, -1.0f,
-0.5f, 0.5f, -0.5f, 0.0f, 0.0f, -1.0f,
-0.5f, -0.5f, -0.5f, 0.0f, 0.0f, -1.0f,
-0.5f, -0.5f, 0.5f, 0.0f, 0.0f, 1.0f,
0.5f, -0.5f, 0.5f, 0.0f, 0.0f, 1.0f,
0.5f, 0.5f, 0.5f, 0.0f, 0.0f, 1.0f,
0.5f, 0.5f, 0.5f, 0.0f, 0.0f, 1.0f,
-0.5f, 0.5f, 0.5f, 0.0f, 0.0f, 1.0f,
-0.5f, -0.5f, 0.5f, 0.0f, 0.0f, 1.0f,
-0.5f, 0.5f, 0.5f, -1.0f, 0.0f, 0.0f,
-0.5f, 0.5f, -0.5f, -1.0f, 0.0f, 0.0f,
-0.5f, -0.5f, -0.5f, -1.0f, 0.0f, 0.0f,
-0.5f, -0.5f, -0.5f, -1.0f, 0.0f, 0.0f,
-0.5f, -0.5f, 0.5f, -1.0f, 0.0f, 0.0f,
-0.5f, 0.5f, 0.5f, -1.0f, 0.0f, 0.0f,
0.5f, 0.5f, 0.5f, 1.0f, 0.0f, 0.0f,
0.5f, 0.5f, -0.5f, 1.0f, 0.0f, 0.0f,
0.5f, -0.5f, -0.5f, 1.0f, 0.0f, 0.0f,
0.5f, -0.5f, -0.5f, 1.0f, 0.0f, 0.0f,
0.5f, -0.5f, 0.5f, 1.0f, 0.0f, 0.0f,
0.5f, 0.5f, 0.5f, 1.0f, 0.0f, 0.0f,
-0.5f, -0.5f, -0.5f, 0.0f, -1.0f, 0.0f,
0.5f, -0.5f, -0.5f, 0.0f, -1.0f, 0.0f,
0.5f, -0.5f, 0.5f, 0.0f, -1.0f, 0.0f,
0.5f, -0.5f, 0.5f, 0.0f, -1.0f, 0.0f,
-0.5f, -0.5f, 0.5f, 0.0f, -1.0f, 0.0f,
-0.5f, -0.5f, -0.5f, 0.0f, -1.0f, 0.0f,
-0.5f, 0.5f, -0.5f, 0.0f, 1.0f, 0.0f,
0.5f, 0.5f, -0.5f, 0.0f, 1.0f, 0.0f,
0.5f, 0.5f, 0.5f, 0.0f, 1.0f, 0.0f,
0.5f, 0.5f, 0.5f, 0.0f, 1.0f, 0.0f,
-0.5f, 0.5f, 0.5f, 0.0f, 1.0f, 0.0f,
-0.5f, 0.5f, -0.5f, 0.0f, 1.0f, 0.0f
};
GLuint VBO, boxVAO;
glGenVertexArrays(1, &boxVAO);
glGenBuffers(1, &VBO);
glBindVertexArray(boxVAO);
glBindBuffer(GL_ARRAY_BUFFER, VBO);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(GLfloat), (GLvoid*)0);
glEnableVertexAttribArray(0);
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(GLfloat), (GLvoid*)(3 * sizeof(GLfloat)));
glEnableVertexAttribArray(1);
glBindVertexArray(0);
Vertex shader:
#version 330 core
layout (location = 0) in vec3 position;
layout (location = 1) in vec3 normal;
out vec3 FragPos;
out vec3 outNormal;
uniform mat4 model;
uniform mat4 view;
uniform mat4 proj;
void main()
{
gl_Position = proj * view * model * vec4(position, 1.0);
FragPos = vec3(model * vec4(position, 1.0f));
outNormal = vec3(normal);
}
Fragment shader:
#version 330 core
in vec3 FragPos;
in vec3 outNormal;
out vec4 color;
uniform vec3 objectColor;
uniform vec3 lightColor;
uniform vec3 lightPos;
void main()
{
float ambientIntensity = 0.5f;
vec3 ambientColor = ambientIntensity * lightColor;
vec3 norm = normalize(outNormal);
vec3 lightDir = normalize(lightPos - FragPos);
float diffuse = max(dot(norm, lightDir), 0.0);
vec3 diffuseColor = diffuse * lightColor;
vec3 resultColor = (ambientColor + diffuseColor) * objectColor;
color = vec4(resultColor, 1.0f);
}
sortie: (ne montre que l'éclairage ambiant, ne diffuse)
De plus, pas sûr que cela aide du tout, mais faire quelque chose de bizarre comme le réglage de la normale que la position des fragments cède ce résultat:
Il semble donc que les normales devraient produire une lumière diffuse, mais ne sont en quelque sorte pas chargés correctement dans le shader. Des idées?
Ce code je déboguer le shader:
// debug testing
vec3 test = vec3(outNormal.xyz);
bvec3 ln = lessThan(test, vec3(0,0,0));
if (ln[2]){
color = vec4(1.0, 0.0, 0.0, 1.0);
}else{
color = vec4(0.0, 1.0, 0.0, 1.0);
}
Quelle est la position de la lumière dans cette image? Tout votre code * as-is * semble correct, ce qui me porte à croire qu'il y a un problème avec la façon dont vous avez positionné la lumière ou les cubes, ce qui explique aussi pourquoi l'alimentation de valeurs bizarres provoque des résultats bizarres. – Xirema
La lumière est à (1.2, 1.0, 2.0) et le cube principal est à (0,0,0). Donc dans l'image ci-dessus, la lumière est plus proche de la caméra que du cube, donc la lumière diffuse devrait être visible sur la capture d'écran. –
Juste pour clarifier, le petit cube plus léger représente la lumière, et utilise des shaders différents qui ne devraient pas être pertinents à ce problème. Il est juste utilisé pour montrer la position de la source lumineuse. –