记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
补上后,程序运行正常。

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值