如果是3D纹理,
对于三维纹理,z索引指的是第三维。 这究竟意味着什么?
对于二维数组纹理,z索引指的是切片索引。 如果我们有4层2D纹理,那么如果z = 2,它将引用第二个2D纹理切片。?
那么当我们的目标GL_TEXTURE_3D和GL_TEXTURE_2D_ARRAY除了纹理坐标之间的差异之外有什么区别呢?
答案 0 :(得分:4)
对于三维纹理,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除了纹理坐标之间的差异之外有什么区别呢?
2D阵列的各层之间没有过滤。如果在3D纹理中使用GL_TEXTURE_MAG_FILTER和GL_LINEAR,它将从8个纹素中采样值并在所有3个方向上进行插值。如果使用2D数组执行此操作,它将选择要从中进行采样的特定Z层,并在该图层中选择4个纹素以进行插值。
Mipmaps的工作方式不同。 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个。 < / p>
数组纹理使用整数值作为纹理坐标的第三个组件(要从中获取的数组层)。 3D纹理使用所有三个组件的标准化值。
简而言之,除了用于向其上传数据的功能外,它们没有任何共同之处。
了解更多looking at the various pages on the OpenGL wiki about textures。
答案 1 :(得分:3)
3D纹理可以在所有三个维度中进行插值,而2D纹理阵列仅在两个图像维度中进行插值,而不是在切片上进行插值。