2014-10-22 71 views
4
Open GL的错误配置错误

我收到以下错误三星S4三星S4

10-21 16:25:44.100: E/AndroidRuntime(29778): FATAL EXCEPTION: GLThread 11320 
10-21 16:25:44.100: E/AndroidRuntime(29778): Process: <bundle ID>, PID: 29778 
10-21 16:25:44.100: E/AndroidRuntime(29778): java.lang.RuntimeException: createContext failed: EGL_BAD_CONFIG 
10-21 16:25:44.100: E/AndroidRuntime(29778): at android.opengl.GLSurfaceView$EglHelper.throwEglException(GLSurfaceView.java:1201) 
10-21 16:25:44.100: E/AndroidRuntime(29778): at android.opengl.GLSurfaceView$EglHelper.throwEglException(GLSurfaceView.java:1192) 
10-21 16:25:44.100: E/AndroidRuntime(29778): at android.opengl.GLSurfaceView$EglHelper.start(GLSurfaceView.java:1042) 
10-21 16:25:44.100: E/AndroidRuntime(29778): at android.opengl.GLSurfaceView$GLThread.guardedRun(GLSurfaceView.java:1409) 
10-21 16:25:44.100: E/AndroidRuntime(29778): at android.opengl.GLSurfaceView$GLThread.run(GLSurfaceView.java:1248) 

的错误是因为:

this.setEGLContextFactory(new MyDefaultContextFactory()); 
this.setEGLConfigChooser(GL_RED_SIZE, GL_GREEN_SIZE, GL_BLUE_SIZE, GL_ALPHA_SIZE, 
     GL_DEPTH_SIZE, 0);//<-this line 
this.setDebugFlags(GLSurfaceView.DEBUG_CHECK_GL_ERROR 
     | GLSurfaceView.DEBUG_LOG_GL_CALLS); 
this.setPreserveEGLContextOnPause(true); 
this.setEGLContextClientVersion(2); 

如果通过配置为:8,8, 8,8,24

尽管在结束时移动上面的行。这是什么原因?

PS:在任何情况下,代码都可以在Nexus5或MotoG上正常工作。 运行奇巧4.4.2

回答

9

所有设备我没有看到它在documentation明确规定,但望着GLSurfaceViewsource code,它确实似乎是setEGLContextClientVersion()必须setEGLConfigChooser()之前调用的情况。

不复制任何代码,因为我不知道是否会侵犯版权,但是你可以沿着如果你拉了上面的代码链接如下:

  1. setEGLContextChooser()在你的代码中使用的过载实例化新的ComponentSizeChoser,将指定的大小传递给构造函数。
  2. ComponentSizeChooser的构造函数调用基类构造函数,将指定尺寸打包到配置规范中传递给基构造函数。基类是BaseConfigChooser
  3. BaseConfigChooser构造调用私有方法filterConfigSpec(),向它传递配置规范,
  4. filterConfigSpec()着眼于mEGLContextClientVersion成员变量的值,并用它来确定EGL_RENDERABLE_TYPE属性,把它添加到的值配置规范。然后它返回配置规范与这个额外的属性。
  5. 回到BaseConfigChooser构造函数,修改的配置规范被分配给一个成员变量。
  6. 此成员变量中的配置规范稍后在调用chooseConfig()方法时使用,其中选择实际配置。

mEGLContextClientVersion是由setEGLContextClientVersion()设置的值。因此,如果在setEGLContextChooser()之前调用setEGLContextClientVersion(),则使用此方法设置的值将仅包含在配置选择中。有些设备提供既支持ES 1.X又支持ES 2.0/3.0的配置,而其他设备则为1.X和2.0/3.0支持提供单独的配置。这很可能是为什么上下文创建在某些设备上以“错误”顺序调用成功的原因,而其他设备上的调用却失败了。