在学习如何使用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度。
然后在试图弄清楚发生了什么之后,我发现this tutorial并且发现OpenGL正在以某种方式展开立方体贴图。下图显示了我在显示未包装立方体的所有6个面的(s,t)轴时得出的结论。
所以我的实际问题是这种实现背后的原因是什么?有没有解释为什么OpenGL以这种方式处理立方体映射?
答案 0 :(得分:6)
是的,OpenGL立方体贴图规范很奇怪。据我所知,立方体贴图纹理规则是从RenderMan的规则中逐字复制的(你知道,皮克斯开发的软件用于渲染它们的东西)。所以最终你不得不问皮克里的那些人,为什么他们选择那个特定的规则集。
经常抛出的解释,但也非常错误的是,立方体贴图的像素原点位于各自立方体面的左上角(无论左上角是什么),并使用左手坐标系。但如果仔细观察,情况并非如此。
更可能的解释是,对于立方体贴图而言,将像素原点放在基准平面的正/正象限中是有意义的,每个立方体面与其共面并对齐。
无论哪种方式,我建议你不要过多考虑它,因为,就像数学中的所有东西一样,你可以自由选择如何使事情有效,只要你的规则集以某种方式与其余部分保持一致。系统