我正在尝试使用http://antongerdelan.net/opengl/cubemaps.html中的GLSL代码在FxPlug中实现多维数据集映射。我对代码做的唯一主要修改是变量名称更改,并使用gl_Vertex和gl_Normal而不是属性。
顶点程序代码段:
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;
片段程序代码段:
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
找到有关问题的视频在视频中,我加载一个基本球体,将其放大,然后启用天空盒。球体上的立方体贴图开始颠倒。当我旋转球体时,立方体贴图甚至不会移动(当相机移动时忽略整个视频中的黑色纹理瑕疵;这似乎发生在没有足够的内存或其他东西时)。在放大球体后,我得到了更逼真的“反射”失真,但立方体贴图仍然是倒置的。 直到我开始缩小到合理的距离,立方体贴图才会转变为它应该看起来的样子。我注意到的是,当围绕球体的白色矩形完全可见时,立方体贴图看起来是正确的。
我很感激有关如何解决这个问题的任何建议。提前谢谢!
答案 0 :(得分:0)
经过进一步调查,我发现立方体图失真是由错误计算的反射方向引起的。事实证明,"实际"摄像机的位置在正Z方向上约为2000个单位。为了解释这种差异,我创建了一个单独的视图矩阵,类似于顶点着色器中的原始视图矩阵,但是我从单独的视图矩阵的第15个条目中减去2000(即"位置&#34的Z元素;列)。
mat4 AdjustedViewMatrix = ViewMatrix;
AdjustedViewMatrix[3][2] += -2000.0;
pos_eye = vec3(AdjustedViewMatrix * ModelMatrix * gl_Vertex);
虽然我仍然使用原始视图矩阵来存储gl_Position,但使用调整后的视图矩阵来计算变化的眼睛空间位置可以防止立方体贴图在靠近物体时失真。