2011-06-23 58 views
7

Tôi đang tạo ứng dụng cho Android cho cấp API> = 7. Một màn hình sử dụng GLSurfaceView với OpenGL ES 2.0 thông qua ndk. Làm thế nào tôi có thể phát hiện nếu opengl 2.0 có sẵn? Tôi không thể sử dụng android:glEsVersion="0x00020000" trong tệp AndroidManifest.xml của mình vì tôi phải hỗ trợ tất cả điện thoại có cấp API> = 7. Nếu không có hỗ trợ cho 2.0, tôi sẽ hiển thị màn hình tĩnh.Phát hiện xem OpenGl ES 2.0 có khả dụng hay không

Tôi đang sử dụng mã tương tự từ ứng dụng mẫu hello-gl2 đi kèm với ndk. Trong GL2JNIView, khi nó thiết lập bối cảnh Opengl, nếu nó không tìm thấy một cấu hình opengl thích hợp (trong trường hợp của tôi là một cấu hình yêu cầu phiên bản 2.0 2.0) nó ném một IllegalArgumentException("No configs match configSpec") và ứng dụng bị treo. Tôi không thể tìm được cách nào để ngăn chặn ngoại lệ đó và làm điều gì khác trên màn hình đó. Bất kỳ ý tưởng?

Trả lời

7

Đây là những gì tôi tìm thấy trong internets:

private boolean checkGL20Support(Context context) 
{ 
    EGL10 egl = (EGL10) EGLContext.getEGL();  
    EGLDisplay display = egl.eglGetDisplay(EGL10.EGL_DEFAULT_DISPLAY); 

    int[] version = new int[2]; 
    egl.eglInitialize(display, version); 

    int EGL_OPENGL_ES2_BIT = 4; 
    int[] configAttribs = 
    { 
     EGL10.EGL_RED_SIZE, 4, 
     EGL10.EGL_GREEN_SIZE, 4, 
     EGL10.EGL_BLUE_SIZE, 4, 
     EGL10.EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT, 
     EGL10.EGL_NONE 
    }; 

    EGLConfig[] configs = new EGLConfig[10]; 
    int[] num_config = new int[1]; 
    egl.eglChooseConfig(display, configAttribs, configs, 10, num_config);  
    egl.eglTerminate(display); 
    return num_config[0] > 0; 
} 

Nguồn: http://www.badlogicgames.com/wordpress/?p=343

7

Có lẽ điều này có thể giúp

@Override 
public void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 

    // Check if the system supports OpenGL ES 2.0. 
    final ActivityManager activityManager = (ActivityManager)getSystemService(Context.ACTIVITY_SERVICE); 
    final ConfigurationInfo configurationInfo = activityManager.getDeviceConfigurationInfo(); 
    final boolean supportsEs2 = configurationInfo.reqGlEsVersion >= 0x20000; 

    if (supportsEs2) 
    { 
    // Request an OpenGL ES 2.0 compatible context. 

    } 
    else 
    { 
    // This is where you could create an OpenGL ES 1.x compatible 
    // renderer if you wanted to support both ES 1 and ES 2. 

    } 
} 
1

Từ (Compatibility Test Suite) CTS của Android OpenGlEsVersionTest.java:

private static int getVersionFromPackageManager(Context context) { 
    PackageManager packageManager = context.getPackageManager(); 
    FeatureInfo[] featureInfos = packageManager.getSystemAvailableFeatures(); 
    if (featureInfos != null && featureInfos.length > 0) { 
     for (FeatureInfo featureInfo : featureInfos) { 
      // Null feature name means this feature is the open gl es version feature. 
      if (featureInfo.name == null) { 
       if (featureInfo.reqGlEsVersion != FeatureInfo.GL_ES_VERSION_UNDEFINED) { 
        return getMajorVersion(featureInfo.reqGlEsVersion); 
       } else { 
        return 1; // Lack of property means OpenGL ES version 1 
       } 
      } 
     } 
    } 
    return 1; 
} 

/** @see FeatureInfo#getGlEsVersion() */ 
private static int getMajorVersion(int glEsVersion) { 
    return ((glEsVersion & 0xffff0000) >> 16); 
} 

Nó thực sự cung cấp một vài cách khác là tốt và kiểm tra xác minh rằng tất cả họ đều trả lại kết quả tương tự.

Các vấn đề liên quan