我在 OpenGL ES 2.0 中找不到 glTexImage3D()
函数。那么我该如何使用 3D 纹理,例如:一个 .tga 文件?
有人知道如何在 OpenGL ES 2.0 中使用 3D 纹理吗?
我在 OpenGL ES 2.0 中找不到 glTexImage3D()
函数。那么我该如何使用 3D 纹理,例如:一个 .tga 文件?
有人知道如何在 OpenGL ES 2.0 中使用 3D 纹理吗?
OpenGL ES 1.x和2.x不强制支持3D纹理-例如,可以查看glBindTexture
的规范手册,该手册仅列出GL_TEXTURE_2D
和GL_TEXTURE_CUBE_MAP
作为目标-而且iOS硬件没有提供任何合适的扩展。
我能想到的最好解决方案是将3D纹理打包成2D纹理,例如,您有一个128x128x128的3D纹理,并将其布置为单个2D纹理上的16x8网格中的128个单独的128x128图像。因此,2D纹理为2048x1024像素,接近iPhone 4和iPad 2代设备以及ES 2.0兼容的iOS设备的硬件限制。
然后,您将3D纹理坐标传递到片段着色器中,就好像本机索引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纹理映射所需的任何成本。w
就像一个缩放参数。你不需要它。 - datenwolf