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()
.