OpenGL ES 2.0 笔记 #0

287 阅读3分钟

计算机图形学差不多忘光了。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…