OpenGL 3着色器错误[关闭]

Posted

技术标签:

【中文标题】OpenGL 3着色器错误[关闭]【英文标题】:OpenGL 3 Shader bug [closed] 【发布时间】:2020-11-22 20:25:25 【问题描述】:

我们的任务是为球体创建漫反射照明,但我们认为我们的着色器存在错误。当我们这样放置着色器时:

顶点着色器:

#version 330 core

layout (location = 0) in vec3 position;
layout (location = 1) in vec3 aNormal;


uniform mat4 u_MVP;
uniform mat4 model;
out vec3 FragPos;
out vec3 Normal;

void main() 
    //lighting calculations
    gl_Position = u_MVP * vec4(position,1.0);
    FragPos = vec4(model * vec4(position,1.0)).xyz;
    Normal = aNormal;
;

片段着色器

#version 330 core

layout (location = 0) out vec4 color;

uniform vec3 u_Light;
uniform vec4 u_Color;
in vec3 Normal;
in vec3 FragPos;

void main() 
    // Light emission properties
    // You probably want to put them as uniforms
    vec3 LightColor = vec3(1.0, 1.0, 1.0);
    vec3 ambient = vec3(0.2, 0.2, 0.16);

    vec3 norm = normalize(Normal);
    vec3 lightDir = normalize(u_Light - FragPos);
    float diff = clamp(dot(norm, lightDir), 0.0, 1.0);
    vec3 diffuse = diff * LightColor;


    color = (vec4(ambient,1.0f)+vec4(diffuse,1.0)) *u_Color;
    color.a = u_Color[3];
    //color = vec4(0.0, 0.0, 0.5, 0.1);
;

当我们将位置与模型一起放置时,我们没有漫反射照明。当我们将 FragPos 与位置坐标 (FragPos = position;) 放在一起时,它会起作用,但光线不会改变方向。我们应该注意到球体的法线是由tutorial 计算的,并不是我们的创造。我们是否有明显的错误?我们做错了什么?

【问题讨论】:

【参考方案1】:

将顶点位置从模型空间转换到世界空间是不够的。您还需要转换法线向量:

FragPos = vec4(model * vec4(position,1.0)).xyz;
Normal = normalize(transpose(inverse(mat3(model))) * aNormal);

我使用了 inverse transposed 4x4 模型矩阵的左上角 3x3 来变换法线向量。见:

Why is the transposed inverse of the model view matrix used to transform the normal vectors? Why transforming normals with the transpose of the inverse of the modelview matrix?

【讨论】:

遗憾的是问题仍然存在。现在即使我在没有乘法的情况下计算 FragPos,也没有漫反射照明。你能想象为什么会这样吗? 猜测没有意义。有很多可能的错误(光源在网格内,然后法向量被反转,......)。我只能看到着色器。我在回答中指出的问题很明显。 @Rabbid76 您忘记了对结果向量进行归一化处理,尤其是因为您要在此处使用反转置来处理最通用的情况。

以上是关于OpenGL 3着色器错误[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

用于在大满贯中绘制特征点的opengl着色器[关闭]

为啥在使用 OpenGL 编译顶点着色器时会出现着色器编译器错误 #143、#160 和 #216?

OpenGL着色器编译错误

OpenGL 程序着色器链接错误

在opengl矩形上使用着色器会导致它消失[关闭]

OpenGL着色器版本编译错误