多维数据集映射时OpenGL旋转纹理的原因是什么?

时间:2015-11-18 00:11:12

标签: opengl

在学习如何使用GLSL着色器在OpenGL中实现环境映射的过程中,我偶然发现了一些混乱。

我为立方体贴图的每个面使用了6个不同的图像,并为“天空盒”生成了几何图形,这是一个以围绕整个场景的原点为中心的简单立方体。我确定当前正在生成网格,并且加载targa图像的代码不会旋转像素。

渲染时,顶点着色器只是将顶点位置复制到片段,我使用了插入的顶点位置,因为(s,t,r)从多维数据集映射中采样。

顶点着色器

#version 430

layout (location = 0) in vec3 VertexPosition;

out vec3 ReflectDir;

uniform mat4 MVP;

void main()
{
    ReflectDir = VertexPosition;
    gl_Position = MVP * vec4(VertexPosition, 1.0);
}

片段着色器

#version 430

uniform samplerCube CubeMapTex;

in vec3 VertexPosition;

out vec4 FragColor;

void main() {
    FragColor = texture(CubeMapTex, VertexPosition);
}

我注意到立方体贴图两侧的纹理旋转了180度。

On the left is the texture I used for the positive x face of the cube, and on the right is the rendered result

然后在试图弄清楚发生了什么之后,我发现this tutorial并且发现OpenGL正在以某种方式展开立方体贴图。下图显示了我在显示未包装立方体的所有6个面的(s,t)轴时得出的结论。

enter image description here

所以我的实际问题是这种实现背后的原因是什么?有没有解释为什么OpenGL以这种方式处理立方体映射?

1 个答案:

答案 0 :(得分:6)

是的,OpenGL立方体贴图规范很奇怪。据我所知,立方体贴图纹理规则是从RenderMan的规则中逐字复制的(你知道,皮克斯开发的软件用于渲染它们的东西)。所以最终你不得不问皮克里的那些人,为什么他们选择那个特定的规则集。

经常抛出的解释,但也非常错误的是,立方体贴图的像素原点位于各自立方体面的左上角(无论左上角是什么),并使用左手坐标系。但如果仔细观察,情况并非如此。

更可能的解释是,对于立方体贴图而言,将像素原点放在基准平面的正/正象限中是有意义的,每个立方体面与其共面并对齐。

无论哪种方式,我建议你不要过多考虑它,因为,就像数学中的所有东西一样,你可以自由选择如何使事情有效,只要你的规则集以某种方式与其余部分保持一致。系统