2014-10-22 80 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支持提供單獨的配置。這很可能是爲什麼上下文創建在某些設備上以「錯誤」順序調用成功的原因,而其他設備上的調用卻失敗了。