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