繁体   English   中英

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

[英]What are the correct cube map coordinates for openGL ES 2.0 on iOS after loading the cube map with GLKit?

为了调试着色器,我试图仅显示立方体贴图的正面。 立方体贴图是一张125x750的图像,六个面彼此重叠:

多维数据集地图

首先,我使用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));

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

影像失真

它不应该失真,并且应该显示正确的面孔,而不是顶面。

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

似乎cubeMapWithContentsOfFile有问题。 cubeMapWithContentsOfFiles方法(需要6个图像的数组)可以在模拟器上完美运行。 (设备上的两种方法都有一个不同的问题)。

若要可视化纹理坐标对立方体贴图的工作方式,请绘制一个以原点为中心的立方体,其面与原点的距离为1,并且每个面上都具有指定的立方体贴图图像。

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM