我试图使用texture_2d_array多达8192层。但是第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你可以找到程序的精简版本)
I am out of ideas:
- 将glTexStorage3D更改为glTexImage3D -无更改
- 与基础/最高水平玩-没有变化
- Min_Filter到GL_LINEAR -没有变化
- 生成mipmaps (glGenerateMipmaps) -没有更改
- 将图层大小减小到4x4 -不变
- 将层数减少到4096 -不变
- 切换到AMD 7850 -没有变化
- 启用调试上下文-没有错误
- 等。还有很多其他的东西
所以,这可能是一个驱动程序的错误,驱动程序报告错误的数字为GL_MAX_ARRAY_TEXTURE_LAYERS,但也许我错过了一些东西,你们中的一个有一个想法。
编辑:我知道这样的纹理会使用相当多的内存,即使我的显卡有那么多可用的OpenGL也不能保证我可以分配它,但我在启用调试上下文时没有错误,特别是没有OUT_OF_MEMORY,我也尝试了每层4x4的大小,这将只是512kb
2件事:
1) 8192个128x128的纹理不是超过500mb的数据吗?(如果是RGB而不是RGBA,则为400MB。)它可能是OpenGL不能分配那么多的内存,即使你的卡有那么多,由于碎片或其他问题。
2)仅仅因为OpenGL说最大值是8192(或更大)并不意味着你保证能够在每种情况下使用那么多。例如,我的驱动程序声称该卡可以处理一侧的最大纹理大小为8192。但是如果我尝试创建一个4096x4096的32位浮点RGBA图像,它会失败,即使它只有268MB,我有一个Gig的VRAM。
glGetError()
是否返回任何错误?