在 3D 纹理的情况下,
对于三维纹理,z 索引指的是三维。这到底是什么意思?
对于二维数组纹理,z 索引是指切片索引。是不是如果我们有 4 层 2D 纹理,那么如果 z=2,它将指的是第 2 个 2D 纹理切片。?
那么当我们有目标 GL_TEXTURE_3D 和 GL_TEXTURE_2D_ARRAY 除了纹理坐标之间的差异之外,有什么区别呢?
对于三维纹理,z 索引指的是三维。这到底是什么意思?
无论你想表达什么意思。
纹理只不过是一个查找表。该查找表的索引称为纹理坐标。纹理坐标的含义完全取决于您打算如何使用它。它可能是太空中的一个位置。它可能是三个维度的函数的 XYZ。这可能是很多事情。
停止将纹理视为图片。
在 2D 纹理中,纹理坐标的 S 和 T 分量表示沿纹理的 X 轴和 Y 轴要访问的距离。如果 S 为 1,则表示右侧。如果 S 为 0,则表示左侧。等等。
3D 纹理和 STP 坐标也是如此。如果 P 为 0,则表示 3D 纹理的“最远”深度。如果 P 为 1,则表示“最近”深度。
就您上传的数据而言,它始终基于右手坐标系。所以bottom/left/back是(0, 0, 0)点,top/right/front是(1, 1, 1)点。您在数据中提供的第一个深度层是最远的深度层,下一层是第二远的,依此类推。
对于二维数组纹理,z 索引是指切片索引。是不是如果我们有 4 层 2D 纹理,那么如果 z=2,它将指的是第 2 个 2D 纹理切片。?
不,它会提到第三个。从零开始的索引,就像 C/C++ 中的所有其他内容一样。
那么当我们有目标 GL_TEXTURE_3D 和 GL_TEXTURE_2D_ARRAY 除了纹理坐标之间的差异之外,有什么区别呢?
二维数组的层之间没有过滤。如果您在 3D 纹理中使用 GL_TEXTURE_MAG_FILTER 和 GL_LINEAR,它将从 8 个纹理像素中采样值并在所有 3 个方向上进行插值。如果您使用 2D 数组执行此操作,它将选择一个特定的 Z 层进行采样,并在该层中选择 4 个纹素进行插值。
Mipmap 的工作方式不同。3D 纹理包含 3D 图像。因此,每个 mipmap 也是 3D 的。因此,mipmap 缩减是三维的。如果基础层是 32x32x32,那么下一个 mipmap 将是 16x16x16。
2D 阵列纹理包含2D 图像。它们包含一组 2D 图像,但这是一个实现细节;它只是二维图像的集合。每个 2D 图像都有自己的 mipmap,但这些是2D mipmap。因此,2D 阵列纹理的每个 mipmap 使用的图像数量与所有其他纹理相同。因此,如果 2D 数组的基础层使用 32x32 2D 图像,并且这些图像有 32 个,则下一个 mipmap 层将使用 16x16 2D 图像,但仍然有 32 个。
数组纹理使用整数值作为纹理坐标的第三个分量(要从中获取的数组层)。3D 纹理对所有三个组件使用归一化值。
简而言之,除了您用来向它们上传数据的功能外,它们没有任何共同之处。
通过查看 OpenGL wiki 上有关纹理的各个页面了解更多信息。
3D 纹理可以在所有三个维度上进行插值,而 2D 纹理阵列仅在两个图像维度上进行插值,而不是跨切片进行插值。