OpenGL (ES) 调试总结

November 20, 2022 OpenGL 的调试或者说图形 API 的调试,相比普通的程序调试(如C++/Java)有不少区别,主要有: CPU 端仅提交数据&指令,驱动 / GPU 的渲染实现是一个“黑盒” OpenGL Context 是一个巨大的状态机,很多内部状态不能直接读写 CPU/GPU 内存隔离,GL 对象(纹理、buffer 等)由内部创建/释放,无法直接查看内存数据 异步执行,无法跟踪渲染指令的具体执行,GPU 端渲染流水线无法断点 Shader 代码无法在运行时断点调试,无法查看 Shader 中各变量的值 因此调试难度相对更高,这里针对 OpenGL (ES) 对一些常用调试方法做一个梳理。 一、调试相关 API 早期的 OpenGL 版本中,glGetError 是唯一的错误检查 API,使用简单,对执行环境 (Context) 无要求,但错误信息简略,不便于问题的快速定位,到了 OpenGL 4.3/OpenGL ES 3.2 版本,核心标准加入了 debug output 相关 API,报错信息更完善,并新增了不少新特性,同时不再默认开启(需要 glEnable 手动打开),而到了 Vulkan 时代,则设计了 Validation Layer 的概念,将错误检查、性能监控等调试功能交给开发者自己实现,以保持驱动本身的简洁和高性能。这里针对 OpenGLContinue reading “OpenGL (ES) 调试总结”