2014-10-03 72 views
0

为了调试我的着色器,我试图显示立方体贴图的正面。 立方体地图是在彼此的顶部上的6面的125x750图像:使用GLKit加载立方体贴图后,iOS上openGL ES 2.0的正确立方体贴图坐标是什么?

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

看来cubeMapWithContentsOfFile存在问题。 cubeMapWithContentsOfFiles方法(采用6张图像的数组)可以在模拟器上完美工作。 (设备上的两种方法都存在不同的问题)。

1

要可视化立方体贴图的纹理坐标工作方式,请在原点处绘制一个立方体,距离原点的距离为1,并在每个面上指定立方体贴图图像。

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

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

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

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

你如何确定纹理坐标真的取决于你想要达到的目标。常见情况包括:

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

这就是我的想法。虽然立方体坐标从-1到1而不是0到1的事实有点令人惊讶。尽管如此,我更新的代码仍然不会产生正确的输出。此代码: vec2 coords = vec2(-1.0 + 2.0 *(gl_FragCoord.x/resolution.x), - 1.0 + 2.0 *(gl_FragCoord.y/resolution.y)); gl_FragColor = textureCube(cube,vec3(coords,1.0)); 产生此输出: http://postimg.org/image/jkqjdz87t/ – xytor 2014-10-03 17:45:19

相关问题