我为什么到 2026 年还在教 OpenGL ES 3.0

编者按:下文编译自 Elias Farhan 2026 年 1 月 27 日的博文 Why I still teach OpenGL ES 3.0。作者在瑞士日内瓦 SAE Institute 讲授计算机图形学入门课。正文保留第一人称,仅做翻译润色与结构整理。

过去几年,我一直在 SAE Institute Geneva 教这门为期一个学期的计算机图形学入门课,也一直在想:什么时候该从 OpenGL ES 3.0 迁到更「现代」的 API。

去年 11 月我去了 Graphics Programming Conference。业界谈话和演讲里,这个话题又冒了出来。Teardown 那一场提到原作跑在 OpenGL 3.3,X-Plane 那一场提到渲染引擎曾用 OpenGL 2.1——两边讲的都是怎样迁到更新的 API 才能做出更好的画面。听起来像 OpenGL 的黄昏。

真正让我重新掂量「要不要立刻换课」的,是两场和教育相关的演讲:Matthieu Delaure 讲技术美术如何从零写光栅器;Mike Shah 讲教程之后的下一步。后者让我怀疑:为了这门入门课去整体迁移,是否还划算。迁移意味着几乎所有课件都要重写,还必须证明新 API 比 OpenGL ES 3.0 值得付出这笔成本。

课到底教什么

入门模块的目标,是让学生用图形 API 实现一个 3D 场景,而不是做一个通用、数据驱动的 3D 渲染器。最终可执行文件可以很「手写」:从相机视角裁剪场景,再一件件画物体。

开课以来,我基本跟着 learnopengl.com 的章节结构走,只是换成 OpenGL ES 3.0:Hello Triangle、Hello Texture……一章章实现、测试。

为什么偏偏是 ES 3.0?它 2012 年 8 月发布,到现在大约 14 年——在图形圈算很长了。我选它,是因为在我看来它是跨平台最整齐的一版 OpenGL:同一套 C++(加点 #ifdef)和同一套着色器,可以覆盖:

  • Windows:驱动偶有问题,但 ES 3.0 与 OpenGL 4.3 兼容,我按 4.3 来假设;

  • Linux:机房有默认进 Linux 的机器,换编译器练同一份代码很有用;

  • Android:应用从 Java 启动,再调本地库,稍微麻烦;

  • Nintendo Switch:学校有两台开发机,去掉 glew/glad、换机内嵌的 OpenGL 封装后能跑;

  • WebGL2:这是我最喜欢的理由——配合 emscripten,学生可以把作业挂到自己的网站/博客(这篇博文里的 demo 就是这么来的);

  • iOS / macOS:已经不再支持,但我们游戏编程本科的学生基本不用 Mac。

和更新的 API 比,OpenGL 把同步大多甩给驱动,初始化样板代码少很多,代价是驱动开销。笔记本选错 GPU(集显而不是独显)仍是每年的麻烦;现在还得在 Windows 设置里给单个应用开「高性能」。Vulkan 一类新 API 把这类问题处理得更干净,这点我承认。

课上我们抽象了什么

每周学生大约要完成 2–3 个围绕某一特性的 sample(例如在延迟渲染作业之上做 SSAO)。他们通常会自己长出一层抽象;今年我们干脆一起维护公共 git 仓库,抽象一写完全班就能用。这件事我还想继续做下去。

我们做了 Pipeline(我其实很不喜欢 OpenGL 把 pipeline 叫 program)、Shader、Buffer / VertexInput、Texture、Framebuffer 等封装;着色器侧用 glslangValidator 在编译期查语法。模型加载用 Assimp,路线和 learnopengl.com 接近,方便学生对着参考实现查错。多 pass、后处理、HDR、G-Buffer / deferred 也都会碰。

ES 3.0 缺什么,现代 API 又多什么

为了保住 WebGL2,我们拿不到(或不能默认布置)不少东西:SSBO、compute shader、SPIR-V、bindless、indirect / multi-draw indirect 等——课上会讲概念,实现通常留给愿意放弃 WebGL2 兼容的学生。

贴着 OpenGL 教,也意味着碰不到 Vulkan / DX12 那套心智模型和很多能力。硬件光追我会展示利弊和未来方向,但入门课不能要求人人交一份硬件光追管线。多线程生成 GPU 命令在 DX12/Vulkan 里可行,在 OpenGL 里驱动状态基本绑在单线程上——像 Halo Infinite 那种吃多线程提交的游戏,不是这门课的作业形态。

框架呢?

我喜欢 SDL GPU,自己的图形编辑器也在往上迁,能同时打 Vulkan、DirectX、Metal。但对入门课来说,它仍有点「臃肿」。bgfx、raylib 也有人说好;WebGPU 还多一门着色语言,体感又太像 Vulkan 1.0,我以前被折磨过。学生在裸 OpenGL 里犯错,原因往往比较好定位;套框架后还得连库代码一起看。我的目标是教图形 API,并让他们在上面自己长抽象。

结论

即便到 2026 年,OpenGL ES 3.0 对教学仍有不少好处(尤其是 WebGL2),代价是要扛住这套 API 的历史包袱。14 年在计算机图形学里很长;Adam Sawicki 在自己的图形 API 博文末尾也不再推荐把 OpenGL 当首选。但这门课这些年确实让学生摸到图形编程是怎么回事,对一些人来说是职业的第一步。我还想另写一篇:为什么我们还没切到 Vulkan(同步、PSO、驱动开销)。欢迎同行教师和业界朋友来聊——你们希望图形课的学生出门时会什么。

说明:文中课程安排、平台兼容与教学选择均为作者 Elias Farhan 自述;学生作品名单见原文链接。HN 讨论里也有人强调:若目标是图形概念本身,软件光栅器/光线追踪往往比死磕 API 更有效;若目标就是教 GPU 渲染,OpenGL 仍相对好上手。

来源

原作者:Elias Farhan
原文:Why I still teach OpenGL ES 3.0,eliasfarhan.ch,2026年1月27日。
HN 讨论:I still teach OpenGL ES 3.0,2026-10-27。
查询日:2026-10-27。

#OpenGLES #计算机图形学 #教学 #WebGL2 #经验分享

排序方式 :

成为第一条评论!

Nobody's responded to this post yet. Add your thoughts and get the conversation going.