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 Вариант работы.

Другие вопросы по тегам