【问题标题】:FxPlug Inverts Cube Map At A DistanceFxPlug 在远处反转立方体贴图
【发布时间】:2014-07-23 06:41:38
【问题描述】:

我正在尝试使用来自http://antongerdelan.net/opengl/cubemaps.html 的 GLSL 代码在 FxPlug 中实现多维数据集映射。我对代码所做的唯一主要修改是变量名更改以及使用 gl_Vertex 和 gl_Normal 而不是属性。

顶点程序sn-p

varying vec3 pos_eye;
varying vec3 n_eye;

pos_eye = vec3(ViewMatrix * ModelMatrix * gl_Vertex);
n_eye = vec3(ViewMatrix * ModelMatrix * vec4(gl_Normal, 0.0));
gl_Position = ProjectionMatrix * ViewMatrix * ModelMatrix * gl_Vertex;

片段程序sn-p

vec3 incident_eye = normalize(pos_eye);
vec3 norm = normalize(n_eye);
vec3 reflected = reflect(incident_eye, norm);
reflected = vec3(InverseViewMatrix * vec4(reflected, 0.0));
vec3 cubemapColor = textureCube(cubemap, reflected).rgb;

当我加载模型然后插入相机时,立方体贴图实际上开始倒置,但是一旦我将相机移开一定距离,我就会得到正确的结果。在实施立方体贴图之前,有没有人见过这个问题?我认为这是 Motion 和/或 FxPlug 如何处理相机的问题。

可以在http://youtu.be/Yj85y-VKjCY找到有关实际问题的视频

在视频中,我加载了一个基本球体,将其放大并启用天空盒。球体上的立方体贴图开始倒置。当我旋转球体时,立方体贴图甚至不会移动(当相机移动时,请忽略整个视频中的黑色纹理伪影;这似乎发生在内存不足或其他情况下)。放大球体后,我得到了更真实的“反射”失真,但立方体贴图仍然是颠倒的。 直到我开始缩小到一个合理的距离,立方体贴图才转变为它应该看起来的样子。我注意到的是,当球体周围的白色矩形完全可见时,立方体贴图看起来是正确的。

对于如何解决此问题的任何建议,我将不胜感激。提前致谢!

【问题讨论】:

    标签: opengl 3d glsl motion


    【解决方案1】:

    经过进一步调查,我发现立方体贴图失真是由错误计算的反射方向造成的。事实证明,相机的“实际”位置在 Z 正方向上大约是 2000 个单位。为了解释这种差异,我在顶点着色器中创建了一个类似于原始视图矩阵的单独视图矩阵,但我从单独视图矩阵的第 15 个条目(即“位置”列的 Z 元素)中减去了 2000。

    mat4 AdjustedViewMatrix = ViewMatrix;
    AdjustedViewMatrix[3][2] += -2000.0;
    
    pos_eye = vec3(AdjustedViewMatrix * ModelMatrix * gl_Vertex); 
    

    虽然我仍然使用原始视图矩阵来存储 gl_Position,但使用调整后的视图矩阵来计算变化的眼睛空间位置可以防止靠近对象时立方体贴图失真。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-15
      • 1970-01-01
      • 2020-02-15
      • 2014-05-06
      相关资源
      最近更新 更多