C++ 模型矩阵对漫反射着色没有影响
我一直在学习OpenGL教程,但我遇到了一个问题,代码没有按应有的方式运行。我已经说到点子上了,学习基本的照明。我的代码工作了,显示了一个着色的立方体;但是,当我尝试更改模型矩阵时,它仍然显示着色,就好像立方体位于原点一样 为了确保不仅仅是我,我复制了教程提供的代码(大部分),并添加了一行:C++ 模型矩阵对漫反射着色没有影响,c++,opengl,3d,shader,C++,Opengl,3d,Shader,我一直在学习OpenGL教程,但我遇到了一个问题,代码没有按应有的方式运行。我已经说到点子上了,学习基本的照明。我的代码工作了,显示了一个着色的立方体;但是,当我尝试更改模型矩阵时,它仍然显示着色,就好像立方体位于原点一样 为了确保不仅仅是我,我复制了教程提供的代码(大部分),并添加了一行: model = glm::translate(model, glm::vec3( 3.0, -1.0, 1.0)); …立方体移动了,但阴影保持不变!为什么? 因为它可能是我没有正确理解的代码中的
model = glm::translate(model, glm::vec3( 3.0, -1.0, 1.0));
…立方体移动了,但阴影保持不变!为什么?
因为它可能是我没有正确理解的代码中的一些可怕的东西:下面是代码和我的着色器。(再说一次,大部分不是我的。)
代码:
片段着色器:
#version 330 core
in vec3 Normal;
in vec3 FragPos;
out vec4 color;
uniform vec3 objectColor;
uniform vec3 lightColor;
uniform vec3 lightPos;
void main()
{
vec3 norm = normalize(Normal);
vec3 lightDir = normalize(lightPos - FragPos);
float diff = max(dot(norm, lightDir), 0.0);
vec3 diffuse = diff * lightColor;
float ambi = 0.05;
vec3 ambient = ambi * lightColor;
color = vec4((diffuse + ambient) * objectColor, 1.0);
}
我前一段时间就想出来了,但一直在犹豫是否给出答案,因为这可能对其他人没有帮助。花了几个小时(!),但在这里。 (请注意,我已经更正了上面评论中提到的打字错误;FragPos现在已正确大写。) 有什么不对劲吗?不 …是的,它将FragPos重新定义为它自己的局部变量,并且不传递任何信息。至少,我认为是这样。在任何情况下,将
vec3 FragPos=…
更改为FragPos=…
都可以修复它。我所有其他的“修复”似乎都起作用了,因为它们没有移动足够多的东西来清楚地表明FragPos总是0
无论如何,感谢dbandstra的帮助。平移不会更改定向光源的阴影。@dari为什么不?如果它位于光源的左侧,而现在它位于右侧,则立方体的不同侧面应进行着色。通过查看代码,看起来着色器的
lightPos
应该位于模型空间中,即相对于模型。这就是为什么它看起来一样。在世界空间中有lightPos。在将其传递给着色器之前,需要在C++代码中通过模型矩阵的逆来转换它。如果您正在学习教程,我建议您继续学习,他们可能会在某个时候了解如何做到这一点。@dbandstra谢谢,这就解决了它!我将添加一个答案并很快信任您,但我确实有一个问题:lightpos
为什么需要在模型空间中(从世界空间乘以逆模型矩阵),如果在顶点着色器中,我将FragPos
转换为世界空间(从模型空间乘以模型矩阵)?@CalvinSchwa抱歉,我没有看到顶点着色器的那部分。我认为我最后的评论与此无关。您能否检查顶点着色器中fragPos
与fragPos
的使用情况?可能你根本就没有设置FragPos
?
#version 330 core
layout (location = 0) in vec3 position;
layout (location = 1) in vec3 normal;
out vec3 Normal;
out vec3 FragPos;
uniform mat4 model;
uniform mat4 view;
uniform mat4 projection;
void main()
{
gl_Position = projection * view * model * vec4(position, 1.0f);
vec3 fragPos = vec3(model*vec4(position, 1.0f));
Normal = mat3(transpose(inverse(model)))*normal;
}
#version 330 core
in vec3 Normal;
in vec3 FragPos;
out vec4 color;
uniform vec3 objectColor;
uniform vec3 lightColor;
uniform vec3 lightPos;
void main()
{
vec3 norm = normalize(Normal);
vec3 lightDir = normalize(lightPos - FragPos);
float diff = max(dot(norm, lightDir), 0.0);
vec3 diffuse = diff * lightColor;
float ambi = 0.05;
vec3 ambient = ambi * lightColor;
color = vec4((diffuse + ambient) * objectColor, 1.0);
}
#version 330 core
layout (location = 0) in vec3 position;
layout (location = 1) in vec3 normal;
out vec3 Normal;
out vec3 FragPos;
uniform mat4 model;
uniform mat4 view;
uniform mat4 projection;
void main()
{
gl_Position = projection * view * model * vec4(position, 1.0f);
vec3 FragPos = vec3(model*vec4(position, 1.0f));
Normal = mat3(transpose(inverse(model)))*normal;
}