【CSDN 編者按】
本文的兩位作者皆是 AMD 的工程師,他們?cè)谌粘R矔?huì)像很多程序員一樣,被問(wèn)如何成為一名圖形工程師,或者有沒(méi)有一些資源推薦。基于此,他們寫下了這篇文章,并且匯集了一些適合圖形工程師入門的相關(guān)資料。
原文鏈接:https://gpuopen.com/learn/how_do_you_become_a_graphics_programmer/
作者 | Lou Kramer,Rys Sommefeldt
譯者 | ChatGP 責(zé)編 |夢(mèng)依丹
出品 | CSDN(ID:CSDNnews)
Graphics Programmer 一般指圖形工程師,從事圖形編程的專業(yè)人員,他們利用編程和圖形學(xué)知識(shí)來(lái)創(chuàng)建各種視覺(jué)效果和圖形應(yīng)用。本文的兩位作者皆是 AMD 的工程師,他們?cè)谌粘R矔?huì)像很多程序員一樣,被問(wèn)如何成為一名圖形工程師,或者有沒(méi)有一些資源推薦?;诖?,他們寫下了這篇文章,并且匯集了一些適合圖形工程師入門的相關(guān)資料。
選擇哪門編程語(yǔ)言?
當(dāng)他們與學(xué)生分享工作內(nèi)容時(shí),幾乎總會(huì)被問(wèn)到:你們使用哪種編程語(yǔ)言?簡(jiǎn)短地回答是 C 。
詳細(xì)的回答是這樣的,如果你從事圖形編程,你會(huì)使用 C 編寫主機(jī) CPU 的代碼,但你還需要編寫針對(duì) GPU 的代碼,通常被行業(yè)稱為著色器代碼,使用高級(jí)著色語(yǔ)言(如HLSL或GLSL)編寫。你還需要一種方法將它們聯(lián)系起來(lái),通過(guò) CPU 向 GPU 發(fā)送請(qǐng)求,使用著色器和其他必要的數(shù)據(jù)和元數(shù)據(jù)來(lái)實(shí)現(xiàn)有用的操作。這就是圖形應(yīng)用程序編程接口(API)的作用,通常使用 C 編寫主機(jī) CPU 代碼來(lái)驅(qū)動(dòng)它們。
所以更有爭(zhēng)議的問(wèn)題是:應(yīng)該從哪個(gè)圖形 API 入手?其實(shí)這個(gè)沒(méi)有確定的答案,只有一系列不同的觀點(diǎn)和考慮因素。
選擇哪個(gè)圖形 API ?
本文將重點(diǎn)介紹一些應(yīng)用在大多數(shù) PC 游戲或 3D 應(yīng)用程序員的常見(jiàn)圖形 API,暫時(shí)忽略像游戲主機(jī)那樣(主要)使用專有API的情況。
盡管有各種不同的圖形 API,但 2023 年主要用以下幾種:
-
OpenGL? / Microsoft? DirectX? 11 / WebGL?
Vulkan? / Microsoft? DirectX? 12 / Metal / WebGPU
OpenGL?、DirectX? 11 和WebGL? 是傳統(tǒng)的 API。它們基于 GPU 編程的歷史方法。盡管如此,它們?cè)趯W(xué)術(shù)界和工業(yè)界仍被廣泛使用,從程序員的角度來(lái)看它們更簡(jiǎn)單,因此更容易學(xué)習(xí)。然而,它們的簡(jiǎn)單性是有代價(jià)的,隨著時(shí)間的推移,這些 API 在驅(qū)動(dòng)程序和運(yùn)行時(shí)代碼中的底層實(shí)現(xiàn)會(huì)變得更加復(fù)雜,進(jìn)而帶來(lái)主機(jī)端瓶頸和給 GPU 供應(yīng)商編寫驅(qū)動(dòng)帶來(lái)了更大的挑戰(zhàn),因?yàn)樗麄円幚砀鼜?fù)雜的 API 實(shí)現(xiàn)。
(注:OpenGL?、DirectX?、WebGL?、Vulkan?和Metal是注冊(cè)商標(biāo),歸其各自所有者所有。)
在 2013 年至 2016 年期間,AMD 在 PC 上推出 Mantle 圖形 API,它為程序員提供了更底層的 GPU 訪問(wèn)方式,相較于傳統(tǒng) API 更加高效。這一改變帶來(lái)了更好的性能,為圖形編程帶來(lái)了新的可能性。
2014 年,蘋果推出了 Metal 圖形 API。2016年,Microsoft 的 DirectX? 12 和 Khronos Group 的 Vulkan? 也發(fā)布了類似的 API。這些 API 都采用了更低級(jí)別、更顯式的 GPU 編程方法,要求程序員更清晰地指定 GPU 操作,從而給予程序員更多的控制能力。
新一代的圖形 API 將更多的責(zé)任和控制權(quán)交給了應(yīng)用程序開發(fā)者,而不是由 GPU 驅(qū)動(dòng)程序來(lái)處理。這樣做的好處是程序員可以更加精確地控制 GPU 的操作,從而提高性能和效率。
在了解上述 GPU 編程范式的轉(zhuǎn)變之后,如何選擇 API 也會(huì)變得簡(jiǎn)單。如果你想在以 PC 游戲?yàn)橹髂繕?biāo)的 Windows? 上進(jìn)行圖形編程,那么直覺(jué)會(huì)告訴你選擇 Vulkan? 或 DirectX? 12 是明智的,因?yàn)樗鼈兪切录夹g(shù)。那么,真的是這樣嗎?
然而,傳統(tǒng)的圖形 API 仍然在被廣泛使用,而且它們更加簡(jiǎn)單和易于學(xué)習(xí)。因此,先學(xué)習(xí)傳統(tǒng) API,然后再逐漸過(guò)渡到現(xiàn)代圖形 API 可能是一個(gè)合理的選擇。就像在攀登珠穆朗瑪峰之前先在自家附近的小山上進(jìn)行訓(xùn)練一樣。
舉個(gè)簡(jiǎn)單的比較,繪制一個(gè)三角形在圖形編程中相當(dāng)于\”Hello, World!\”。使用OpenGL?或DirectX? 11 只需要大約 10 行代碼就可以實(shí)現(xiàn),而 Vulkan? 和 DirectX? 12 則需要至少一個(gè)數(shù)量級(jí)更多的代碼。
因此,你也可以說(shuō) Vulkan? 和 DirectX? 12 需要更多的代碼來(lái)手動(dòng)控制 GPU。盡管需要寫更多的代碼,但每一行代碼都更明確地描述了最終在 GPU 上發(fā)生的事情。而在 OpenGL? 和 DirectX? 11 中,很多細(xì)節(jié)都被 API 隱藏和自動(dòng)處理,這使得 GPU 看起來(lái)像是一個(gè)神奇的盒子,而你需要做的一些事情可能難以理解其背后的 GPU 工作原理。
因此,選擇學(xué)習(xí)哪種 API 取決于個(gè)人的需求和目標(biāo)。如果你想快速入門并學(xué)習(xí)基本的圖形編程概念,傳統(tǒng) API 可能更適合你。如果你有更高的要求,希望獲得更多的控制權(quán)和性能優(yōu)化,那么學(xué)習(xí)現(xiàn)代圖形 API 如 Vulkan? 或 DirectX? 12 將是一個(gè)不錯(cuò)的選擇。
Vulkan? and DirectX? 12 確實(shí)要求你在早期就處理和獲得更低級(jí)別的知識(shí)和理解,而 OpenGL? 和 DirectX? 11 則在更高級(jí)別上操作,讓你專注于圖形編程更高效的一面。
看完上面的分析之后,如果你還存在顧慮,不妨看看 AMD 游戲工程團(tuán)隊(duì)對(duì)于選擇傳統(tǒng) API 還是現(xiàn)代 API 的真實(shí)看法:
\”作為一個(gè)十幾歲的孩子從學(xué)習(xí) DX12? 或 Vulkan? 開始進(jìn)行圖形編程可能會(huì)很困難。\”
\”我們離那個(gè)古老的 glVertex hello triangle 還有很長(zhǎng)的路要走。\”
\”遺憾的是 OpenGL? 不再那么重要了。\”
\”我認(rèn)為(OpenGL?)仍然足夠好,可以用來(lái)學(xué)習(xí)基礎(chǔ)知識(shí),我個(gè)人觀點(diǎn)。\”
\”我最開始使用的是 DX10?,我覺(jué)得還不錯(cuò),但如果不精通 C 的話,很多孩子會(huì)遇到困難。\” – DX10? 是 DX11? 的前身,已經(jīng)過(guò)時(shí)了,不要學(xué)習(xí) DX10?!
\”但有很多因素需要考慮。學(xué)習(xí)光柵化和光線追蹤的理論。學(xué)習(xí)傳統(tǒng)渲染管線。學(xué)習(xí)如何向 GPU 分配工作等等……我不知道應(yīng)該按什么順序?qū)W習(xí)它們,但我通常完全使用 C (沒(méi)有必要從其他語(yǔ)言開始),所以我可能應(yīng)該建議直接從Vulkan? 開始……但老實(shí)說(shuō),我不太確定。\”
當(dāng)然,還有一種可能性,就是學(xué)習(xí)圖形編程而不使用 OpenGL? 和 DirectX? 11,或者 Vulkan? 和 DirectX? 12。文中提到的 WebGL? 和 WebGPU,它們是在 Web 瀏覽器領(lǐng)域中可用的廣泛類別的圖形 API,這兩種 API 都在自己獨(dú)立的軟件生態(tài)系統(tǒng)(可以說(shuō)是一個(gè)完整的操作系統(tǒng))中運(yùn)行。
在 Web 瀏覽器中,你也可以通過(guò) WebGL? 或 WebGPU 實(shí)現(xiàn)實(shí)時(shí)圖形!其中一個(gè)優(yōu)勢(shì)是你不需要使用 C 來(lái)進(jìn)行 Web 開發(fā),盡管你仍然可以通過(guò)諸如 WebAssembly 之類的技術(shù)在瀏覽器中使用 C 來(lái)驅(qū)動(dòng)圖形。在 Web 瀏覽器中,JavaScript 是主流的編程語(yǔ)言,非常適合進(jìn)行圖形開發(fā)。
另外,如果你想先專注于更高級(jí)別的內(nèi)容,不想過(guò)多涉及圖形 API 的低級(jí)細(xì)節(jié)和手動(dòng)編寫著色器,那么使用游戲引擎可能是一個(gè)合適的選擇。Unreal Engine 是最大的 PC 游戲引擎,Unity? 是最常見(jiàn)的替代選擇,還有許多更小、更簡(jiǎn)單的開源引擎,如 Godot,供你嘗試和玩耍。
以下是來(lái)自 AMD 游戲工程團(tuán)隊(duì)的一些觀點(diǎn):
\”我認(rèn)為讓新手從 DX12? 或 Vulkan? 開始可能有些困難,但也許是可行的。我會(huì)建議從 WebGL? 開始,只是為了理解圖形渲染管線,可能是最簡(jiǎn)單的方式(你可以專注于正確的內(nèi)容)。\”
\”WebGPU 可能會(huì)讓你更接近現(xiàn)代圖形 API 的概念,而不需要過(guò)多關(guān)注低級(jí)細(xì)節(jié)。\”
\”WebGPU 可能會(huì)變得更好,但目前我認(rèn)為一旦你開始編寫復(fù)雜代碼,可能會(huì)遇到許多問(wèn)題。盡管如此,它非???,并且意外工作得很好。我真誠(chéng)希望它能變得更好,但現(xiàn)在已經(jīng)非常有前景。對(duì)于原型開發(fā)來(lái)說(shuō),它非常出色。而且,它可能也是學(xué)習(xí)/教學(xué)的良好 API。\”
\”我知道一些學(xué)校在他們的首個(gè)渲染課程中使用 Unity?,這可能還不錯(cuò),但存在這樣的風(fēng)險(xiǎn),學(xué)生們可能永遠(yuǎn)不會(huì)理解為什么需要學(xué)習(xí)底層內(nèi)容……\”
\”如果你對(duì)現(xiàn)代圖形渲染管線以及 GPU 硬件的高級(jí)實(shí)現(xiàn)方式有很好的掌握,或者你想在學(xué)習(xí)過(guò)程中逐步了解 GPU 硬件,那么從一個(gè)顯式的 API 開始是可以的。否則,先從一些更簡(jiǎn)單的內(nèi)容開始,然后在需要或者有興趣時(shí)再轉(zhuǎn)向顯式的API。\”
\”就個(gè)人而言,我認(rèn)為在開始編寫自定義主機(jī)代碼之前,通過(guò)流行的游戲引擎熟悉著色器可能是入門的好方式。如果你對(duì)在圖形 API 中想要實(shí)現(xiàn)什么有清晰的思路,學(xué)習(xí)會(huì)更加困難,否則當(dāng)你開始處理三角形時(shí)可能會(huì)放棄學(xué)習(xí)。\”
一些實(shí)用性的資源
以下是 AMD 游戲工程團(tuán)隊(duì)推薦的一些學(xué)習(xí)資源:
-
https://learnopengl.com – “LearnOpenGL 是最適合初學(xué)者的學(xué)習(xí)網(wǎng)站,它向你展示了如何使用實(shí)際的 API 在 C 中完成這些工作。”
https://www.scratchapixel.com – “Scratchapixel 之所以好,是因?yàn)槟悴粫?huì)得到一堆代碼,而是專注于學(xué)習(xí)光線追蹤等內(nèi)容。”
https://www.udemy.com/ – “Udemy 是一個(gè)幫助人們?nèi)腴T的好地方。”
https://rastertek.com/tutindex.html – OpenGL?/DirectX?11 教程
https://github.com/RayTracing/raytracing.github.io : 《Ray Tracing in one weekend》 – “我喜歡實(shí)踐式的學(xué)習(xí)方法,所以如果你有一點(diǎn)編碼能力,周末學(xué)會(huì)光線追蹤是不錯(cuò)的選擇?!?/p>
https://fgiesen.wordpress.com/2011/07/09/a-trip-through-the-graphics-pipeline-2011-index/ – “從 GPU 的角度了解圖形渲染管線。這是 2011 年的內(nèi)容,所以它是在顯式 API 出現(xiàn)之前的,但很多硬件和軟件概念仍然適用?!?/p>
https://sotrh.github.io/learn-wgpu/ – “有一個(gè)與 learnopengl 類似風(fēng)格的“學(xué)習(xí) WebGPU”網(wǎng)站,但還處于進(jìn)行中。”
https://codelabs.developers.google.com/your-first-webgpu-app – “我還沒(méi)有完全閱讀它,但它還不錯(cuò)。”
https://www.shadertoy.com/ – “Shadertoy 允許你編寫著色器,無(wú)需處理任何圖形 API。如果我當(dāng)初沒(méi)有從更簡(jiǎn)單的東西開始(對(duì)我來(lái)說(shuō)只是在 Java 畫布上直接繪制),我可能永遠(yuǎn)對(duì)圖形不感興趣,也不會(huì)想要學(xué)習(xí) OpenGL?。”
https://vulkan-tutorial.com/ – “我還覺(jué)得讓人們不要害怕復(fù)制粘貼,特別是在使用 Vulkan? 和 DirectX? 時(shí)?!?/p>
總結(jié)
如果你到現(xiàn)在還沒(méi)有決定要從哪種編程語(yǔ)言和圖形 API 生態(tài)系統(tǒng)開始,請(qǐng)不要擔(dān)心。你可以嘗試不同的方法,然后選擇最適合你的那個(gè)。
當(dāng)然,你也可以在本文留言,分享你學(xué)習(xí)圖形編程的經(jīng)驗(yàn)和想法,也可以分享相關(guān)資源。
版權(quán)聲明:本文內(nèi)容由互聯(lián)網(wǎng)用戶自發(fā)貢獻(xiàn),該文觀點(diǎn)僅代表作者本人。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如發(fā)現(xiàn)本站有涉嫌抄襲侵權(quán)/違法違規(guī)的內(nèi)容, 請(qǐng)發(fā)送郵件至 舉報(bào),一經(jīng)查實(shí),本站將立刻刪除。