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),正常);

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

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

+0

谢谢,伙计。这解决了我的问题 – xorza

好吧,我找到了答案,

我的问题是,我没有计算在ViewSpace,这就是为什么反思是静态的。我的NormalMatrix也在ViewSpace中。

所以解决方法是

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

和长汀从viewspace普通矩阵模型空间。