web-dev-qa-db-fra.com

Activité accélérée HW - comment obtenir la limite de taille de texture OpenGL?

J'essaie d'activer l'accélération hw dans Honeycomb et d'afficher des bitmaps sur Canvas. Tout fonctionne bien, mais pour les grands bitmaps (> 2048 dans une dimension), j'obtiens une erreur dans le journal:

OpenGLRenderer: Bitmap trop grand pour être téléchargé dans une texture

Je sais que cela est dû à la limitation hw, et peut contourner cela en réduisant la taille maximale du bitmap à afficher si l'accélération hw est activée (vérification par View.isHardwareAccelerated ()).

Ma question est: comment déterminer facilement la taille de texture maximale disponible pour le dessin Bitmap par le matériel. 2048 semble être limité sur mon appareil, mais il peut être différent sur différents appareils.

Edit: je ne crée pas d'application OpenGL, juste une application normale, qui peut utiliser l'accélération hw. Ainsi, je ne connais pas du tout OpenGL, je vois juste une erreur liée à OpenGL dans le journal et cherche à le résoudre.

45
Pointer Null

Actuellement, la limite minimale est de 2048 pixels (c'est-à-dire que le matériel doit prend en charge les textures au moins 2048x2048.) Dans ICS nous allons introduire une nouvelle API sur la classe Canvas qui vous donnera cette information:
Canvas.getMaximumBitmapWidth() et Canvas.getMaximumBitmapHeight().

65
Romain Guy

Une autre façon d'obtenir la taille maximale autorisée serait de parcourir toutes les configurations EGL10 et de garder une trace de la plus grande taille.

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);
}

D'après mes tests, c'est assez fiable et ne vous oblige pas à créer une instance. En termes de performances, cela a pris 18 millisecondes pour s'exécuter sur mon Note 2 et seulement 4 millisecondes sur mon G3.

16
Pkmmte

Si vous voulez connaître dynamiquement la taille limite de texture de votre appareil (car elle change en fonction de l'appareil), vous devez appeler cette méthode:

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

Et n'oubliez pas que pour certains appareils (le Nexus One par exemple), la taille de texture doit être une puissance de 2!

Je sais que ma réponse arrive longtemps après la dernière mise à jour de ce sujet ... désolé

6
VinceFR

Selon la spécification, appeler glGetIntegerv avec GL_MAX_TEXTURE_SIZE.

GL_MAX_TEXTURE_SIZE params renvoie une valeur. La valeur donne une estimation approximative de la plus grande texture que le GL peut gérer. La valeur doit être au moins 64.

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

3
K-ballo