Для кеша текстур OpenGL мне нужно инициализировать большую (≥ 2048x2048) текстуру, а затем часто обновлять небольшие ее части.Создание и обновление 8-битной текстуры серого в OpenGL ES 2.0
Следующая (псевдо-) код работает:
// Setup texture
int[] buffer = new int[2048*2048/4]; // Generate dummy buffer with 1 byte per pixel
int id = glGenTexture();
glBindTexture(GL_TEXTURE_2D, id);
glTexImage2D(GL_TEXTURE_2D, 0, GL_ALPHA, 2048, 2048, 0, GL_ALPHA, GL_UNSIGNED_BYTE, buffer);
// Perform update
glBindTexture(GL_TEXTURE_2D, id);
glTexSubImage2D(GL_TEXTURE_2D, 0, x, y, width, height, GL_ALPHA, GL_UNSIGNED_BYTE, data);
Но я считаю совершенно ненужное создание 4MB INT-буфера немного нежелательно, мягко говоря. Итак, я попытался следующие вместо:
// Setup texture
int id = glGenTexture();
glBindTexture(GL_TEXTURE_2D, id);
glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_ALPHA, 0, 0, 2048, 2048, 0);
Это дало мне ошибку GL_INVALID_OPERATION, который я считаю, это вызвано тем, что фрейм-буфер не содержит альфа-значение, так, а не просто установив, что 1 , вызов завершается с ошибкой.
Следующая попытка:
// Setup texture
int id = glGenTexture();
glBindTexture(GL_TEXTURE_2D, id);
glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE, 0, 0, 2048, 2048, 0);
Это работает, но теперь мой glTexSubImage2D вызов не выполняется GL_INVALID_OPERATION, поскольку он определяет GL_ALPHA вместо GL_LUMINANCE. Таким образом, я изменил это, а также получить:
// Perform update
glBindTexture(GL_TEXTURE_2D, id);
glTexSubImage2D(GL_TEXTURE_2D, 0, x, y, width, height, GL_LUMINANCE, GL_UNSIGNED_BYTE, data);
И я изменил свой шейдер прочитать значение из r
, а не a
компонента.
Это работает на некоторых устройствах, но на iPhone 3GS я все еще получаю ошибку GL_INVALID_OPERATION в вызове glTexSubImage2D. Зачем? И как я могу это исправить? Есть ли способ, например, изменить внутренний формат текстуры? Или я могу создать другой фреймбуфер, который имеет альфа-компонент, который я могу использовать в качестве источника для glCopyTexImage2D?
Wow! Как я пропустил это? ЗДОРОВО! Конечно, жизнь становится намного проще! Спасибо! –
Есть ли у вас какие-либо идеи, откуда эта ошибка на iPhone 3GS? Это какая-то ошибка? Или какой-то особый случай, который я не вижу? Если я инициализирую текстуру с помощью glTexImage2D и GL_LUMINANCE, все работает, просто clCopyTexImage2D, похоже, не сочетается с GL_LUMINANCE ... –