计算机图形学差不多忘光了。OpenGL 有点固定渲染流水线的概念,无实际项目经验。现在有点想法,想自己做点东西,要从头学。目标平台是嵌入式 Linux。选定 OpenGL ES 最低版本,2.0,因为有些 BSP 还没支持到 3.x,例如 NXP i.MX 8M Mini 就只支持 2.0。
开发环境是 Ubuntu 22.04,硬件平台 Raspberry Pi 4 Model B。Ubuntu 默认图形协议是 Wayland,在用户登录界面改成 X11。试验了几个应用框架,包括 GLFW, SDL2, Gtk 3.0,以及徒手写 Wayland 客户端,都遇到大小各式毛病。感觉现阶段 Wayland 协议本身以及软件对 Wayland 的支持还是不够成熟。最终停留在 X11 + SDL2 这个组合。
安装最基本的开发库/工具:
apt-get install libgles2-mesa-dev libegl1-mesa-dev mesa-utils libsdl2-dev libsdl2-image-dev libsdl2-ttf-dev
mesa-utils 包含 glxinfo 等工具。执行 glxinfo 可查看 OpenGL 相关信息(现在大部分都看不懂,但愿很快能)。其中一些让我有兴趣的:
Extended renderer info (GLX_MESA_query_renderer):
Vendor: Broadcom (0x14e4)
Device: V3D 4.2 (0xffffffff)
Version: 23.0.4
Accelerated: yes
Video memory: 3790MB
Unified memory: yes
Preferred profile: compat (0x2)
Max core profile version: 0.0
Max compat profile version: 2.1
Max GLES1 profile version: 1.1
Max GLES[23] profile version: 3.1
OpenGL vendor string: Broadcom
OpenGL renderer string: V3D 4.2
OpenGL version string: 2.1 Mesa 23.0.4-0ubuntu1~22.04.1
OpenGL shading language version string: 1.20
...
OpenGL ES profile version string: OpenGL ES 3.1 Mesa 23.0.4-0ubuntu1~22.04.1
OpenGL ES profile shading language version string: OpenGL ES GLSL ES 3.10
OpenGL ES profile extensions:
GL_AMD_performance_monitor, GL_ANGLE_pack_reverse_row_order,
GL_ANGLE_texture_compression_dxt3, GL_ANGLE_texture_compression_dxt5,
GL_APPLE_texture_max_level, GL_EXT_EGL_image_storage,
...
看到 Raspberry Pi 支持 OpenGL ES 3.1。很想知道“profile”和“extension”的意思啊。
除了 ES 2.0 及 GLSL 的官方 Spec 文档,还找到两本很好的参考书,“OpenGL ES 2.0 Programming guide”和“Introduction to Computer Graphics with OpenGL ES”。尤其喜欢后者!这是一本教材,计算机图形学理论及 OpenGL ES 的实现并重,不厚,言简意赅,条理非常清晰。它主要基于 ES 3.0 API,还涉及一点 3.2。
上面这几份参考资料的问题是程序实例阙如。对于我来说,更习惯跟着教程学习,要实际上手敲代码才学得进去。于是找到了一套很对口味的免费在线教程,learnopengl.com。它教的版本是 OpenGL 3.3,跟着学了前几课,才发现 OpenGL 3.3 与 ES 2.0 之间的差异还是很大的,每个示例程序要成功运行起来,需要在几份参考资料中前前后后地翻。但是随着对 OpenGL 的理解程度的提高,以及对参考资料的熟悉,好像慢慢开始有感觉了,跑通程序比刚开始快得多。
打算把学习笔记公开,除了如上述 OpenGL 3.3 与 ES 2.0 之间存在差异,有记录待查的价值,另外还有 2 个原因:(1)希望借助“官宣”给自己一点压力,认真学好、学完 OpenGL ES,别像恒大似的烂尾。(2)强迫自己进行知识点梳理。好像是柏拉图说过,一件事如果不能用语言向别人讲清楚,证明你还没真正理解/掌握它。吾深以为然。要耐烦,要勤快!
代码放在 gitlab.com/sihokk/lear…。