2016-03-25 20 views
1

OpenGL ile diffüz aydınlatma uygulamaya çalışıyorum. Bir küp için parça gölgelendiricisinde hata ayıkladım ve vertex verilerimde normalleri belirtip vertex özniteliğini etkinleştirmeme rağmen normal vektörün her zaman (0,0,0) olduğunu fark ettim.Normal vektör için vertex özniteliği neden çalışmıyor?

ilgili OpenGL kodu:

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

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

Çıkış: (sadece ortam aydınlatma gösterir, herhangi bir yaygın)

012 , enter image description here

yüzden dağınık ışık üreten gereken normaller gibi görünüyor:

Ayrıca emin değilim bu hiç yardımcı olur, ancak fragmanları pozisyon gibi normal ayarı gibi garip bir şey yapıyor bu neticesi vermesi ancak bir şekilde gölgelendiriciye doğru şekilde yüklenmiyorlar. Herhangi bir fikir?

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

Bu görüntüdeki ışığın konumu nedir? Tüm kodların * olduğu gibi * doğru görünüyor, bu da ışığı veya küpleri nasıl konumlandırdığınıza dair bir sorun olduğuna inanmamı sağlıyor. Bu da normal değerler olarak garip değerlerin beslenmesinin neden garip sonuçlara neden olduğunu açıklıyor. – Xirema

+0

Işık (1.2, 1.0, 2.0) konumunda ve ana küp (0,0,0). Yukarıdaki görüntüde, ışık kameranın küpe göre daha yakın olduğundan, ekrandaki dağınık ışık görünmelidir. –

+0

Sadece açıklığa kavuşturmak için, küçük hafif küp ışığı gösterir ve bu sorunla ilgisi olmayan farklı gölgelendiriciler kullanır. Sadece ışık kaynağı konumunu göstermek için kullanılır. –

cevap

0

Hata:

Bu benim shaderı hata ayıklamak için kullanılan koddur! Işık VAO'yu oluşturduğumda çıkıyor, aynı köşeleri kullandım, ancak her köşe noktasının sadece ilk üç değerini konumlandırdım (ışık için doğru olan). Ancak yanlışlıkla yukarıdaki kodda gösterilen VAO yerine küpü çizdiği için VAO'yu kullandım. Bunu yakalamadığımı düşünemiyorum .. Her neyse, buradaki kod doğru.

Huzur.

İlgili konular