在安卓中获取OpenGL ES 2.0纹理的最大尺寸限制

9
我正在尝试获取Android上OpenGL 2.0的最大纹理大小限制。但我发现以下指令仅在当前处于OpenGL上下文中时才起作用,换句话说,我必须拥有一个GL Surface和一个GL Renderer等内容,而这并不是我想要的。
int[] maxTextureSize = new int[1];
GLES20.glGetIntegerv(GLES20.GL_MAX_TEXTURE_SIZE, maxTextureSize, 0);

因此,我提出了下一个算法,它可以在不创建任何表面或渲染器的情况下为我提供最大的纹理尺寸。 它能够正确工作,所以我的问题是这是否适用于所有Android设备,并且如果有人发现任何错误,请告诉我。

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
你确定GL纹理大小绑定到了EGL pbuffer大小吗?这个规范在EGL 1.0的某个地方有提到吗? - Stefan Hanke
1个回答

6
的最大尺寸不幸与最大纹理尺寸无关(但可能相同)。
我认为获取最大纹理大小的最佳方法是创建GL上下文(在您实际使用这些纹理的同一上下文中),并询问GL_MAX_TEXTURE_SIZE。
这背后有一个强有力的理由:在表面(和上下文)创建之前,OpenGL驱动程序未针对当前进程进行初始化。某些驱动程序在初始化时执行底层HW / SKU检测,并根据HW功能计算最大表面大小。
此外,最大纹理大小允许根据上下文(和EGLConfig上创建的上下文)而异。
还有一件事:eglGetConfigs将获取所有EGLconfigs,包括默认软件Android渲染器或OpenGL ES 1.1CM HW驱动程序的EGLconfig(如果目标平台上有单独的1.1和2.0驱动程序)。驱动程序在图形堆栈中有点独立,可以返回不同的最大值。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接