Android OpenGL Cannot create GL program: 0 GL error: 1282
Android OpenGL create GL program: 0 & GL error: 1282
快速解決
1. 使用GLSurfaceView的話
請在繼承類中合適的地方(一般是構造函數里面)設置當前的clientversion 為 2
具體代碼:
2. 使用自己構建的opengl環境的話
請在創建glContext的時傳入的參數中配置 int[] attrib_list = { EGL_CONTEXT_CLIENT_VERSION, 2 , EGL10.EGL_NONE };
具體代碼如下,注意 attrib_list 中的第二個元素寫為 2 。
注意,int EGL_CONTEXT_CLIENT_VERSION = 0x3098。到此,是同樣的問題的話,應該得到了解決,可以繼續搬磚了。
有興趣的繼續往下看:
出錯代碼鑒賞
int shader = GLES20.glCreateShader(type);// add the source code to the shader and compile itGLES20.glShaderSource(shader, shaderCode);checkError();GLES20.glCompileShader(shader);checkError();int program = GLES20.glCreateProgram();checkError();該段代碼一般是封裝為一個叫loadShader的函數中,本身是無誤,但達不到期望的效果,如果在checkError里面拋出異常,那么就掛掉了。
通過上面的解決方法和代碼,問題的原因就明顯了:
GLES20.xxx() 和open環境不一致。即 opengl的環境不是2.0,卻使用了2.0的接口 ,所以將opengl的版本指定(初始化)為 2。
有些朋友可能直接提問 loadShader出錯,實際上的代碼是上面的代碼片段。
GLSurfaceView 部分代碼分享
GLSurfaceView 源碼是API level 30.
從createContext 中代碼可看出,mEGLContextClientVersion 為0 的時候 ,egl.eglCreateContext的最后一個參數傳入的是null。同時mEGLContextClientVersion 又是 attrib_list 數組第二個元素,版本openGl2.0就是通過這個參數確定的。
精簡了函數的注釋,可以從注釋上面得到一些啟發, Pick an OpenGL ES 2.0 context。
綜合起來使用GLSurfaceView的opengl便利的情況下要使用2.0,優先調用setEGLContextClientVersion(2)
基于TextureView 或SufaceView創建openglcontext
最終的要調用的代碼如下:
int[] attrib_list = { EGL_CONTEXT_CLIENT_VERSION, 2, EGL10.EGL_NONE }; EGLContext glContext = egl.eglCreateContext(display, config, EGL10.EGL_NO_CONTEXT,attrib_list);version 可以根據需要進行指定。
補充:
自定義 GLSurfaceView 的 setEGLContextFactory 是提供自定義創建opengl環境的接口,只要根據上面兩個關鍵調用實現EGLContextFactory 就可以,GLSurfaceView的默認實現就是DefaultContextFactory。
總結
以上是生活随笔為你收集整理的Android OpenGL Cannot create GL program: 0 GL error: 1282的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mac os11以下安装Xcode
- 下一篇: JDBC——实现通用的查询