【发布时间】:2015-02-05 12:08:57
【问题描述】:
我有一个涉及旋转立方体和定向(漫射)光源的简单场景,但我似乎没有正确理解照明数学。
我从this教程的obj文件中加载顶点和法线:
我的一些应用代码:
glm::mat4 modelview = ...
glm::mat4 projection = glm::perspective(60.0f, 16.0f/9.0f, 0.1f, 100.0f);
glm::mat4 MVP = projection * modelview;
glm::mat3 NormalMatrix = glm::transpose(glm::inverse(glm::mat3(modelview)));
glUniformMatrix4fv(MVP_location, 1, GL_FALSE, &MVP[0][0]);
glUniformMatrix3fv(NormalMatrix_location, 1, GL_FALSE, &NormalMatrix[0][0]);
glDrawArrays(GL_TRIANGLES, 0, 36);
顶点着色器:
#version 430
in vec3 position;
in vec3 in_normal;
uniform mat4 MVP;
uniform mat3 NormalMatrix;
out vec3 Normal;
out vec4 Color;
void main()
{
gl_Position = MVP * vec4(position, 1.0);
Color = vec4(clamp(position, 0.0, 1.0), 1.0); //based on vertex position
Normal = normalize(NormalMatrix * in_normal);
}
片段着色器:
#version 430
const vec3 Ambient = vec3(0.15, 0.15, 0.15);
const vec3 LightDirection = normalize(vec3(1.0, 0.0, 1.0));
const vec3 LightColor = vec3(1.0, 1.0, 1.0);
const float Shininess = 20.0;
const float Strength = 5.0;
in vec3 Normal;
in vec4 Color;
out vec4 FragColor;
void main()
{
FragColor = Color;
float diffuse = max(0.0, dot(Normal, LightDirection));
vec3 scatteredLight = Ambient + LightColor * diffuse;
vec3 rgb = min(FragColor.rgb * scatteredLight, vec3(1.0));
FragColor = vec4(rgb, Color.a);
}
这是我得到的: my fail
知道我做错了什么吗?
【问题讨论】:
-
您的
normal在视图空间中,而LightDirection在世界空间中。 -
我将此添加到我的应用程序代码中:glm::vec3 light_direction = glm::mat3(modelview) * glm::vec3(1.0, 0.0, 1.0); glUniform3fv(glGetUniformLocation(program, "light_direction"), 1, &light_direction[0]);并修改了片段着色器:uniform vec3 light_direction; const vec3 LightDirection = normalize(light_direction);仍然得到不正确的结果。
-
图片看起来更像是您的几何图形中存在错误的顶点或法线。