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

gma*_*man 7 opengl opengl-es

如果我理解正确,如果我要设置TEXTURE_MIN_FILTERNEAREST那么sampler2DArray/ TEXTURE_2D_ARRAYsampler3D/ 之间没有太大的区别TEXTURE_3D

差异似乎是

  • GenerateMipmap 将交叉图层与3D纹理混合,而不是2D数组
  • Z传递给textureGLSL 的坐标在3D阵列中为0到1,在2D阵列中为0到N(深度).
  • 如果过滤不是NEAREST 3D将跨层混合,2D阵列将不会.

正确?

Nic*_*las 5

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

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

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

这也是您无法创建2D阵列的3D纹理的视图纹理的原因,反之亦然.


der*_*ass 5

除了已经给出的答案外,还有另一个值得注意的区别:大小限制也有很大不同。阵列纹理的单层可能与标准2D纹理一样大,并且层数有一个额外的限制,而对于3D纹理,存在一个限制所有尺寸的最大大小的限制。

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

GL_MAX_TEXTURE_SIZE           16384
GL_MAX_ARRAY_TEXTURE_LAYERS   2048
GL_MAX_3D_TEXTURE_SIZE        2048
Run Code Online (Sandbox Code Playgroud)

因此16384 x 16384 x 16阵列纹理就可以了(对于现实世界中发现的每个支持GL 4.5的GPU,它也应该适合内存),而当今大多数实现都将不支持相同尺寸的3D纹理(尽管在3D纹理的情况下,完整的mipmap金字塔将消耗更少的内存)。