glTexSubImage2D 1282 - gl中的无效操作3.1

时间:2016-06-09 16:05:04

标签: binding opengl-es textures compute-shader

我正在尝试使用:

layout (binding = 0, rgba8ui) readonly uniform uimage2D input;

在计算着色器中。为了将纹理绑定到这个我正在使用:

glBindImageTexture(0, texture_name, 0, GL_FALSE, 0, GL_READ_ONLY, GL_RGBA8);

似乎为了使这个绑定工作,纹理必须是不可变的,所以我已经从:

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixels);

为:

glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8UI, width, height);
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, width, height, GL_RGBA, GL_UNSIGNED_BYTE, pixels);

但这会生成“无效操作”(特别是glTexSubImage2D()调用会生成它)。查看文档,我发现此调用可能会导致1282,原因如下:

GL_INVALID_OPERATION is generated if the texture array has not been defined by a previous glTexImage2D or glCopyTexImage2D operation whose internalformat matches the format of glTexSubImage2D.

GL_INVALID_OPERATION is generated if type is GL_UNSIGNED_SHORT_5_6_5 and format is not GL_RGB.

GL_INVALID_OPERATION is generated if type is GL_UNSIGNED_SHORT_4_4_4_4 or GL_UNSIGNED_SHORT_5_5_5_1 and format is not GL_RGBA

但这些都不是我的理由。

它们中的第一个似乎是问题(考虑到我使用glTexStorage2D(),而不是glTexImage2D())但这不是问题,因为在浮点纹理的情况下,相同的机制有效:

glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA32F, width, height);
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, width, height, GL_RGBA, GL_FLOAT, pixels);

而不是:

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32F, width, height, 0, GL_RGBA, GL_FLOAT, pixels);

这可能无关紧要,但这两种方法在PC上运行良好。

有关为什么会发生这种情况的任何建议?

1 个答案:

答案 0 :(得分:2)

您在glTexImage2DglBindImageTexture中使用的 internalFormat 应该相同并与您的采样器兼容。对于uimage2D,请尝试在任何地方使用GL_RGBA8UI

此外,对于转移到GL_RGBA8UI(以及其他整数格式),您需要将GL_RGBA_INTEGER用作格式

glBindImageTexture(0, texture_name, 0, GL_FALSE, 0, GL_READ_ONLY, GL_RGBA8UI);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8UI, width, height, 0, GL_RGBA_INTEGER, GL_UNSIGNED_BYTE, pixels);

使用格式 GL_RGBA_INTEGER也应该使glTexSubImage2D变体有效。