GLSL立方体贴图反射着色器
问题描述:
我正在开发OpenGL应用程序,并且遇到实现立方体贴图反射着色器的问题:反射围绕对象旋转相机,从任何角度来看都是一样的。GLSL立方体贴图反射着色器
这里是我的顶点着色器:
in vec4 in_Position;
in vec4 in_Normal;
out vec3 ws_coords;
out vec3 normal;
mat4 uniform_ModelViewProjectionMatrix;
mat4 uniform_ModelViewMatrix;
mat4 uniform_ModelMatrix;
mat3 uniform_NormalMatrix;
vec3 uniform_CameraPosition;
...
ws_coords = (uniform_ModelViewMatrix * in_Position).xyz;
normal = normalize(uniform_NormalMatrix * in_Normal);
和片断:
uniform samplerCube uniform_ReflectionTexture;
...
vec3 normal = normalize(normal);
vec3 reflectedDirection = reflect(normalize(ws_coords), normal);
frag_Color = texture(uniform_ReflectionTexture, reflectedDirection).xyz
我发现在互联网上的所有着色器具有相同的问题,或者对我产生怪异的结果。
我想我需要旋转反射的方向与相机旋转,但我不知道我该怎么做。在着色器输入上,我具有世界空间相机位置,MVP,MV,M和Normal矩阵。
你能帮我实现着色器,这需要考虑摄像头的方向。
答
这部分似乎有点奇怪我:
VEC3 reflectedDirection =反映(正常化(ws_coords),正常);
反映的第一个参数必须是从像素位置到相机位置的矢量,在世界空间中。
我建议你有一个相机的世界位置,然后把你的位置带到世界空间(我不知道他们当前在哪个空间),并从中创建一个标准化的矢量。然后使用世界空间法线向量反射并对立方体贴图进行采样。
答
好吧,我找到了答案,
我的问题是,我没有计算在ViewSpace,这就是为什么反思是静态的。我的NormalMatrix也在ViewSpace中。
所以解决方法是
ws_coords = (uniform_ModelMatrix * in_Position).xyz;
normal = normalize(uniform_NormalMatrix * in_Normal);
和长汀从viewspace普通矩阵模型空间。
谢谢,伙计。这解决了我的问题 – xorza