2016-03-25 10 views
1

私はOpenGLで拡散照明を実装しようとしています。私はキューブのフラグメントシェーダをデバッグし、頂点データに法線を指定して頂点属性を有効にしても、法線ベクトルが常に(0,0,0)であることがわかりました。法線ベクトルの頂点属性が機能しないのはなぜですか?

関連のOpenGLコード:

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

頂点シェーダ:

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

フラグメントシェーダ:

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

出力:(のみ周囲の照明を示し、無拡散)

012 、 enter image description here

だから、それは拡散光を生成する必要がある法線のように思える:

はまた、わからないが、これはまったく役立ちますが、断片位置として通常の設定のような奇妙な何かをすることは、この結果が得られた場合何らかの形でシェーダに正しくロードされません。何か案は?

これは私がシェーダーをデバッグするために使用するコードです:

// 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

この画像内の光の位置はどのくらいですか?あなたのコードはすべて正しいものに見えます。光や立方体の配置に問題があると信じています。なぜなら、法線が奇妙な結果をもたらす理由を説明しているからです。 – Xirema

+0

ライトは(1.2,1.0,2.0)にあり、メインキューブは(0,0,0)にあります。上の画像では、ライトはキューブよりもカメラに近いので、拡散光はスクリーンショットで表示されるはずです。 –

+0

明快にするために、小さな明るい立方体はライトを表し、この問題に関連しない異なるシェーダを使用します。光源の位置を表示するためだけに使用されます。 –

答えて

0

おっと!私がライトVAOを作成したとき、私は同じ頂点を使用しましたが、位置のための各頂点の最初の3つの値だけを使用しました(これはライトに適しています)。しかし、私は誤って上記のコードに示されたVAOの代わりにキューブを描くためにVAOを使いました。私はそれをキャッチしていないとは信じられない。とにかく、ここのコードは正しい。

平和。

関連する問題