2016-03-25 1 views
1

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)

enter image description here

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: enter image description here

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); 
} 
+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

+0

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

+0

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

Répondre

0

Oops! Il s'avère que lorsque j'ai créé la lumière VAO, j'ai utilisé les mêmes sommets mais seulement utilisé les trois premières valeurs de chaque sommet pour la position (ce qui est correct pour la lumière). Mais j'ai accidentellement utilisé ce VAO pour dessiner le cube au lieu du VAO montré dans le code ci-dessus. Je ne peux pas croire que je n'ai pas attrapé ça .. Quoi qu'il en soit, le code ici est correct.

Paix.