1

我正在尝试使用多达 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你可以找到该程序的精简版)

我没有想法:

  1. 将 glTexStorage3D 更改为 glTexImage3D - 没有变化
  2. 使用基本/最高级别 - 没有变化
  3. Min_Filter 到 GL_LINEAR - 没有变化
  4. 生成 mipmap (glGenerateMipmaps) - 没有变化
  5. 将层的大小减小到例如 4x4 - 没有变化
  6. 将层数减少到例如 4096 - 没有变化
  7. 切换到 AMD 7850 - 没有变化
  8. 启用调试上下文 - 没有错误
  9. 等等以及很多其他的东西

所以,这可能是一个驱动程序错误,驱动程序报告了错误的 GL_MAX_ARRAY_TEXTURE_LAYERS 编号,但也许我错过了一些东西,你们中的一个人有一个想法。

编辑:我知道这样的纹理会占用大量内存,即使我的显卡有那么多可用的 OpenGL 也不能保证我可以分配它,但是启用调试上下文时我没有收到任何错误,尤其是没有OUT_OF_MEMORY,我还尝试了每层 4x4 的大小,只有 512kb

4

1 回答 1

4

2件事:

1) 8192 个 128x128 的纹理不会超过 500MB 的数据吗?(如果是 RGB 而不是 RGBA,则为 400MB。)由于碎片或其他问题,即使您的卡有那么多内存,OpenGL 也可能无法分配那么多内存。

2) 仅仅因为 OpenGL 说最大值是 8192(或更大)并不意味着你可以保证在每种情况下都能使用那么多。例如,我的驱动程序声称该卡可以处理一侧的最大纹理大小为 8192。但是,如果我尝试创建一个 32 位浮点 RGBA 的 4096x4096 图像,它会失败,即使它只有 268MB 并且我有一个 Gig 的 VRAM。

是否glGetError()返回任何错误?

于 2013-04-26T04:44:15.160 回答