【问题标题】:Is there a workaround for increasing GL_MAX_ARRAY_TEXTURE_LAYERS?是否有增加 GL_MAX_ARRAY_TEXTURE_LAYERS 的解决方法?
【发布时间】:2019-03-30 05:34:52
【问题描述】:

我正在使用纹理数组来渲染 Minecraft 风格的体素地形。它工作得很好,但我最近注意到GL_MAX_ARRAY_TEXTURE_LAYERSGL_MAX_TEXTURE_SIZE 小很多。

我的纹理非常小,为 8x8,但我需要能够支持从数百个到数千个的数组进行渲染;我只需要更大的GL_MAX_ARRAY_TEXTURE_LAYERS

OpenGL 4.5 要求 GL_MAX_ARRAY_TEXTURE_LAYERS 至少为 2048,这可能就足够了,但我的应用程序针对的是 OpenGL 3.3,它只能保证 256+。

我正在草拟空白,试图为这个限制找出一个谨慎的解决方法;根据支持的纹理层的最大数量来划分地形的渲染对我来说听起来一点都不简单。

我查看了ARB_sparse_texture 是否有帮助,但GL_MAX_SPARSE_ARRAY_TEXTURE_LAYERS_ARBGL_MAX_ARRAY_TEXTURE_LAYERS 相同;该扩展只是 VRAM 使用而不是层使用的一种解决方法。

我可以只从sampler2DArray数组 访问我的 GLSL 着色器吗? GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS 必须至少为 80+,所以 80+ * 256+ = 20480+ 这对于我的目的来说已经足够了。那么,理论上我可以这样做吗?

const int MAXLAYERS = 256;
vec3 texCoord;
uniform sampler2DArray[] tex;
void main()
{
    int arrayIdx = int(texCoord.z + 0.5f) / MAXLAYERS  256
    float arrayOffset = texCoord.z % MAXLAYERS;
    FragColor = texture(tex[arrayIdx],
        vec3(texCoord.x, texCoord.y, arrayOffset));
}

【问题讨论】:

    标签: opengl glsl opengl-3


    【解决方案1】:

    最好放弃阵列纹理而只使用纹理图集(或使用阵列纹理,每一层都包含许多子纹理,但正如我将展示的那样,这是非常不必要的)。如果您使用如此低分辨率的纹理,您可能没有使用线性插值,因此您可以轻松避免相邻纹素的溢出。并且即使您遇到溢出问题,也可以通过在子纹理之间添加一些空间来轻松修复它。

    即使您的子纹理需要为 10x10 以避免溢出,1024x1024 纹理(GL 3.3 要求的最小尺寸)也会为您提供 102x102 子纹理,即 10'404 纹理。这应该很多。如果不是,则将其设置为包含所需层数的数组纹理。

    采样器阵列不适用于您的目的。首先,您不能声明任何类型的未调整大小的uniform 数组。好吧,您可以,但是您必须在着色器中的某个位置重新声明它的大小,因此未调整大小的声明没有多大意义。您可以拥有的唯一未调整大小的数组位于 SSBO 中,作为 SSBO 的最后一个元素。

    其次,即使有大小,用于opaque types 数组的索引必须dynamically uniform。而且由于您尝试在一次绘制调用中绘制立方体的所有面,并且每个面都可以从不同的层中选择,因此该表达式的值没有动态统一的意图。

    第三,即使您使用bindless texturing 执行此操作,您也会遇到同样的问题:除非您使用 NVIDIA 硬件,否则您选择的采样器必须是动态统一采样器。这要求采样器数组的索引是动态统一的。你的不是。

    【讨论】:

    • 我不认为溢出是容易修复的;我正在使用 minification=GL_LINEAR_MIPMAP_LINEAR 和 maxification=GL_NEAREST_MIPMAP_LINEAR。我还在使用各向异性过滤和 mipmap。我认为 1 像素填充会减少,但不会消除出血。 F̶u̶r̶t̶h̶e̶r̶m̶o̶r̶e̶,̶̶w̶i̶l̶l̶̶1̶-̶p̶i̶x̶e̶l̶̶p̶a̶d̶d̶i̶n̶g̶̶w̶o̶r̶k̶̶m̶i̶p̶m̶a̶p̶s̶?̶(with care,好像可以)
    猜你喜欢
    • 1970-01-01
    • 2021-12-30
    • 2023-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-28
    • 2010-09-22
    相关资源
    最近更新 更多