在3D纹理的情况下,
对于三维纹理,z索引指的是第三个维度。这是什么意思呢?
对于二维数组纹理,z索引指的是切片索引。例如,如果我们有4层2D纹理,则如果z=2,则将引用第二个2D纹理切片。
那么,当我们拥有GL_TEXTURE_3D和GL_TEXTURE_2D_ARRAY目标时,除了纹理坐标之间的差异之外,有什么区别呢?
2D数组的各层之间没有过滤。如果在一个3D纹理中使用GL_TEXTURE_MAG_FILTER和GL_LINEAR,它将从8个texel中获取样本值,并在三个方向上进行插值。如果你在一个2D数组中这样做,它会选择一个特定的Z层进行采样,并选择该层内的4个texel进行插值。
Mipmaps的工作方式不同。一个3D纹理包含3D图像。因此,每个mipmap也是3D的。因此,mipmap缩小是三维的。如果基础层是32x32x32,那么下一个mipmap将是16x16x16。
2D数组纹理包含2D图像。它们包含一组2D图像,但这只是一种实现细节;它只是一组2D图像。每个2D图像都有自己的mipmaps,但这些是2D mipmaps。因此,2D数组纹理的每个mipmap使用与所有其他mipmap相同的图像数。因此,如果一个2D数组的基础层使用32x32个2D图像,而这些图像有32个,则下一个mipmap层将使用16x16个2D图像,但仍然有32个。
数组纹理使用整数值作为纹理坐标的第三个分量(要获取的数组层)。3D纹理对所有三个分量使用规范化值。
简而言之,除了你用来上传数据的函数外,它们没有任何共同点。
通过查看OpenGL维基百科上关于纹理的各种页面了解更多信息。
3D纹理可以在所有三个维度上进行插值,而2D纹理数组只能在两个图像维度上进行插值,不能跨切片进行插值。