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

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

OpenGLRenderer: битмап слишком большой, чтобы быть загруженным в текстуру

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

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

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

Ответ 1

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

Ответ 2

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

Из моего тестирования это довольно надёжно и не требует создания экземпляра. По производительности, это заняло 18 миллисекунд, чтобы выполнить на моей заметке 2 и только 4 миллисекунды на моем G3.

Ответ 3

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

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

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

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

Ответ 4

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

Параметр

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

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