HW ускорил активность - как получить ограничение размера текстуры OpenGL?
Я пытаюсь включить ускорение hw в Honeycomb и отображать некоторые растровые изображения на Canvas. Все работает нормально, но для больших растровых изображений (>2048 в одном измерении) я получаю сообщение об ошибке в журнале:
OpenGLRenderer: растровое изображение слишком велико для загрузки в текстуру
Я знаю, что это из-за ограничения hw и может обойти его, уменьшив максимальный размер растрового изображения, который будет отображаться, если включено ускорение hw (проверка с помощью View.isHardwareAccelerated()).
Мой вопрос: как легко определить максимальный размер текстуры, доступный для растрового рисования аппаратным обеспечением. 2048, кажется, предел для моего устройства, но он может отличаться на разных.
Изменить: я не создаю приложение OpenGL, просто обычное приложение, которое может использовать ускорение hw. Таким образом, я совсем не знаком с OpenGL, я просто вижу связанную с OpenGL ошибку в журнале и пытаюсь ее решить.
4 ответа
В настоящее время минимальный предел составляет 2048 пикселей (т. Е. Аппаратное обеспечение должно поддерживать текстуры не менее 2048x2048). В ICS мы представим новый API для класса Canvas, который предоставит вам следующую информацию:Canvas.getMaximumBitmapWidth()
а также Canvas.getMaximumBitmapHeight()
,
Другим способом получения максимально допустимого размера было бы перебирать все конфигурации EGL10 и отслеживать самый большой размер.
public static int getMaxTextureSize() {
// Safe minimum default size
final int IMAGE_MAX_BITMAP_DIMENSION = 2048;
// Get EGL Display
EGL10 egl = (EGL10) EGLContext.getEGL();
EGLDisplay display = egl.eglGetDisplay(EGL10.EGL_DEFAULT_DISPLAY);
// Initialise
int[] version = new int[2];
egl.eglInitialize(display, version);
// Query total number of configurations
int[] totalConfigurations = new int[1];
egl.eglGetConfigs(display, null, 0, totalConfigurations);
// Query actual list configurations
EGLConfig[] configurationsList = new EGLConfig[totalConfigurations[0]];
egl.eglGetConfigs(display, configurationsList, totalConfigurations[0], totalConfigurations);
int[] textureSize = new int[1];
int maximumTextureSize = 0;
// Iterate through all the configurations to located the maximum texture size
for (int i = 0; i < totalConfigurations[0]; i++) {
// Only need to check for width since opengl textures are always squared
egl.eglGetConfigAttrib(display, configurationsList[i], EGL10.EGL_MAX_PBUFFER_WIDTH, textureSize);
// Keep track of the maximum texture size
if (maximumTextureSize < textureSize[0])
maximumTextureSize = textureSize[0];
}
// Release
egl.eglTerminate(display);
// Return largest texture size found, or default
return Math.max(maximumTextureSize, IMAGE_MAX_BITMAP_DIMENSION);
}
Из моего тестирования это довольно надежно и не требует от вас создания экземпляра. Что касается производительности, на моем Note 2 потребовалось 18 миллисекунд, а на моем G3 - всего 4 миллисекунды.
Если вы хотите динамически узнать ограничение размера текстуры вашего устройства (поскольку оно изменяется в зависимости от устройства), вам нужно вызвать этот метод:
int[] maxTextureSize = new int[1];
gl.glGetIntegerv(GL10.GL_MAX_TEXTURE_SIZE, maxTextureSize, 0);
И не забывайте, что для некоторых устройств (например, Nexus One) размер текстуры должен быть степенью 2!
Я знаю, что мой ответ приходит через много времени после последнего обновления этой темы... извините
Согласно спецификации, звоня glGetIntegerv
с GL_MAX_TEXTURE_SIZE
,
GL_MAX_TEXTURE_SIZE params возвращает одно значение. Значение дает приблизительную оценку самой большой текстуры, которую может обработать GL. Значение должно быть не менее 64.
http://www.khronos.org/opengles/sdk/docs/man/xhtml/glGet.xml