纹理数组大小的限制是什么?

时间:2014-06-10 16:18:22

标签: opengl textures

我有点了解纹理阵列是什么,但在互联网上我无处可以找到关于他们实际的信息。它们是否像一个大的纹理图集(单个连续的记忆块被划分为相同尺寸的部分),或者它们是否像纹理单元(完全独立的纹理,你可以同时绑定)?这个问题的结果是,单个纹理数组的大小限制是多少,以及如何有效地使用它们?例如,如果我的GPU处理4096x4096纹理和64个单位,我可以创建64个4096x4096纹理的纹理数组吗?或者是每个阵列的实际限制为4096 * 4096像素?或者别的什么?如何查询限制?

1 个答案:

答案 0 :(得分:8)

它们是图像阵列(该概念通常被称为 分层图像 ,因为有多种类型的纹理实际存储多个图像)。数组纹理的特殊之处在于它的每个图层具有相同的尺寸。此外,尽管内存的分配方式与3D纹理的分配方式相同,但是对于数组纹理而言,跨图像层的过滤是不可能的,而2D数组纹理的mipmap链仍然是2D。

有史以来第一种形式的阵列纹理是立方体贴图,它有6个2D图层......但它也有一组特殊的查找函数,所以它远非一般的2D数组纹理。

尽管如此,您讨论的限制是数组纹理中的每个图像维度。也就是说,如果您的最大纹理大小为 4096 ,则表示2D纹理限制为4096x4096 每个图像 ,以获得最高细节的mipmap级别

阵列纹理中的图层 ,例如纹理图像单元。它们单独的图像,但它们都属于单个纹理对象,可以绑定到单个纹理图像单元。

可以通过以下方式查询数组纹理中的最大图层数:

GLint max_layers;
glGetIntegerv (GL_MAX_ARRAY_TEXTURE_LAYERS, &max_layers);

关于有效使用数组纹理的主题,您可以考虑一个名为稀疏数组纹理的新功能(通过GL_ARB_sparse_texture)。

假设你想为 4096 x 4096 x 64 阵列纹理保留足够的存储空间,但实际上最初只使用了4或5个这些图层。通常情况下会非常浪费,但是使用稀疏纹理时,只有4或5层在使用中必须驻留(已提交)。其余的层像操作系统中的需求页面虚拟内存一样处理;在第一次使用之前,实际上没有分配后备存储。