我正在android上尝试一些opengl,我以前没有任何3d编程经验。很明显我在程序中犯了不少错误。
当我遇到一个问题并发现glGetError产生了一个错误代码时,我只是在每次调用绘图代码中的opengl命令之后添加对glGetError的调用。虽然这样做了,我发现了我的错误,我的绘图代码现在是两倍大,在我看来更难阅读。
有没有办法摆脱所有这些对glGetError的显式调用并自动调用它?最好,我的应用程序应该中止,并显示如果发生opengl错误,哪个命令应该负责。

最佳答案

从4.2版开始,Android在手机的开发选项中提供了一个名为“启用OpenGL跟踪”的选项。如果将其设置为“在glgeterror上调用堆栈”,则会得到如下输出

07-15 15:44:43.045: D/libEGL(14251): [glEnableClientState] 0x500
07-15 15:44:43.068: D/CallStack(14251): glGetError:glEnableClientState#00  pc 00019388  /system/lib/libEGL.so
07-15 15:44:43.076: D/CallStack(14251): glGetError:glEnableClientState#01  pc 0001e290  /system/lib/libdvm.so (dvmPlatformInvoke+112)
07-15 15:44:43.076: D/CallStack(14251): glGetError:glEnableClientState#02  pc 0004d410  /system/lib/libdvm.so (dvmCallJNIMethod(unsigned int const*, JValue*, Method const*, Thread*)+395)
07-15 15:44:43.076: D/CallStack(14251): glGetError:glEnableClientState#03  pc 000276e4  /system/lib/libdvm.so

在日志里。在本例中,我向glEnableClientState()传递了错误的enum/int来触发错误。请注意,启用此选项将“消耗”此错误,并且进一步的glGetError()检查将不再报告此错误。相反,现在可以节省在代码中输入glGetError()调用的时间,只需grep“glgeterror:”的日志输出。

08-04 02:00