2012-06-13 18 views
8

Estoy tratando de obtener el límite máximo de tamaño de la textura en Android para OpenGL 2.0. Pero he encontrado que la siguiente instrucción solo funciona si estoy actualmente dentro del contexto de OpenGL, en otras palabras, debo tener un GL Surface y un GL Renderer, etc., que no quiero.Obtenga el límite máximo de tamaño de la textura OpenGL ES 2.0 en Android

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

Así que vinieron con el siguiente algoritmo, que me da el tamaño máximo de la textura sin tener que crear cualquier superficie o procesador. Funciona correctamente, por lo que mi pregunta es si esto funcionará con todos los dispositivos Android, y si alguien puede detectar cualquier error, por las dudas.

public int getMaximumTextureSize() 
{ 
    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]; 
     } 

     Log.i("GLHelper", Integer.toString(textureSize[0])); 
    } 

    // Release 
    egl.eglTerminate(display); 
    Log.i("GLHelper", "Maximum GL texture size: " + Integer.toString(maximumTextureSize)); 

    return maximumTextureSize; 

} 
+1

¿Estás seguro de que el tamaño de la textura GL está ligado al tamaño del pbuffer de EGL? ¿Está esto contenido en la especificación EGL 1.0 en alguna parte? –

Respuesta

6

El tamaño máximo de PBUFFER no está relacionado con el tamaño máximo de la textura (pero puede ser el mismo).

Creo que la mejor manera de obtener el tamaño máximo de la textura es crear un contexto GL (en el mismo contexto que uno en el que Utilizará realmente estas texturas) y solicitar GL_MAX_TEXTURE_SIZE.

Hay una fuerte razón detrás de esto: el controlador ogl no se inicializa para el proceso actual antes de la creación de la superficie (y el contexto). Algunos controladores realizan la detección subyacente de HW/SKU en la inicialización y calculan los tamaños máximos de superficie en función de las capacidades de HW.

Además, se permite que el tamaño máximo de la textura varíe según el contexto (y se creó el contexto EGLConfig).

Y una cosa más: eglGetConfigs obtendrá todos los EGLconfigs, incluso estos de forma predeterminada, el procesador de Android, o estos de OpenGL ES 1.1CM HW driver (si hay controladores separados para 1.1 y 2.0 en la plataforma de destino). Los controladores son más o menos independientes en la pila de gráficos y pueden devolver diferentes max-es.

Cuestiones relacionadas