首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GLSL点积的故障

GLSL点积的故障
EN

Stack Overflow用户
提问于 2021-10-10 16:49:45
回答 1查看 2.3K关注 0票数 2

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

  • 来自左侧的光(1,0,0作为光矢量)

  • 光线下降(0,-1,0作为光矢量)

  • 来自后方的光(0,0,1作为光矢量)

正如您所看到的,对于前两种情况,它工作得很好,但是对于第三种情况,它完全崩溃了。顺便说一句,0,0,-1也不起作用,而0,1,1,1的输出与光线出现的情况相同(0,1,0)。这是我的着色器:

  • 顶点着色器:
代码语言:javascript
复制
#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);
}
  • 碎片着色器:
代码语言:javascript
复制
#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);
}

我猜想这个问题与网点产品有关,但我找不到原因。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-10-10 16:56:12

用公式max(dot(-lightDir, normal), 0.0f);计算漫射光。因此,如果dot (-lightDir, normal)小于0,则场景完全是黑色的。

2 单位向量的余弦是两个向量间夹角的余弦。因此,当夹角> 90°和< 270°时,结果小于0。

这意味着,当物体在背面被点燃时,它将呈现出完全的黑色。

光的方向是世界空间中的一个矢量。只有当法线也是世界空间中的向量时,dot(-lightDir, normal)才有意义。

normal从模型空间转换为世界空间:

代码语言:javascript
复制
normal = inverse(transpose(mat3(model))) * normalize(aNormal);

(为什么要用模型视图矩阵的逆转置来转换法线?)

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69517158

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档