GLSL立方体贴图反射着色器

时间:2015-04-23 07:11:26

标签: opengl glsl shader

我正在开发OpenGL应用程序并且在实现立方体贴图反射着色器时遇到问题:反射围绕对象旋转,相反,从任何角度来看它都是相同的。

这是我的顶点着色器:

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和普通矩阵。

请你帮我实现着色器,它考虑了相机的方向。

2 个答案:

答案 0 :(得分:2)

这部分对我来说有点奇怪:

vec3 reflectDirection = reflect(normalize(ws_coords),normal);

反射的第一个参数必须是在世界空间中从像素位置到相机位置的矢量。

我建议您拥有相机世界位置,然后将您的in_Position带到世界空间(我不知道它们当前位于哪个空间)并从中创建一个标准化矢量。然后使用世界空间法线向量反映它并对立方体贴图进行采样。

答案 1 :(得分:1)

好的,我找到了答案,

我的问题是我在ViewSpace中进行了计算,这就是为什么反射是静态的。我的NormalMatrix也在ViewSpace中。

所以修复

ws_coords = (uniform_ModelMatrix * in_Position).xyz;
normal = normalize(uniform_NormalMatrix * in_Normal);

和changding从视图空间到模型空间的Normal矩阵。