硬件加速活动 – 如何获得OpenGL纹理大小限制?
我试图在蜂窝中启用hw加速,并在canvas上显示一些位图。 所有工作正常,但对于大型位图(>一维2048),我得到日志中的错误:
OpenGLRenderer:位图太大,无法上传到纹理
我知道这是由于hw的限制,可以通过减less最大位图大小来显示,如果启用hw加速(通过View.isHardwareAccelerated()进行检查)。
我的问题是:如何轻松确定可用于硬件位图绘制的最大纹理大小。 2048似乎是我的设备上的限制,但它可能会在不同的。
编辑:我没有创buildOpenGL应用程序,只是普通的应用程序,它可以利用hw加速。 因此我根本不熟悉OpenGL,我只是在日志中看到OpenGL相关的错误,并期待解决它。
目前最小限制是2048px(即硬件必须支持纹理至less2048x2048)。在ICS中,我们将在Canvas类中引入一个新的API,它将提供以下信息:
Canvas.getMaximumBitmapWidth()
和Canvas.getMaximumBitmapHeight()
。
获得最大允许尺寸的另一种方法是遍历所有EGL10configuration并跟踪最大尺寸。
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); }
从我的testing,这是相当可靠的,不需要你创build一个实例。 在性能方面,这需要18毫秒来执行我的Note 2,而我的G3只有4毫秒。
如果你想dynamic地知道你的设备的纹理尺寸限制(因为它取决于设备的变化),你必须调用这个方法:
int[] maxTextureSize = new int[1]; gl.glGetIntegerv(GL10.GL_MAX_TEXTURE_SIZE, maxTextureSize, 0);
不要忘记,对于某些设备(例如Nexus One),纹理尺寸必须是2的幂!
我知道我的答案是在这个主题的最后一次更新后很长一段时间…对不起
根据规范,使用GL_MAX_TEXTURE_SIZE
调用GL_MAX_TEXTURE_SIZE
。
GL_MAX_TEXTURE_SIZE params返回一个值。 该值给出了GL可处理的最大纹理的粗略估计。 该值必须至less为64。
http://www.khronos.org/opengles/sdk/docs/man/xhtml/glGet.xml