glTexSubImage2D 1282 - недопустимая операция в gl es 3.1
Я пытаюсь использовать:
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);
Это, вероятно, не имеет значения, но оба метода хорошо работают на ПК.
Любые предложения о том, почему это происходит?
1 ответ
Внутренний формат, который вы используете в glTexImage2D
а также glBindImageTexture
должен быть таким же и быть совместимым с вашим сэмплером. Для 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
Вариант работы.