为了调试我的着色器,我试图只显示立方体贴图的正面。 立方体贴图是一个125x750的图像,其中6个面相互叠加:
首先,我使用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));
这会显示扭曲的图像,该图像似乎是立方体贴图顶部的一部分:
它不应该被扭曲,它应该显示正确的脸,而不是顶面。
我找不到任何描述坐标如何映射到多维数据集的文档,那么我做错了什么?
答案 0 :(得分:2)
似乎cubeMapWithContentsOfFile存在问题。 cubeMapWithContentsOfFiles方法(采用6个图像的数组)在模拟器上完美运行。 (设备上的两种方法都存在不同的问题。)
答案 1 :(得分:1)
要显示纹理坐标如何对立方体贴图起作用,请绘制以原点为中心的立方体,其中面与原点相距1,并在每个面上使用指定的立方体贴图图像。
然后可以将纹理坐标视为方向向量。从原点开始,3个组件定义了一个可以指向任何方向的矢量。然后,由矢量定义的光线将在给定点处与6个立方体面中的一个相交。这是在纹理化过程中对相应的立方体贴图图像进行采样的点。
例如,采用指向最接近正z轴的方向的矢量。此矢量定义的光线与立方体的顶面相交。因此,在光线与面相交的点处对立方体贴图的顶部(POSITIVE_Z
)图像进行采样。
等效规则适用于所有其他方向。对应于其中一个矢量分量的最大绝对值的面确定采样哪个面,交点确定图像内的位置。
准确的规则和公式可以在规范文档中找到。例如,在最新的规范(OpenGL 4.5)中,请参见第8.13节"多维数据集地图纹理选择",以及匹配表8.19。但只要您了解纹理坐标定义方向向量,就可以涵盖主要方面。
如何确定纹理坐标实际上取决于您想要实现的目标。常见情况包括: