在使用GLKit加载立方体贴图后,iOS上的openGL ES 2.0的正确立方体贴图坐标是什么?

时间:2014-10-03 00:18:51

标签: ios opengl-es-2.0

为了调试我的着色器,我试图只显示立方体贴图的正面。 立方体贴图是一个125x750的图像,其中6个面相互叠加:

Cube map

首先,我使用GLKit加载立方体贴图:

_cubeTexture = [GLKTextureLoader cubeMapWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"uffizi_cube_map_ios" ofType:@"png"] options:kNilOptions error:&error];

然后我将它加载到着色器中:

glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_CUBE_MAP, self.cubeTexture.name);
glUniform1i( glGetUniformLocation( self.shaderProgram, "cube"), 0);

然后在片段着色器中:

gl_FragColor = textureCube(cube, vec3(-1.0+2.0*(gl_FragCoord.x/resolution.x),-1.0+2.0*(gl_FragCoord.y/resolution.y),1.0));

这会显示扭曲的图像,该图像似乎是立方体贴图顶部的一部分:

Distorted image

它不应该被扭曲,它应该显示正确的脸,而不是顶面。

我找不到任何描述坐标如何映射到多维数据集的文档,那么我做错了什么?

2 个答案:

答案 0 :(得分:2)

似乎cubeMapWithContentsOfFile存在问题。 cubeMapWithContentsOfFiles方法(采用6个图像的数组)在模拟器上完美运行。 (设备上的两种方法都存在不同的问题。)

答案 1 :(得分:1)

要显示纹理坐标如何对立方体贴图起作用,请绘制以原点为中心的立方体,其中面与原点相距1,并在每个面上使用指定的立方体贴图图像。

然后可以将纹理坐标视为方向向量。从原点开始,3个组件定义了一个可以指向任何方向的矢量。然后,由矢量定义的光线将在给定点处与6个立方体面中的一个相交。这是在纹理化过程中对相应的立方体贴图图像进行采样的点。

例如,采用指向最接近正z轴的方向的矢量。此矢量定义的光线与立方体的顶面相交。因此,在光线与面相交的点处对立方体贴图的顶部(POSITIVE_Z)图像进行采样。

等效规则适用于所有其他方向。对应于其中一个矢量分量的最大绝对值的面确定采样哪个面,交点确定图像内的位置。

准确的规则和公式可以在规范文档中找到。例如,在最新的规范(OpenGL 4.5)中,请参见第8.13节"多维数据集地图纹理选择",以及匹配表8.19。但只要您了解纹理坐标定义方向向量,就可以涵盖主要方面。

如何确定纹理坐标实际上取决于您想要实现的目标。常见情况包括:

  • 使用法线向量作为立方体贴图纹理坐标。例如,这可以用于预先计算的照明效果,其中立方体地图图像的内容包含每个可能的法线方向的预先计算的照明结果。
  • 使用反射向量作为立方体贴图纹理坐标。这支持环境映射的实现。立方体贴图的内容是环境图片。