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
补上后,程序运行正常。
网友评论