首页 » 软件开发 » AMD工程师倾囊相授:教你如何成为一名图形程序员?(微软图形学习程序员编程)

AMD工程师倾囊相授:教你如何成为一名图形程序员?(微软图形学习程序员编程)

萌界大人物 2024-07-23 20:30:14 0

扫一扫用手机浏览

文章目录 [+]

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

作者 | Lou Kramer,Rys Sommefeldt
译者 | ChatGP 责编 |梦依丹
出品 | CSDN(ID:CSDNnews)

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

选择哪门编程语言?

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 生态系统开始,请不要担心。
你可以尝试不同的方法,然后选择最适合你的那个。
当然,你也可以在本文留言,分享你学习图形编程的经验和想法,也可以分享相关资源。

标签:

相关文章

C语言表白代码,编程之美,爱意绵绵

在这个科技飞速发展的时代,编程已经成为了我们生活中不可或缺的一部分。而C语言作为一门经典的编程语言,更是备受青睐。今天,就让我们用...

软件开发 2024-12-04 阅读8 评论0

16倍速生活方式,高效工作与生活的完美融合

随着科技的飞速发展,我们的生活节奏也在不断加快。在这个快节奏的时代,如何高效地平衡工作与生活,成为了许多人关注的焦点。本文将探讨1...

软件开发 2024-12-04 阅读7 评论0

C语言编程猜数游戏,编程与娱乐的完美融合

在科技日新月异的今天,编程已经成为一项重要的技能。作为计算机科学的基础,编程不仅可以锻炼我们的逻辑思维,还能提高我们的动手能力。而...

软件开发 2024-12-04 阅读7 评论0

C语言病毒代码介绍,技术与道德的双重挑战

随着信息技术的飞速发展,网络安全问题日益凸显。病毒作为一种恶意软件,严重威胁着计算机系统的稳定运行。C语言作为一种功能强大的编程语...

软件开发 2024-12-04 阅读6 评论0