【发布时间】:2019-03-30 05:34:52
【问题描述】:
我正在使用纹理数组来渲染 Minecraft 风格的体素地形。它工作得很好,但我最近注意到GL_MAX_ARRAY_TEXTURE_LAYERS 比GL_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_ARB 与GL_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));
}
【问题讨论】: