記OpenGL開發(fā)中一個低級錯誤

OpenGL ES程序運行報錯:

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

Debug定位問題是在Renderer 的onSurfaceCreated方法中,創(chuàng)建Program代碼塊。

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

進一步定位具體調(diào)用代碼處為編譯著色器代碼時,調(diào)用GLES20.glCreateShader()發(fā)生崩潰:

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

難道是不在GLThread中?顯然經(jīng)過反復(fù)確認代碼調(diào)用鏈,是在onSurfaceCreated中調(diào)用的glCreateShader,這就很詭異了。。。

先排除createProgram 函數(shù)中代碼塊是否有鬼。將glCreateShader單獨拎出來調(diào)用試一試:

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 相關(guān)代碼逐行排查了,然后從初始化Renderer的代碼處發(fā)現(xiàn)下面代碼:

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

仔細一看,漏調(diào)用了關(guān)鍵函數(shù)setEGLContextClientVersion
補上后,程序運行正常。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容