为什么超过2048的纹理层中只有垃圾数据?



我试图使用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:

  1. 将glTexStorage3D更改为glTexImage3D -无更改
  2. 与基础/最高水平玩-没有变化
  3. Min_Filter到GL_LINEAR -没有变化
  4. 生成mipmaps (glGenerateMipmaps) -没有更改
  5. 将图层大小减小到4x4 -不变
  6. 将层数减少到4096 -不变
  7. 切换到AMD 7850 -没有变化
  8. 启用调试上下文-没有错误
  9. 等。还有很多其他的东西

所以,这可能是一个驱动程序的错误,驱动程序报告错误的数字为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()是否返回任何错误?

相关内容

  • 没有找到相关文章