了解2D纹理数组和3D纹理之间的区别?

时间:2016-03-05 18:28:43

标签: opengl opengl-es

如果我理解正确,如果我要将TEXTURE_MIN_FILTER设置为NEAREST,那么sampler2DArray / TEXTURE_2D_ARRAY和{{1}之间差异不大} / sampler3D

差异似乎是

  • TEXTURE_3D会将交叉图层与3D纹理混合,而不是2D数组
  • GLSL中传递给GenerateMipmap的{​​{1}}坐标在3D阵列中为0到1,在2D阵列中为0到N(深度)。
  • 如果过滤不是最近的3D将跨层混合,则2D阵列不会。

正确?

2 个答案:

答案 0 :(得分:5)

不正确的。还有一个区别:mipmap大小。

在3D纹理中,宽度,高度和深度都会在较低的mipmap尺寸处减小。在2D数组纹理中,每个mipmap级别都具有相同数量的数组层;只有宽度和高度减少。

这不仅仅是混合和一些纹理协调奇怪的问题;纹理数据的大小是不同的。它是非常不同的纹理,与3D纹理不同,因为2D纹理来自1D纹理。

这也是为什么你不能创建一个二维数组的3D纹理的view texture,反之亦然。

答案 1 :(得分:4)

除了已经给出的答案外,还有另一个值得注意的差异:尺寸限制也大不相同。单个数组纹理层可能与标准2D纹理一样大,并且对图层数量有额外限制,而对于3D纹理,限制所有维度的最大尺寸。

例如,OpenGL 4.5保证以下最小值:

GL_MAX_TEXTURE_SIZE           16384
GL_MAX_ARRAY_TEXTURE_LAYERS   2048
GL_MAX_3D_TEXTURE_SIZE        2048

所以16384 x 16384 x 16阵列纹理很好(并且还应该适合现实世界中发现的每个支持GL 4.5的GPU的内存),而大多数今天的实现都不支持相同尺寸的3D纹理(即使完整的mipmap金字塔在3D纹理情况下会消耗 less 内存)。