记OpenGL开发中一个低级错误

OpenGL ES程序运行报错:

A/libc: Fatal signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x0 in tid 21994 (GLThread 5518)

Debug定位问题是在Renderer 的onSurfaceCreated方法中,创建Program代码块。

override fun onSurfaceCreated(gl: GL10?, config: EGLConfig?) {
        GLES20.glClearColor(1.0f, 1.0f, 1.0f, 1.0f)
        createProgram(vertexShaderCode, fragmentShaderCode)
        ……
}

进一步定位具体调用代码处为编译着色器代码时,调用GLES20.glCreateShader()发生崩溃:

private fun compileShader(shaderType: Int, shaderCode: String): Int {
        val shaderObjectId = GLES20.glCreateShader(shaderType)
        checkGlError("glCreateShader")
        if (shaderObjectId == 0) {
            return 0
        }
        ……
}

难道是不在GLThread中?显然经过反复确认代码调用链,是在onSurfaceCreated中调用的glCreateShader,这就很诡异了。。。

先排除createProgram 函数中代码块是否有鬼。将glCreateShader单独拎出来调用试一试:

override fun onSurfaceCreated(gl: GL10?, config: EGLConfig?) {
        GLES20.glClearColor(1.0f, 1.0f, 1.0f, 1.0f)
        GLES20.glCreateShader(GLES20.GL_VERTEX_SHADER)
       // createProgram(vertexShaderCode, fragmentShaderCode)
        ……
}

程序运行,崩溃依旧,还是鲜红的 libc: Fatal signal 11 。那问题到底出在哪呢?
只能将OpenGL 相关代码逐行排查了,然后从初始化Renderer的代码处发现下面代码:

override fun initData() {
    ……
    mRender = ImageRender(
        context = this,
        vertexSourceId = R.raw.image_vert,
        fragmentSourceId = R.raw.image_frag
    )
    binding.glSurfaceView.setRenderer(mRender)
    ……
}

仔细一看,漏调用了关键函数setEGLContextClientVersion
补上后,程序运行正常。

你可能感兴趣的:(记OpenGL开发中一个低级错误)