【问题标题】:GLSL cubemap reflection shaderGLSL立方体贴图反射着色器
【发布时间】:2015-04-27 14:23:35
【问题描述】:

我正在开发 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 和法线矩阵。

你能帮我实现考虑相机方向的着色器吗?

【问题讨论】:

    标签: opengl glsl shader


    【解决方案1】:

    这部分我觉得有点奇怪:

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

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

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

    【讨论】:

      【解决方案2】:

      好的,我找到了答案,

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

      所以修复是

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

      并将法线矩阵从视图空间更改为模型空间。

      【讨论】:

        猜你喜欢
        • 2018-11-24
        • 2012-01-12
        • 1970-01-01
        • 2012-11-09
        • 2012-11-18
        • 1970-01-01
        • 1970-01-01
        • 2022-11-30
        • 1970-01-01
        相关资源
        最近更新 更多