AMD工程师倾囊相授:教你如何成为一名图形程序员?(amd的cpu做图形处理怎么样)
【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 生态系统开始,请不要担心。你可以尝试不同的方法,然后选择最适合你的那个。
当然,你也可以在本文留言,分享你学习图形编程的经验和想法,也可以分享相关资源。