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