Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 模型矩阵对漫反射着色没有影响_C++_Opengl_3d_Shader - Fatal编程技术网

C++ 模型矩阵对漫反射着色没有影响

C++ 模型矩阵对漫反射着色没有影响,c++,opengl,3d,shader,C++,Opengl,3d,Shader,我一直在学习OpenGL教程,但我遇到了一个问题,代码没有按应有的方式运行。我已经说到点子上了,学习基本的照明。我的代码工作了,显示了一个着色的立方体;但是,当我尝试更改模型矩阵时,它仍然显示着色,就好像立方体位于原点一样 为了确保不仅仅是我,我复制了教程提供的代码(大部分),并添加了一行: model = glm::translate(model, glm::vec3( 3.0, -1.0, 1.0)); …立方体移动了,但阴影保持不变!为什么? 因为它可能是我没有正确理解的代码中的

我一直在学习OpenGL教程,但我遇到了一个问题,代码没有按应有的方式运行。我已经说到点子上了,学习基本的照明。我的代码工作了,显示了一个着色的立方体;但是,当我尝试更改模型矩阵时,它仍然显示着色,就好像立方体位于原点一样

为了确保不仅仅是我,我复制了教程提供的代码(大部分),并添加了一行:

    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;
}