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着色器错误[关闭]的主要内容,如果未能解决你的问题,请参考以下文章