2015-08-07 4 views
1

Для кеша текстур 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?

ответ

1

data может быть NULL в вашем glTexImage2D() вызова, если вы просто хотите, чтобы выделить пустую текстуру:

data может быть пустой указатель. В этом случае память текстуры выделяется для размещения текстуры width и height. Затем вы можете загрузить подтексты для инициализации этой текстурной памяти. Изображение не определено, если пользователь пытается применить неинициализированную часть изображения текстуры к примитиву.

+0

Wow! Как я пропустил это? ЗДОРОВО! Конечно, жизнь становится намного проще! Спасибо! –

+0

Есть ли у вас какие-либо идеи, откуда эта ошибка на iPhone 3GS? Это какая-то ошибка? Или какой-то особый случай, который я не вижу? Если я инициализирую текстуру с помощью glTexImage2D и GL_LUMINANCE, все работает, просто clCopyTexImage2D, похоже, не сочетается с GL_LUMINANCE ... –

 Смежные вопросы

  • Нет связанных вопросов^_^