我正在尝试使用:
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上运行良好。
有关为什么会发生这种情况的任何建议?
答案 0 :(得分:2)
您在glTexImage2D
和glBindImageTexture
中使用的 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
变体有效。