我如何在iOS中使用3-D纹理?

我在OpenGL ES 2.0中找不到OpenGL的glTexImage3D()函数。 那么我怎样才能使用三维纹理,例如:.tga文件?

有人知道如何在OpenGL ES 2.0中使用3D纹理吗?

OpenGL ES 1.x和2.x不要求支持3D纹理 – 例如参见glBindTexture的规范手册页, glBindTexture列出GL_TEXTURE_2DGL_TEXTURE_CUBE_MAP作为目标 – 而iOS硬件不提供任何合适的扩展名。

我已经能够提出的最好的解决scheme是打包一个3D纹理,就像它是一个2D纹理,所以你已经说了一个128x128x128的3D纹理,你把它作为128个128×128的图像放在一个16×8的网格上一个单一的2D纹理。 所以2d纹理是2048×1024像素,接近iPhone 4和iPad 2代设备的硬件限制以及之前的ES 2.0兼容的iOS设备。

然后将三维纹理坐标提供给片段着色器,就好像有一种方法可以在本地对三维纹理进行索引,但要快速地将其数据合并到2D中。

所以,在128x128x128的例子中,你会做类似的事情(我在这里编码,未经testing):

 texPos.x = sourceVarying.x / 16.0; // because we've packed 16 source images across, texPos.y = sourceVarying.y / 8.0; // and 8 images down // we'll multiply z by 16 since then, logically, the integer part is // how many tiles across to index, and the decimal part is now many // tiles down to index texPos.z *= 16.0; // figure out how many tiles across to index, with each tile being // 1.0 / 16.0 in size texPos.x += floor(texPos.z) / 16.0; // remove the integer part of z, then multiply by 8 to do much what // we just did to y texPos.z = fract(texPos.z) * 8.0; texPos.y += floor(texPos.z) / 8.0; // now load the appropriate sample from texPos.xy 

这可能不是实现这一目标的最有效方式,它是为了(相对)清晰而写的。 您也正在看每个纹理读取所依赖的显着性能劣势(即,GPU无法预测片段着色器之外的访问,导致显着的stream水线困难)。 但是要权衡使用3D纹理贴图以外的任何费用。

还要注意,你正在做一个连接到特定z切片的访问。 因此,除非您想要做两个样本,并且以更高的成本GL_NEAREST混合结果, GL_NEAREST至less在一个维度上只限于GL_NEARESTtypes抽样。 我也没有采取任何钳位,你可能会想要解决。

Datenwolf(+1,顺便说一句)对于mipmapping是一个问题也是完全正确的。 我结束了只是禁用它。


2013年底附录:在撰写本文时,iOS 7,iPhone 5s,第二代iPad Mini和iPad Air都支持ES 3.0。 3.0引入了GL_TEXTURE_3D目标。 因此,您可以直接在这些设备上使用3D纹理,可能还会使用所有未来的iOS设备。 而且,有logging以来,Android上看到了类似的可用性,最近的Nexus设备,HTC One,最近的三星和其他一些设备都支持这种设备。

我找不到在OpenGL ES 2中有glTexImage3D函数

因为3D纹理不被OpenGL-ES支持。 想想看:3D纹理比2D更需要更多的内存。 内存是embedded式/移动设备上非常稀缺的资源,这是ES的目标。

我想也许有人知道使用3D纹理的algorithm?

这不是一个algorithm问题,而是一个有限的资源。 理论上你可以使用多个纹理单元/采样器来上传图层,并在着色器中进行插值。 但是,这将缺乏深度的手段。

3d纹理,例如:.tag文件?

TAG文件? 对不起,我不知道这种格式。 你能给我一个链接来阅读它吗? 谷歌没有find有用的信息。 你也许是意味着TGA?