所以我试着用OpenGL实现基本的漫射照明。我编写了一个简单的着色器,它使用法向量和光矢量,并使用所述向量的点积计算像素的亮度。以下是我的成果:



正如您所看到的,对于前两种情况,它工作得很好,但是对于第三种情况,它完全崩溃了。顺便说一句,0,0,-1也不起作用,而0,1,1,1的输出与光线出现的情况相同(0,1,0)。这是我的着色器:
#version 330 core
layout (location = 0) in vec3 aPos;
layout (location = 1) in vec3 aNormal;
uniform mat4 model;
uniform mat4 view;
uniform mat4 projection;
uniform vec3 lightDirection;
out vec3 normal;
out vec3 lightDir;
void main()
{
normal = normalize(aNormal);
lightDir = normalize(lightDirection);
gl_Position = projection * view * model * vec4(aPos, 1.0f);
}#version 330 core
in vec3 normal;
in vec3 lightDir;
out vec4 FragColor;
void main()
{
float grey = max(dot(-lightDir, normal), 0.0f);
FragColor = vec4(grey, grey, grey, 1.0f);
}我猜想这个问题与网点产品有关,但我找不到原因。
发布于 2021-10-10 16:56:12
用公式max(dot(-lightDir, normal), 0.0f);计算漫射光。因此,如果dot (-lightDir, normal)小于0,则场景完全是黑色的。
2 单位向量的余弦是两个向量间夹角的余弦。因此,当夹角> 90°和< 270°时,结果小于0。
这意味着,当物体在背面被点燃时,它将呈现出完全的黑色。
光的方向是世界空间中的一个矢量。只有当法线也是世界空间中的向量时,dot(-lightDir, normal)才有意义。
将normal从模型空间转换为世界空间:
normal = inverse(transpose(mat3(model))) * normalize(aNormal);https://stackoverflow.com/questions/69517158
复制相似问题