opengGL的开发比较麻烦的一点就是错误查找不好跟踪。glGetError()会返回最前面的一个错误码,注意这不一定是最后的gl函数调用所产生的错误码。opengl的错误码是按照先进先出的方式处理。
我在开发安卓播放器(MediaCodec + opengl)的时候遇到很糗的一件事,在rk3228运行的时候,黑屏,Trace出来一个warning:
bingTextureImage:clearing gl error 0x500. 开始的时候一直以为是glBindTexutre的错误,根据错误码,好像是不支持OES类型的纹理导致,以为是不是这个芯片不支持,很长时间,直到我看到了SurfaceTexture.UpdateTexImage()源代码才知道,报的警告是这个函数处理的,但是并不是这个函数有问题,而是前一次调用opengl的渲染函数(一堆)时产生的,它在这里做了清除(所以叫clearing)。所以查错集中在渲染部分,一个个的查,终于找到问题了。
有时候修正问题并不难,难的是“定位”问题在哪里,就行治病一样,你得知道病灶在哪,然后才能治病啊!
时间: 2024-11-08 19:26:33