我在OpenGL ES 2.0中找不到OpenGL的glTexImage3D()
函数。那么如何使用三维纹理,例如:.tga文件?
有人知道如何在OpenGL ES 2.0中使用3-D纹理吗?
答案 0 :(得分:12)
OpenGL ES 1.x和2.x不要求支持3d纹理 - 请参阅例如glBindTexture
的规范手册页,其中仅列出了GL_TEXTURE_2D
和GL_TEXTURE_CUBE_MAP
作为目标 - 而且iOS硬件未提供任何合适的扩展程序。
我能够想出的最好的解决方案就是将3D纹理打包成2d纹理,所以你可以说是一个128x128x128的3d纹理,然后将它作为128个独立的128x128图像打印出来。单个2d纹理上的16x8网格。所以2d纹理是2048x1024像素,接近iPhone 4和iPad 2代设备的硬件限制以及之前的ES 2.0兼容iOS设备。
然后,您可以将三维纹理坐标提供给片段着色器,就像有一种方法可以原生索引3d纹理一样,但是可以快速将数据折叠到2d。
所以,在128x128x128示例中,你会做类似的事情(这里编码,我说话,未经测试):
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无法预测片段着色器外部的访问,从而导致严重的管道难度)。但是要考虑使用3D纹理贴图以外的其他成本而不得考虑的费用。
另请注意,您正在进行一次与特定z切片相关联的访问。所以你只能在GL_NEAREST
- 至少在一个维度上进行类型采样,除非你想做两个样本并以更高的成本自己混合结果。我也没有做任何关于夹紧的事情,你很可能想要解决这个问题。
2013年末的附录:在撰写本文时,iOS 7,iPhone 5s,第二代iPad Mini和iPad Air都支持ES 3.0。 3.0引入了GL_TEXTURE_3D
目标。因此,您可以直接在这些设备上使用3D纹理,可能还有所有未来的iOS设备。而且,为了记录,它在Android上看到类似的可用性,在所有最近的Nexus设备,HTC One,最近的一些三星和其他设备中得到了支持。
答案 1 :(得分:2)
我在OpenGL ES 2中找不到glTexImage3D函数
因为OpenGL-ES不支持3D纹理。想一想:3D纹理需要比2D纹理更多的内存。内存是嵌入式/移动设备上非常稀缺的资源,这也是ES的目标。
我想也许有人知道使用3d纹理的算法?
这不是一个算法问题,而是一个有限的资源。理论上,您可以使用多个纹理单元/采样器在那里上传图层,并在着色器中进行插值。但这将缺乏深度模拟。
3d纹理,例如:.tag文件?
TAG档案?对不起,我不知道这种格式。你能给我一个链接来读它吗?谷歌没有找到有用的信息。你可能意味着TGA吗?