首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

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

作者 | 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/DirectX11 教程

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 生态系统开始,请不要担心。你可以尝试不同的方法,然后选择最适合你的那个。

  • 发表于:
  • 原文链接https://page.om.qq.com/page/OmxGwe7tVs08Efc5-mLitkLA0
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券