关于 glTexImage3D

deb*_*air 3 opengl textures

如果是 3D 纹理,

对于三维纹理,z 索引指的是第三维。这究竟是什么意思?

对于二维数组纹理,z 索引指的是切片索引。是不是如果我们有4层2D纹理,那么如果z=2,它会引用第二个2D纹理切片。?

那么除了纹理坐标之间的差异之外,当我们有目标 GL_TEXTURE_3D 和 GL_TEXTURE_2D_ARRAY 时有什么区别?

Nic*_*las 5

对于三维纹理,z 索引指的是第三维。这究竟是什么意思?

无论你想要它意味着什么。

纹理只不过是一个查找表。这个查找表的索引称为纹理坐标。纹理坐标的含义完全取决于您打算如何使用它。它可能是太空中的一个位置。它可能是一个三维函数的 XYZ。这可能是很多事情。

不要将纹理视为图片。

在 2D 纹理中,纹理坐标的 S 和 T 分量表示沿纹理的 X 和 Y 轴要访问的距离。如果 S 为 1,则表示右侧。如果 S 为 0,则表示左侧。等等。

3D 纹理和 STP 坐标也是如此。如果 P 为 0,则表示 3D 纹理的“最远”深度。如果 P 为 1,则表示“最近”深度。

就您上传的数据而言,它始终基于右手坐标系工作。所以下/左/后是 (0, 0, 0) 点,上/右/前是 (1, 1, 1) 点。您在数据中提供的第一个深度层是最远的深度层,下一层是第二远的,依此类推。

对于二维数组纹理,z 索引指的是切片索引。是不是如果我们有4层2D纹理,那么如果z=2,它会引用第二个2D纹理切片。?

不,它将引用第三个。从零开始的索引,就像 C/C++ 中的其他所有东西一样。

那么除了纹理坐标之间的差异之外,当我们有目标 GL_TEXTURE_3D 和 GL_TEXTURE_2D_ARRAY 时有什么区别?

  1. 二维数组的层之间没有过滤。如果在 3D 纹理中使用 GL_TEXTURE_MAG_FILTER 和 GL_LINEAR,它将从 8 个纹素中采样值并在所有 3 个方向上进行插值。如果您使用 2D 数组执行此操作,它将选择要从中采样的特定 Z 层,并在该层内选择 4 个纹素以在它们之间进行插值。

  2. Mipmap 的工作方式不同。3D 纹理包含 3D 图像。因此,每个 mipmap 也是 3D 的。因此,mipmap 减少在三个维度上起作用。如果基础层是 32x32x32,那么下一个 mipmap 将是 16x16x16。

    2D 阵列纹理包含2D 图像。它们包含一组 2D 图像,但这是一个实现细节;它只是 2D 图像的集合。每个 2D 图像都有自己的 mipmap,但这些是2D mipmap。因此,2D 阵列纹理的每个 mipmap 使用的图像数量与所有其他纹理相同。因此,如果 2D 阵列的基础层使用 32x32 2D 图像,并且这些图像有 32 张,则下一个 mipmap 层将使用 16x16 2D 图像,但仍然会有 32 张。

  3. 数组纹理使用整数值作为纹理坐标的第三个分量(要从中获取的数组层)。3D 纹理对所有三个组件使用归一化值。

简而言之,除了你用来上传数据的功能外,它们没有任何共同之处。

通过查看 OpenGL wiki 上有关纹理的各个页面,了解更多信息