我正在尝试使用多达 8192 层的 texture_2d_array。但是第 2048 层之后的所有层都只包含垃圾数据(通过在四边形上映射各个层以可视化纹理进行测试)。查询最大层数
glGetIntegerv(GL_MAX_ARRAY_TEXTURE_LAYERS, &maxTexLayers);
为我的显卡(AMD 5770)返回 8192,与 AMD 7850er 相同。我唯一可用的其他显卡是 NVidia 480,它仅支持 2048 层。
我使用以下代码来创建纹理:
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glGenTextures(1, &tex);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D_ARRAY, tex);
glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_BASE_LEVEL, 0);
glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAX_LEVEL, 7);
glTexStorage3D(GL_TEXTURE_2D_ARRAY, 8, GL_RGB8, 128, 128, 8192);
//glTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_RGB, 128, 128, 8192, 0, GL_RGB, GL_UNSIGNED_BYTE, nullptr);
std::vector<char> image = readImage(testImagePath);
for (unsigned int i = 0; i < 8192; ++i)
{
glTexSubImage3D(GL_TEXTURE_2D_ARRAY, 0, 0, 0, i, 128, 128, 1, GL_RGB, GL_UNSIGNED_BYTE, image.data());
}
GLuint tLoc = glGetUniformLocation (program, "texArray");
glProgramUniform1i (program, tLoc, 0);
(在这里https://mega.co.nz/#!FJ0gzIoJ!Kk0q_1xv9c7sCTi68mbKon1gDBUM1dgjrxoBJKTlj6U你可以找到该程序的精简版)
我没有想法:
- 将 glTexStorage3D 更改为 glTexImage3D - 没有变化
- 使用基本/最高级别 - 没有变化
- Min_Filter 到 GL_LINEAR - 没有变化
- 生成 mipmap (glGenerateMipmaps) - 没有变化
- 将层的大小减小到例如 4x4 - 没有变化
- 将层数减少到例如 4096 - 没有变化
- 切换到 AMD 7850 - 没有变化
- 启用调试上下文 - 没有错误
- 等等以及很多其他的东西
所以,这可能是一个驱动程序错误,驱动程序报告了错误的 GL_MAX_ARRAY_TEXTURE_LAYERS 编号,但也许我错过了一些东西,你们中的一个人有一个想法。
编辑:我知道这样的纹理会占用大量内存,即使我的显卡有那么多可用的 OpenGL 也不能保证我可以分配它,但是启用调试上下文时我没有收到任何错误,尤其是没有OUT_OF_MEMORY,我还尝试了每层 4x4 的大小,只有 512kb