GLSL立方体贴图反射着色器

7gyucuyw  于 2022-10-18  发布在  其他
关注(0)|答案(2)|浏览(189)

我正在开发OpenGL应用程序,但在实现立方图反射着色器时遇到了问题:反射会随着相机围绕对象旋转,从任何Angular 来看都是一样的。
以下是我的顶点着色器:

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和法线矩阵。
你能帮助我实现着色器,这考虑到相机的方向。

okxuctiv

okxuctiv1#

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

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

要反射的第一个参数必须是在世界空间中从像素位置到相机位置的矢量。
我建议你有一个相机的世界位置,然后把你的in_位置带到世界空间(我不知道他们现在在哪个空间),并从那里创建一个规格化的矢量。然后使用世界空间法线向量反射它,并对立方体贴图进行采样。

juud5qan

juud5qan2#

好吧,我找到了答案,
我的问题是我在视图空间中进行计算,这就是为什么反射是静态的。此外,我的Normal Matrix也在视图空间中。
所以解决办法就是

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

以及将法向矩阵从视图空间转换到模型空间。

相关问题