3

在 3D 纹理的情况下,

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

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

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

4

2 回答 2

5

对于三维纹理,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 除了纹理坐标之间的差异之外,有什么区别呢?

  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 图像都有自己的 mipmap,但这些是2D mipmap。因此,2D 阵列纹理的每个 mipmap 使用的图像数量与所有其他纹理相同。因此,如果 2D 数组的基础层使用 32x32 2D 图像,并且这些图像有 32 个,则下一个 mipmap 层将使用 16x16 2D 图像,但仍然有 32 个。

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

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

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

于 2012-11-14T18:05:31.207 回答
3

3D 纹理可以在所有三个维度上进行插值,而 2D 纹理阵列仅在两个图像维度上进行插值,而不是跨切片进行插值。

于 2012-11-14T11:25:41.580 回答