在Android中获得最大OpenGL ES 2.0纹理大小限制

在Android中获得最大OpenGL ES 2.0纹理大小限制,android,opengl-es,textures,Android,Opengl Es,Textures,我正在尝试在Android中获得OpenGL 2.0的最大纹理大小限制。 但我发现,下一条指令只有在我当前处于OpenGL上下文中时才有效,换句话说,我必须有一个GL曲面和一个GL渲染器,等等,这是我不想要的 int[] maxTextureSize = new int[1]; GLES20.glGetIntegerv(GLES20.GL_MAX_TEXTURE_SIZE, maxTextureSize, 0); 所以我使用了下一个算法,它可以在不创建任何曲面或渲染器的情况下为我提供最大的纹理

我正在尝试在Android中获得OpenGL 2.0的最大纹理大小限制。 但我发现,下一条指令只有在我当前处于OpenGL上下文中时才有效,换句话说,我必须有一个GL曲面和一个GL渲染器,等等,这是我不想要的

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;

}
public int getMaximumTextureSize()
{
EGL10 egl=(EGL10)EGLContext.getEGL();
EGLDisplay display=egl.eglGetDisplay(EGL10.egl\u默认显示);
//初始化
int[]版本=新int[2];
egl.eglinitalize(显示,版本);
//查询配置总数
int[]totalConfigurations=新的int[1];
egl.eglGetConfigs(显示、空、0、总配置);
//查询实际列表配置
EGLConfig[]配置列表=新的EGLConfig[totalConfigurations[0]];
egl.eglGetConfigs(显示、配置列表、totalConfigurations[0],totalConfigurations);
int[]textureSize=新int[1];
int maximumTextureSize=0;
//迭代所有配置以确定最大纹理大小
对于(int i=0;i
PBUFFER max size不幸与最大纹理大小无关(但可能相同)

我认为获得最大纹理大小的最佳方法是创建GL上下文(与实际使用此纹理的上下文相同)并要求GL_max_texture_size

这背后有一个强有力的原因:在创建表面(和上下文)之前,当前进程的ogl驱动程序没有初始化。一些驱动程序在初始化时执行底层硬件/SKU检测,并根据硬件功能计算最大表面尺寸

此外,最大纹理大小允许根据上下文而变化(并且EGLConfig上下文是在上创建的)


还有一件事:eglGetConfigs将为您提供所有EGLConfig,甚至是来自默认软件、android渲染器或OpenGL ES 1.1CM HW驱动程序(如果目标平台上有1.1和2.0的单独驱动程序)的EgLConfig。驱动程序在图形堆栈中是独立的,可以返回不同的最大值

您确定GL纹理大小已绑定到EGL pbuffer大小吗?这是否包含在EGL1.0规范中?