2014-11-16 2 views
0

В моем андроида приложения У меня есть текстуры с MIPMAP массиваOpenGL ES | Доступ мипмап массив

final int[] textureHandle = new int[1]; 
GLES20.glGenTextures(1, textureHandle, 0); 
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, mTextureHandle); 
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER, filter); 
GLES20.glGenerateMipmap(GLES20.GL_TEXTURE_2D); 

Начальный размер текстуры 1024х1024. Мне нужно получить текстуры:

  • 512x512 (уровень 1)
  • 256x256 (уровень 2)
  • 128х128 (уровень 3)

Имеет OpenGL любой апи, чтобы получить доступ текстуры из MIPMAP массива?

ответ

2

Полный OpenGL имеет glGetTexImage() звонок для этой цели. Но он не доступен ни в одной версии OpenGL ES, вплоть до текущего ES 3.1.

Без этого вызова вы можете установить текстуру как вложение FBO, а затем прочитать содержимое с помощью glReadPixels(). Для чтения уровня lev:

int[] fboIds = new int[1]; 
GLES20.glGenFramebuffers(1, fboIds, 0); 
int fboId = fboIds[0]; 
glBindFramebuffer(GLES20.GL_FRAMEBUFFER, fboId); 
glFramebufferTexture2D(GLES20.GL_FRAMEBUFFER, GLES20.GL_COLOR_ATTACHMENT0, 
         GLES20.GL_TEXTURE_2D, mTextureHandle, lev); 
glReadPixels(...); 
glBindFramebuffer(GLES20.GL_FRAMEBUFFER, 0); 

Этот подход несколько ограничен, потому что она будет работать только для форматов текстур, которые имеют цветовую отображаемый. Другие форматы недействительны как вложения FBO. Единственными форматами, гарантируемыми цветопередачей в ES 2.0, являются RGBA4444, RGB5_A1 и RGB565. Многие устройства имеют расширения, которые поддерживают поддержку форматов, таких как RGB8 и RGBA8.

Следующим лучшим подходом является рендеринг квадрата с текстурой, а затем считывание результата с помощью glReadPixels(). Но у вас будут те же ограничения на формат цели рендеринга. Например, если ваша текстура RGBA8, и ваше устройство не поддерживает рендеринг поверхностей RGBA8, вы бы потеряли точность при таком подходе.