gpt4 book ai didi

c++ - GLSL 点积问题

转载 作者:行者123 更新时间:2023-12-01 23:12:57 27 4
gpt4 key购买 nike

所以我尝试使用 OpenGL 实现基本的漫反射照明。我写了一个简单的着色器,它接受一个法 vector 和一个光 vector ,并使用所述 vector 的点积计算像素的亮度。这是我的输出:

  • 来自左侧的光([1, 0, 0] 作为光 vector ) 1 0 0
  • 光线落下([0, -1, 0] 作为光线 vector ) 0 -1 0
  • 从后面射来的光([0, 0, 1] 作为光 vector ) 0 0 1

如您所见,它在前两种情况下工作得很好,但在第三种情况下就完全崩溃了。顺便说一句,[0, 0, -1] 也不起作用,[0, 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);
}

我认为这个问题与点积有关,但我找不到原因。

最佳答案

漫射光使用公式 max(dot(-lightDir, normal), 0.0f); 计算。所以如果 dot (-lightDir, normal) 小于 0,则场景是全黑的。
Dot product共 2 Unit vector是两个 vector 之间夹角的余弦值。因此,如果角度 > 90° 且 < 270°,则结果小于 0。
这意味着,当物体从后面被照亮时,它会呈现全黑。


光的方向是世界空间中的一个 vector 。 dot(-lightDir, normal) 仅当法线也是世界空间中的 vector 时才有意义。
normal 从模型空间转换为世界空间:

normal = inverse(transpose(mat3(model))) * normalize(aNormal);

( Why transforming normals with the transpose of the inverse of the modelview matrix? )

关于c++ - GLSL 点积问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69517158/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com