[译]成为实时图形程序员需要学习什么
本文译自 Alan Wolfe 的博客文章:What To Learn To Be A Real Time Graphics Programmer(2026-07-01)。原站 License 声明:除非另有说明,网站内容采用 MIT License。
我经常被问到:为了成为一个具备就业竞争力的图形程序员,人们究竟需要掌握哪些知识。因此,我觉得是时候写一个页面,以后可以直接引用,而不是每次都重新解释一遍。
我们正处在一个围绕 LLM 的特殊时期。我认为,以当前形态存在的机器学习不会完全兑现它所承载的炒作预期;在未来几年里,技术摆钟会在某种程度上从机器学习方向摆回去。我也认为,投机者接下来可能会转向量子计算,或者寻找其他可被包装和炒作的主题。不过,机器学习本身确实是计算机科学工具箱的一部分。因此,在我看来,学习它所提供的拟合与优化技术仍然是有价值的。
我做过一个视频,可以用来了解更接近底层硬件的相关内容;至于是否值得学习,则取决于你自己的判断。
Machine Learning For Game Developers
除此之外:
现代渲染在某种意义上相当于两份工作合在一起。
- 学习 CPU 侧:掌握 DirectX 12、Vulkan、Metal 或类似的现代”显式”图形 API,并学习支撑资源加载及其他辅助任务的引擎编程。
- 学习 GPU 侧:掌握现代光照与着色所需的数学,理解阴影、环境光遮蔽、后处理等渲染技术;同时理解 GPU 上什么操作快、什么操作慢,从而能够构造在实时场景中运行得更好的方法。
同时学习这两部分非常困难。如果你希望重点关注第二部分,那么第一部分可以使用相对简单的技术,例如 OpenGL、WebGL、DirectX 11、某个现成引擎,或类似工具。如果你希望重点关注第一部分,则应先做到在屏幕上显示第一个三角形,再进一步显示网格模型,依此推进;此时不必过分关心画面是否足够美观。
第二部分的一项内容是编写路径追踪器。路径追踪是电影工业中进行渲染的方式,也是现代实时渲染技术试图近似的目标。学习路径追踪的一个很好的起点是在线免费书籍 Ray Tracing in One Weekend。很多人都使用过这本书。它非常易于上手,并展示了如何生成照片级真实感图像。
第二部分的另一项内容是学习”基于物理的渲染”(Physically Based Rendering, PBR)。PBR 是一种应用光照的方法;归根结底,它主要处理镜面反射。PBR 是”有原则的”:也就是说,只要遵守规则,通常就能得到良好的结果。在 PBR 出现之前,人们会为光照编写各种随意的方程,并叠加许多临时调整和技巧。
这导致一个资源可能在某种场景中看起来很好,但一旦光照改变,就可能显得过暗,或者看起来像在发光。人们不得不为不同光照条件制作资源的不同版本,这会消耗大量时间和精力。
PBR 使资源在默认情况下能够在各种光照条件下呈现得更好,并节省制作多个版本所需的时间与工作量。对于游戏行业而言,这是一次重要进步。即便如此,资源创作在时间、资金和工作量上的成本,仍然是游戏开发中的主要瓶颈。
下面这个页面中的 PBR 章节及其子章节,是学习 PBR 的优秀导论:
如果在某个阶段你已经超出了这些入门材料的范围,并希望继续深入,那么阅读 Filament 文档 是一个很好的下一步。随着对 PBR 的进一步深入,会涉及大量微积分与统计学内容。
再往后,就是著名的 PBRT 书籍 Physically Based Rendering: From Theory To Implementation,它同样可以在线免费阅读。
理想情况下,你最终应该拥有一些可以向潜在雇主展示的源代码,例如放在 GitHub 上,并在简历中链接出来,以证明你确实理解这些内容。可以考虑如下形式:
- 一个大致类似引擎的程序:能够加载资源(模型、纹理),并以实时方式将其渲染到屏幕上;支持光照以及若干效果,例如阴影、景深、面积光、色调映射、光线追踪阴影等。最好使用 PBR 进行光照计算,具备用户可控制的相机,并使用 DX12、Vulkan 或类似 API,以 C++ 编写。
- 一个能够生成照片级真实感图像的路径追踪器。最好使用 C++ 编写;它也可以是一个没有窗口的程序,只需输出 PNG 图像即可,并不要求实时运行。
- 如果路径追踪器只是你的”类引擎渲染器”中的一个独立模式,并且你用它来辅助验证实时 PBR 渲染是否正确,例如展示实时结果与路径追踪结果之间的匹配关系,则可以加分。更进一步,如果你能够指出两种渲染结果在哪些地方不一致,解释为什么不一致,并提出在保持实时性的同时如何改进实时渲染器以缩小差异,那么会有额外加分。
你可能会问:需要掌握哪些数学?如果完成上述项目,你自然会遇到所需的数学。基本而言,真正必要的是线性代数(矩阵乘法、叉积、点积)、基础三角函数,以及少量微积分。图形学以及游戏开发的有趣之处在于:你必须掌握的数学其实相当有限,但你可以使用的数学几乎没有上限。
算法方面同样如此。你应该了解基本抽象数据类型和算法,例如链表、哈希表、排序与搜索。很多时候,最快的算法反而是最简单的算法。数组远快于链表。不过,当你确实需要某种新颖且定制化的方案时,更高级的算法概念会有所帮助。
在游戏开发中,C++ 是应当学习的语言。有些人使用 Rust;目前很难判断 Rust 的使用是否正在增长,但它确实占有一部分份额,只是还不是人们默认期待你掌握的标准语言。WebGPU 具备许多 WebGL 所没有的能力,并且正在成为一个更严肃的平台;它允许你使用 JavaScript 完成 CPU 侧工作。不过,我还没有看到很多 WebGPU 相关岗位发布,也没有看到网络上有大量 WebGPU 内容。
对于 CPU 侧编程而言,了解 C++ 似乎仍然是最重要的学习方向,而且优势非常明显。
至于着色器语言,HLSL 似乎最常见,但也有人使用 GLSL。在多平台游戏中,着色器经常会被转译为其他着色器语言。
随着情况变化,或者有人提出本文尚未覆盖的问题,我会持续更新这个页面。
关于智能体的扩展机器学习评论
我不认为当前机器学习技术对于它们正在被销售和宣传的大多数用途而言已经”胜任任务”。不过,我确实会通过与 Claude 讨论数学、论文或不熟悉的算法来获得帮助。在这些场景中,很容易判断它是否在编造内容,也很容易查阅其他来源进行合理性校验。然而,我并不认为它在编程方面特别有用,因为即使它完成了本该完成的事情,如果我没有花时间理解生成的代码,我依然不理解那段代码。
到了那个阶段,我还不如一开始就自己写。有些较小的任务我认为是有用的,例如询问”你是否在这个文件中看到了任何 bug?”如果它回答有,我可以进一步调查;如果回答没有,那么提出这个问题也没有成本。撇开这些技术问题不谈,我确实相信,人类终有一天会弄清楚如何构造真正达到人类水平的人工智能,并进一步超越它。
我不知道这是否会在我的有生之年发生,但我相信总有一天会发生,除非人类在那之前先毁掉自己。从这个意义上说,当前的 LLM 时代有点像是未来”真正的东西”到来之前的一次彩排。我希望我们能学到正确的经验,并在那一天到来时准备得更充分。