立方体映射时OpenGL旋转纹理的原因是什么?

立方体映射时OpenGL旋转纹理的原因是什么?,opengl,Opengl,在学习如何使用GLSL着色器在OpenGL中实现环境映射的过程中,我遇到了一些困惑 我为立方体地图的每个面使用了6个不同的图像,并为“天空盒”生成了几何体,这是一个围绕整个场景的原点的简单立方体。我确保当前正在生成网格,并且加载targa图像的代码没有旋转像素 渲染时,顶点着色器只是将顶点位置复制到片段上,我使用相互关联的顶点位置作为(s、t、r)坐标系从立方体贴图采样 顶点着色器 片段着色器 我注意到立方体贴图侧面的纹理旋转了180度。 然后,在试图弄清楚到底发生了什么之后,我发现并弄明白O

在学习如何使用GLSL着色器在OpenGL中实现环境映射的过程中,我遇到了一些困惑

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

渲染时,顶点着色器只是将顶点位置复制到片段上,我使用相互关联的顶点位置作为(s、t、r)坐标系从立方体贴图采样

顶点着色器

片段着色器

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

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


因此,我的实际问题是这种实现背后的原因是什么?是否有关于OpenGL以这种方式处理多维数据集映射的解释?

是的,OpenGL cubemap规范很奇怪。据我所知,立方体贴图纹理规则是从RenderMan的规则(你知道,是Pixar开发的用于渲染他们作品的软件)一字不差地复制而来的。所以最终你得问问皮克斯的伙计们,他们为什么选择那个特定的规则集

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

更可能的解释是,对于立方体贴图,将像素原点设置在每个立方体面共面并与之对齐的基面的正/正象限是有意义的


无论哪种方式,我都建议您不要想太多,因为就像数学中的一切一样,只要您的规则集与系统的其他部分保持一致,您就可以自由选择如何工作。

原点应该位于左下角,但有一些事情可以改变这一点。正在加载的纹理的原点是什么?很明显,Targa文件允许您指定不同的来源,大多数图像加载程序使用左上角。你的MVP矩阵是什么?您可以使用MVP矩阵轻松更改原点。对于所有6幅图像,原点都是(0,0),MVP也不是cuase,在渲染图像中看到的是一个位于负x面附近的摄影机,该摄影机注视正x面,以及一个具有70.0度视野的透视投影。模型矩阵是一个单位矩阵,所以立方体的原点也在(0,0,0)中。立方体映射的原点在DirectX和OpenGL中都位于左下角。@Nikos:是的,这就是我写的。
#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);
}