我在跟随这篇教程,成功在场景中添加了一个立方体贴图。接着我尝试给我的物体增加反射效果,但和教程不同的是,我在视图空间下编写了GLSL代码。然而,反射看起来有些奇怪。无论你面对什么角度,它们总是反映着同一面,就像我这里一样,你总是能在反射的物体上看到一个岩石,但是这个岩石只在我的立方体贴图的一侧。 这是一个展示效果的视频:
。
我尝试了其他形状的物体,例如立方体,效果都是一样的。我还发现了这本书,它展示了一个视图空间反射的例子,我似乎在做类似的事情,但仍然无法得到期望的效果。 我的顶点着色器代码:
#version 330 core
layout (location = 0) in vec3 aPos;
layout (location = 1) in vec3 normal;
layout (location = 2) in vec2 aTexCoord;
uniform mat4 Model;
uniform mat4 View;
uniform mat4 Projection;
out vec2 TexCoord;
out vec3 aNormal;
out vec3 FragPos;
void main()
{
aNormal = mat3(transpose(inverse(View * Model))) * normal;
FragPos = vec3(View * Model * vec4(aPos,1.0));
gl_Position = Projection * vec4(FragPos,1.0);
TexCoord = aTexCoord;
}
我的顶点着色器代码:
#version 330 core
out vec4 FragColor;
in vec3 FragPos;
in vec3 aNormal;
uniform samplerCube skybox;
void main(){
vec3 I = normalize(FragPos);
vec3 R = reflect(I,normalize(aNormal));
FragColor = vec4(texture(skybox,R).rgb,1.0);
}
R
)从视图空间转换到世界空间。 - Rabbid76I
和normal
在视图空间中,则R
也在视图空间中。reflect
不会神奇地改变系统。相机位置被编码在视图矩阵中。但由于R
是一个向量而不是一个位置,相机的位置是无关紧要的(只有方向很重要)。 - Rabbid76