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

Другие вопросы по тегам