2015-05-09 3 views
4

Контекст вопроса - OpenGL ES 2.0 в среде Android. У меня есть текстура. Нет проблем с отображением или использованием.Opengl ES 2.0: получите размер текстуры и другую информацию

Есть ли способ узнать его ширину и высоту и другую информацию (например, внутренний формат), просто начиная с идентификатора привязки?

Мне нужно сохранить текстуру в растровое изображение, не зная размер текстуры.

ответ

6

Не в ES 2.0. На самом деле это удивительно, что функциональности там нет. Вы можете получить размер renderbuffer, но не размер текстуры, который кажется непоследовательным.

Доступны только те значения, которые вы можете получить с помощью glGetTexParameteriv(), которые являются параметрами для текстуры FILTER10 и WRAP.

Это все еще не в ES 3.0. Только в ES 3.1 добавлен glGetTexLevelParameteriv(), который дает вам доступ ко всем значениям, которые вы ищете. Например, чтобы получить ширину и высоту в настоящее время связаны текстуры:

int[] texDims = new int[2]; 
GLES31.glGetTexLevelParameteriv(GLES31.GL_TEXTURE_2D, 0, GL_TEXTURE_WIDTH, texDims, 0); 
GLES31.glGetTexLevelParameteriv(GLES31.GL_TEXTURE_2D, 0, GL_TEXTURE_HEIGHT, texDims, 1); 
0

Как @Reto KORADI сказал, что нет никакого способа сделать это, но вы можете сохранить ширину и высоту текстуры при загрузке его из андроид, прежде чем связывать его в OpenGL.

AssetManager am = context.getAssets(); 
    InputStream is = null; 
    try { 
     is = am.open(name); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    final Bitmap bitmap = BitmapFactory.decodeStream(is); 
    int width = bitmap.getWidth(); 
    int height = bitmap.getHeight(); 

    // here is you bind your texture in openGL 
0

Я предлагаю взломать это. Используйте функцию текстуры ESSL. Чтобы получить доступ к его результату со стороны ЦП, вам нужно будет передать текстуру как единое целое шейдеру и вывести размер текстуры как r &g компонентов вашего шейдерного вывода. Примените этот шейдер к примитиву 1x1px, нарисованному на FBO 1x1px, затем прочитайте обратное значение с графического процессора с помощью glReadPixels.

Вы должны быть осторожны с закруглениями, зажимами и форматами FBO. Вам может понадобиться 16-битный целочисленный формат FBO.

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