HW ускорил активность - как получить ограничение размера текстуры OpenGL? - PullRequest
45 голосов
/ 15 сентября 2011

Я пытаюсь включить ускорение hw в Honeycomb и отображать некоторые растровые изображения на Canvas. Все работает нормально, но для больших растровых изображений (> 2048 в одном измерении) я получаю сообщение об ошибке в журнале:

OpenGLRenderer: Растровое изображение слишком велико для загрузки в текстуру

Я знаю, что это из-за ограничения hw и может обойти его, уменьшив максимальный размер растрового изображения, отображаемого, если включено ускорение hw (проверка View.isHardwareAccelerated ()).

Мой вопрос: как легко определить максимальный размер текстуры, доступный для растрового рисования аппаратным обеспечением. Кажется, 2048 год ограничен для моего устройства, но может отличаться для разных.

Редактировать: я не создаю приложение OpenGL, просто обычное приложение, которое может использовать ускорение hw. Таким образом, я совсем не знаком с OpenGL, я просто вижу связанную с OpenGL ошибку в журнале и пытаюсь ее решить.

Ответы [ 4 ]

65 голосов
/ 23 сентября 2011

В настоящее время минимальный лимит составляет 2048 пикселей (т. Е. Аппаратное обеспечение должно поддерживать текстуры не менее 2048x2048.) В ICS мы представим новый API для класса Canvas, который даст вам эту информацию:
Canvas.getMaximumBitmapWidth() и Canvas.getMaximumBitmapHeight().

16 голосов
/ 09 ноября 2014

Другим способом получения максимально допустимого размера было бы перебрать все конфигурации 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 миллисекунды.

6 голосов
/ 26 июля 2012

Если вы хотите динамически узнать ограничение размера текстуры вашего устройства (поскольку оно изменяется в зависимости от устройства), вам нужно вызвать этот метод:

int[] maxTextureSize = new int[1];
gl.glGetIntegerv(GL10.GL_MAX_TEXTURE_SIZE, maxTextureSize, 0);

И не забывайте, что для некоторых устройств (например, Nexus One) размер текстуры должен быть степенью 2!

Я знаю, что мой ответ приходит очень долго после последнего обновления этой темы ... извините

3 голосов
/ 18 сентября 2011

Согласно спецификации, вызов glGetIntegerv с GL_MAX_TEXTURE_SIZE.

GL_MAX_TEXTURE_SIZE возвращает одно значениеЗначение дает приблизительную оценку самой большой текстуры, которую может обработать GL.Значение должно быть не менее 64.

http://www.khronos.org/opengles/sdk/docs/man/xhtml/glGet.xml

...