新浪新闻客户端

AMD工程师倾囊相授:教你如何成为一名图形程序员?

AMD工程师倾囊相授:教你如何成为一名图形程序员?
2023年11月29日 16:15 新浪网 作者
avatar
CSDN 优质科技领域创作者

  【CSDN 编者按】本文的两位作者皆是 AMD 的工程师,他们在日常也会像很多程序员一样,被问如何成为一名图形工程师,或者有没有一些资源推荐。基于此,他们写下了这篇文章,并且汇集了一些适合图形工程师入门的相关资料。

  原文链接:https://gpuopen.com/learn/how_do_you_become_a_graphics_programmer/

  作者 | Lou Kramer,Rys Sommefeldt       

  译者 | ChatGP    责编 |梦依丹

  出品 | CSDN(ID:CSDNnews)

  Graphics Programmer 一般指图形工程师,从事图形编程的专业人员,他们利用编程和图形学知识来创建各种视觉效果和图形应用。本文的两位作者皆是 AMD 的工程师,他们在日常也会像很多程序员一样,被问如何成为一名图形工程师,或者有没有一些资源推荐。基于此,他们写下了这篇文章,并且汇集了一些适合图形工程师入门的相关资料。

  选择哪门编程语言?

  当他们与学生分享工作内容时,几乎总会被问到:你们使用哪种编程语言?简短地回答是 C++。

  详细的回答是这样的,如果你从事图形编程,你会使用 C++ 编写主机 CPU 的代码,但你还需要编写针对 GPU 的代码,通常被行业称为着色器代码,使用高级着色语言(如HLSL或GLSL)编写。你还需要一种方法将它们联系起来,通过 CPU 向 GPU 发送请求,使用着色器和其他必要的数据和元数据来实现有用的操作。这就是图形应用程序编程接口(API)的作用,通常使用 C++ 编写主机 CPU 代码来驱动它们。

  所以更有争议的问题是:应该从哪个图形 API 入手?其实这个没有确定的答案,只有一系列不同的观点和考虑因素。

  选择哪个图形 API ?

  本文将重点介绍一些应用在大多数 PC 游戏或 3D 应用程序员的常见图形 API,暂时忽略像游戏主机那样(主要)使用专有API的情况。

  尽管有各种不同的图形 API,但 2023 年主要用以下几种:

  •   OpenGL® / Microsoft® DirectX® 11 / WebGL™

  •   Vulkan® / Microsoft® DirectX® 12 / Metal / WebGPU

  OpenGL®、DirectX® 11 和WebGL™ 是传统的 API。它们基于 GPU 编程的历史方法。尽管如此,它们在学术界和工业界仍被广泛使用,从程序员的角度来看它们更简单,因此更容易学习。然而,它们的简单性是有代价的,随着时间的推移,这些 API 在驱动程序和运行时代码中的底层实现会变得更加复杂,进而带来主机端瓶颈和给 GPU 供应商编写驱动带来了更大的挑战,因为他们要处理更复杂的 API 实现。

  (注:OpenGL®、DirectX®、WebGL™、Vulkan®和Metal是注册商标,归其各自所有者所有。)

  在 2013 年至 2016 年期间,AMD 在 PC 上推出 Mantle 图形 API,它为程序员提供了更底层的 GPU 访问方式,相较于传统 API 更加高效。这一改变带来了更好的性能,为图形编程带来了新的可能性。

  2014 年,苹果推出了 Metal 图形 API。2016年,Microsoft 的 DirectX® 12 和 Khronos Group 的 Vulkan® 也发布了类似的 API。这些 API 都采用了更低级别、更显式的 GPU 编程方法,要求程序员更清晰地指定 GPU 操作,从而给予程序员更多的控制能力。

  新一代的图形 API 将更多的责任和控制权交给了应用程序开发者,而不是由 GPU 驱动程序来处理。这样做的好处是程序员可以更加精确地控制 GPU 的操作,从而提高性能和效率。

  在了解上述 GPU 编程范式的转变之后,如何选择 API 也会变得简单。如果你想在以 PC 游戏为主目标的 Windows® 上进行图形编程,那么直觉会告诉你选择 Vulkan® 或 DirectX® 12 是明智的,因为它们是新技术。那么,真的是这样吗?

  然而,传统的图形 API 仍然在被广泛使用,而且它们更加简单和易于学习。因此,先学习传统 API,然后再逐渐过渡到现代图形 API 可能是一个合理的选择。就像在攀登珠穆朗玛峰之前先在自家附近的小山上进行训练一样。

  举个简单的比较,绘制一个三角形在图形编程中相当于"Hello, World!"。使用OpenGL®或DirectX® 11 只需要大约 10 行代码就可以实现,而 Vulkan® 和 DirectX® 12 则需要至少一个数量级更多的代码。

  因此,你也可以说 Vulkan® 和 DirectX® 12 需要更多的代码来手动控制 GPU。尽管需要写更多的代码,但每一行代码都更明确地描述了最终在 GPU 上发生的事情。而在 OpenGL® 和 DirectX® 11 中,很多细节都被 API 隐藏和自动处理,这使得 GPU 看起来像是一个神奇的盒子,而你需要做的一些事情可能难以理解其背后的 GPU 工作原理。

  因此,选择学习哪种 API 取决于个人的需求和目标。如果你想快速入门并学习基本的图形编程概念,传统 API 可能更适合你。如果你有更高的要求,希望获得更多的控制权和性能优化,那么学习现代图形 API 如 Vulkan® 或 DirectX® 12 将是一个不错的选择。

  Vulkan® and DirectX® 12 确实要求你在早期就处理和获得更低级别的知识和理解,而 OpenGL® 和 DirectX® 11 则在更高级别上操作,让你专注于图形编程更高效的一面。

  看完上面的分析之后,如果你还存在顾虑,不妨看看 AMD 游戏工程团队对于选择传统 API 还是现代 API 的真实看法:

  "作为一个十几岁的孩子从学习 DX12® 或 Vulkan® 开始进行图形编程可能会很困难。"

  "我们离那个古老的 glVertex hello triangle 还有很长的路要走。"

  "遗憾的是 OpenGL® 不再那么重要了。"

  "我认为(OpenGL®)仍然足够好,可以用来学习基础知识,我个人观点。"

  "我最开始使用的是 DX10®,我觉得还不错,但如果不精通 C++ 的话,很多孩子会遇到困难。" - DX10® 是 DX11® 的前身,已经过时了,不要学习 DX10®!

  "但有很多因素需要考虑。学习光栅化和光线追踪的理论。学习传统渲染管线。学习如何向 GPU 分配工作等等......我不知道应该按什么顺序学习它们,但我通常完全使用 C++(没有必要从其他语言开始),所以我可能应该建议直接从Vulkan® 开始......但老实说,我不太确定。"

  当然,还有一种可能性,就是学习图形编程而不使用 OpenGL® 和 DirectX® 11,或者 Vulkan® 和 DirectX® 12。文中提到的 WebGL™ 和 WebGPU,它们是在 Web 浏览器领域中可用的广泛类别的图形 API,这两种 API 都在自己独立的软件生态系统(可以说是一个完整的操作系统)中运行。

  在 Web 浏览器中,你也可以通过 WebGL™ 或 WebGPU 实现实时图形!其中一个优势是你不需要使用 C++ 来进行 Web 开发,尽管你仍然可以通过诸如 WebAssembly 之类的技术在浏览器中使用 C++ 来驱动图形。在 Web 浏览器中,JavaScript 是主流的编程语言,非常适合进行图形开发。

  另外,如果你想先专注于更高级别的内容,不想过多涉及图形 API 的低级细节和手动编写着色器,那么使用游戏引擎可能是一个合适的选择。Unreal Engine 是最大的 PC 游戏引擎,Unity® 是最常见的替代选择,还有许多更小、更简单的开源引擎,如 Godot,供你尝试和玩耍。

  以下是来自 AMD 游戏工程团队的一些观点:

  "我认为让新手从 DX12® 或 Vulkan® 开始可能有些困难,但也许是可行的。我会建议从 WebGL™ 开始,只是为了理解图形渲染管线,可能是最简单的方式(你可以专注于正确的内容)。"

  "WebGPU 可能会让你更接近现代图形 API 的概念,而不需要过多关注低级细节。"

  "WebGPU 可能会变得更好,但目前我认为一旦你开始编写复杂代码,可能会遇到许多问题。尽管如此,它非常酷,并且意外工作得很好。我真诚希望它能变得更好,但现在已经非常有前景。对于原型开发来说,它非常出色。而且,它可能也是学习/教学的良好 API。"

  "我知道一些学校在他们的首个渲染课程中使用 Unity®,这可能还不错,但存在这样的风险,学生们可能永远不会理解为什么需要学习底层内容......"

  "如果你对现代图形渲染管线以及 GPU 硬件的高级实现方式有很好的掌握,或者你想在学习过程中逐步了解 GPU 硬件,那么从一个显式的 API 开始是可以的。否则,先从一些更简单的内容开始,然后在需要或者有兴趣时再转向显式的API。"

  "就个人而言,我认为在开始编写自定义主机代码之前,通过流行的游戏引擎熟悉着色器可能是入门的好方式。如果你对在图形 API 中想要实现什么有清晰的思路,学习会更加困难,否则当你开始处理三角形时可能会放弃学习。"

  一些实用性的资源

  以下是 AMD 游戏工程团队推荐的一些学习资源:

  •   https://learnopengl.com - “LearnOpenGL 是最适合初学者的学习网站,它向你展示了如何使用实际的 API 在 C++ 中完成这些工作。”

  •   https://www.scratchapixel.com - “Scratchapixel 之所以好,是因为你不会得到一堆代码,而是专注于学习光线追踪等内容。”

  •   https://www.udemy.com/ - “Udemy 是一个帮助人们入门的好地方。”

  •   https://rastertek.com/tutindex.html - OpenGL®/DirectX®11 教程

  •   https://github.com/RayTracing/raytracing.github.io : 《Ray Tracing in one weekend》 - “我喜欢实践式的学习方法,所以如果你有一点编码能力,周末学会光线追踪是不错的选择。”

  •   https://fgiesen.wordpress.com/2011/07/09/a-trip-through-the-graphics-pipeline-2011-index/ - “从 GPU 的角度了解图形渲染管线。这是 2011 年的内容,所以它是在显式 API 出现之前的,但很多硬件和软件概念仍然适用。”

  •   https://sotrh.github.io/learn-wgpu/ - “有一个与 learnopengl 类似风格的“学习 WebGPU”网站,但还处于进行中。”

  •   https://codelabs.developers.google.com/your-first-webgpu-app - “我还没有完全阅读它,但它还不错。”

  •   https://www.shadertoy.com/ - “Shadertoy 允许你编写着色器,无需处理任何图形 API。如果我当初没有从更简单的东西开始(对我来说只是在 Java 画布上直接绘制),我可能永远对图形不感兴趣,也不会想要学习 OpenGL®。”

  •   https://vulkan-tutorial.com/ - “我还觉得让人们不要害怕复制粘贴,特别是在使用 Vulkan® 和 DirectX® 时。”

  总结

  如果你到现在还没有决定要从哪种编程语言和图形 API 生态系统开始,请不要担心。你可以尝试不同的方法,然后选择最适合你的那个。

  当然,你也可以在本文留言,分享你学习图形编程的经验和想法,也可以分享相关资源。

特别声明:以上文章内容仅代表作者本人观点,不代表新浪网观点或立场。如有关于作品内容、版权或其它问题请于作品发表后的30日内与新浪网联系。
来自于:江苏
权利保护声明页/Notice to Right Holders

举报邮箱:jubao@vip.sina.com

Copyright © 1996-2026 SINA Corporation

All Rights Reserved 新浪公司 版权所有