关于glTexImage3D

3

在3D纹理的情况下,

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

对于二维数组纹理,z索引指的是切片索引。例如,如果我们有4层2D纹理,则如果z=2,则将引用第二个2D纹理切片。

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

2个回答

6
对于三维纹理,z索引是指第三个维度。这到底意味着什么?
这取决于你想要它表示什么。
纹理只是一个查找表。该查找表的索引称为纹理坐标。纹理坐标的含义完全取决于你打算如何使用它。它可以是空间中的位置,也可以是三维函数的XYZ,或者是其他很多东西。停止将纹理视为图片。
在二维纹理中,纹理坐标的S和T分量表示沿纹理的X和Y轴访问的距离。如果S为1,则表示右侧。如果S为0,则表示左侧。以此类推。
对于三维纹理和STP坐标也是同样的道理。如果P为0,则表示三维纹理的“最远”深度。如果P为1,则表示“最近”的深度。
就上传的数据而言,它总是基于右手坐标系工作。因此,底部/左侧/后部是(0,0,0)点,而顶部/右侧/前部是(1,1,1)点。您在数据中提供的第一个深度层是最远的深度层,下一层是第二远的深度层,依此类推。
对于二维数组纹理,z索引是指切片索引。如果我们有4层2D纹理,则如果z = 2,则将引用第3个2D纹理切片。
当使用GL_TEXTURE_3D和GL_TEXTURE_2D_ARRAY时有什么区别,除了纹理坐标之间的差异?
  1. 2D数组的各层之间没有过滤。如果在一个3D纹理中使用GL_TEXTURE_MAG_FILTER和GL_LINEAR,它将从8个texel中获取样本值,并在三个方向上进行插值。如果你在一个2D数组中这样做,它会选择一个特定的Z层进行采样,并选择该层内的4个texel进行插值。

  2. 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个。

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

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

通过查看OpenGL维基百科上关于纹理的各种页面了解更多信息。


3

3D纹理可以在所有三个维度上进行插值,而2D纹理数组只能在两个图像维度上进行插值,不能跨切片进行插值。


我认为你理解错了我的问题。请问您能告诉我两种格式的内部表示吗? - debonair
你的意思是内部表示,就是内存中字节的布局吗? - Joakim Nohlgård
目标为GL_TEXTURE_3D时,第三个维度是什么?与2D_ARRAY相同吗? - debonair
我不确定我理解你的问题。3D纹理可以被看作是一个三维矩阵,类似于2D数组情况,除了你可以选择坐标上不在平面(切片)上的点,并在三个维度上进行插值。 - Joakim Nohlgård

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接