GLSL 立方体贴图反射着色器
GLSL cubemap reflection 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
我在 Internet 上找到的所有着色器都有相同的问题或为我产生奇怪的结果。
我想我需要随着相机旋转来旋转反射方向,但我不知道该怎么做。在着色器输入上,我有世界 space 相机位置、MVP、MV、M 和法线矩阵。
你能帮我实现考虑相机方向的着色器吗?
这部分对我来说有点奇怪:
vec3 reflectedDirection = reflect(normalize(ws_coords), normal);
反射的第一个参数必须是从像素位置到相机位置的向量,在世界 space。
我建议你有一个相机世界位置,然后将你的 in_Position 带到世界 space(我不知道他们目前在哪个 space)并创建一个从中归一化向量。然后用世界 space 法线向量反映它并对立方体贴图进行采样。
好的,我找到答案了,
我的问题是我在 ViewSpace 中进行了计算,这就是为什么反射是静态的。我的 NormalMatrix 也在 ViewSpace 中。
所以修复是
ws_coords = (uniform_ModelMatrix * in_Position).xyz;
normal = normalize(uniform_NormalMatrix * in_Normal);
并将法线矩阵从视空间更改为模型空间。
我正在开发 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
我在 Internet 上找到的所有着色器都有相同的问题或为我产生奇怪的结果。
我想我需要随着相机旋转来旋转反射方向,但我不知道该怎么做。在着色器输入上,我有世界 space 相机位置、MVP、MV、M 和法线矩阵。
你能帮我实现考虑相机方向的着色器吗?
这部分对我来说有点奇怪:
vec3 reflectedDirection = reflect(normalize(ws_coords), normal);
反射的第一个参数必须是从像素位置到相机位置的向量,在世界 space。
我建议你有一个相机世界位置,然后将你的 in_Position 带到世界 space(我不知道他们目前在哪个 space)并创建一个从中归一化向量。然后用世界 space 法线向量反映它并对立方体贴图进行采样。
好的,我找到答案了,
我的问题是我在 ViewSpace 中进行了计算,这就是为什么反射是静态的。我的 NormalMatrix 也在 ViewSpace 中。
所以修复是
ws_coords = (uniform_ModelMatrix * in_Position).xyz;
normal = normalize(uniform_NormalMatrix * in_Normal);
并将法线矩阵从视空间更改为模型空间。