Полный 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
, вы бы потеряли точность при таком подходе.