unity texture texturas para multiples for filtros example ejemplos best android android-3.0-honeycomb hardware-acceleration

android - texturas - texture opengl example c++



Actividad acelerada de HW: ¿cómo obtener el límite de tamaño de la textura de OpenGL? (4)

Intento habilitar la aceleración de hw en Honeycomb y mostrar algunos mapas de bits en Canvas. Todo funciona bien, pero para mapas de bits grandes (> 2048 en una dimensión), obtengo un error en el registro:

OpenGLRenderer: mapa de bits demasiado grande para ser cargado en una textura

Sé que esto se debe a la limitación de hw, y puede solucionarlo reduciendo el tamaño máximo del mapa de bits para que se muestre si la aceleración de hw está habilitada (comprobando con View.isHardwareAccelerated ()).

Mi pregunta es: cómo determinar fácilmente el tamaño máximo de la textura disponible para el dibujo de mapa de bits por hardware. 2048 parece ser un límite en mi dispositivo, pero puede ser diferente en diferentes dispositivos.

Editar: No estoy creando la aplicación OpenGL, solo la aplicación normal, que puede utilizar la aceleración de hw. Por lo tanto, no estoy familiarizado con OpenGL en absoluto, solo veo el error relacionado con OpenGL en el registro, y miro para resolverlo.


De acuerdo con la especificación, llamando a glGetIntegerv con GL_MAX_TEXTURE_SIZE .

GL_MAX_TEXTURE_SIZE params devuelve un valor. El valor proporciona una estimación aproximada de la textura más grande que GL puede manejar. El valor debe ser al menos 64.

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


Otra forma de obtener el tamaño máximo permitido sería recorrer todas las configuraciones de EGL10 y realizar un seguimiento del tamaño más grande.

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

De mi prueba, esto es bastante confiable y no requiere que crees una instancia. En cuanto al rendimiento, esto tomó 18 milisegundos para ejecutarse en mi Note 2 y solo 4 milisegundos en mi G3.


Si desea conocer dinámicamente el límite de tamaño de la textura de su dispositivo (porque es un cambio según el dispositivo), debe llamar a este método:

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

Y no olvide que para algunos dispositivos (el Nexus One por ejemplo), ¡el tamaño de la textura debe ser de 2!

Sé que mi respuesta llega mucho después de la última actualización de este tema ... lo siento


Actualmente, el límite mínimo es 2048px (es decir, el hardware debe admitir texturas de al menos 2048x2048). En ICS, presentaremos una nueva API en la clase Canvas que le proporcionará esta información:
Canvas.getMaximumBitmapWidth() y Canvas.getMaximumBitmapHeight() .