手把手教你成為Shader程式設計實戰達人—GPU
GPU程式設計市場應用
GPU全稱是Graphics Processing Unit,中文成為圖形處理器,所以GPU程式設計也叫圖形學程式設計,它是針對的顯示卡中的晶片程式設計,遊戲引擎的更新換代發展的一個重要階段是顯示卡晶片的出現,引擎的渲染能力得到極大提升。GPU 加速器於 2007 年由 NVIDIA® 率先推出,引擎的更新換代也是跟GPU硬體息息相關的,從固定流水線變成了可程式設計流水線,畫面品質得到了質的飛躍。總的來說,GPU程式設計主要分為兩大分支:
現在流行的大資料計算,採用的就是GPU叢集程式設計,從事GPU叢集程式設計可以從事一些高階的行業,比如大資料分析計算等等。另外,作為高效能運算新的應用領域,深度學習(Deep Learning)是近年來機器學習的熱點,以GPU叢集方式對資料或深度網路模型進行並行化,加速程式執行效率。已廣泛應用於Google、百度、Facebook,阿里,京東,華為等公司以及中國的高效能運算機。
我在讀研究生期間,我們經常利用GPU叢集解決海量資料的計算問題,比如:計算海量模型資料的網格分割,通過GPU集群后計算速度非常快。另外,GPU叢集還用於動漫的模型和場景渲染,網上有很多提供渲染服務的渲染農場,專用於對數以幾百萬面的模型渲染。
使用GPU在遊戲中的渲染,我們利用GPU渲染模型材質和場景,不論是模型材質還是每幀執行的遊戲圖片,它的內部都是由RGB或者RGBA元素組成,換句話說,它是由資料矩陣組成的,利用GPU對圖片資料進行再加工,就可以得到非常絢麗的畫面,GPU對矩陣計算效率非常高,我們只是簡單的利用了單GPU的計算能力就足以應付遊戲的渲染了。下圖是我們研發的引擎實現的遊戲截圖如下所示:
總之,我們不論做GPU叢集還是隻是用GPU做渲染,都是利用了GPU強大的加速計算能力。
GPU程式設計前景如何?
GPU叢集這塊給讀者簡單的介紹一下,它的前景非常好,也是未來一個發展趨勢,進入大資料時代,無人駕駛,機器人時代,這些都需要GPU處理,另外,市場上有很多大資料公司招聘需要GPU叢集能力的工程師,前景是非常看好的,市場需求很大。但是本課程主要針對的是GPU渲染程式設計,本課程會針對這方面進行重點講解。
目前國內最流行的引擎是Unity和UE4,二者都是國外製作的,雖然各大遊戲公司也有自己的引擎,實話實說,自研引擎跟商業引擎還是有些差距的,在這裡不是貶低國內自研引擎,不說別的,看看國內開發者對Unity和UE4引擎的使用就可以看出當前國內程式設計師的水平。下面是國外公司利用Unity渲染的效果,如下圖所示:
Unity引擎和UE4引擎雖然提供了Shader庫,但是在遊戲製作過程中還會有提一些新的需求,需要我們自己程式設計實現的效果。這些需求的實現就體現了GPU程式設計的水平了。
UE4渲染也是一樣的,國內的開發者對GPU程式設計的使用無法真正的發揮出它的渲染功力,我們看看國外公司製作的遊戲渲染畫面,如下圖所示:
我們經常說遊戲的評級:S級大作,A級大作,B級,C級,評級一方面是看畫面品質,一方面是看遊戲策劃,遊戲的第一印象還是畫面品質,這個就會涉及到GPU渲染。GPU渲染遍及遊戲的各個方面,從物體的渲染,粒子的渲染到整個場景的渲染,處處都有GPU的影子。
要想在激烈的IT競爭中立於不敗之地,作為程式設計師必須要不斷地提升自己的程式設計技能,除了掌握一門技術外,必須要再掌握一門技術,而且這門技術市場需求要大,不論你選擇是GPU叢集還是GPU渲染程式設計,雖然方向不同,但是都是利用GPU強大的計算以及加速能力。遊戲渲染這個分支市場需求同樣大,大家看看最近騰訊,網易公司招聘圖形學工程師薪資截圖:
還有很多的IT公司這裡就不一一列舉了,大家在百度或者招聘網站搜尋:圖形學工程師招聘,可以看到許多大大小小的公司對圖形學工程師的需求,而且薪資相對邏輯程式設計高一大截,前景形勢一片大好。
其實不論是使用Unity引擎和UE4引擎還是自研引擎,都離不開GPU程式設計,檢驗引擎其中一個非常重要的指標就是渲染。
如何學習GPU程式設計?
既然GPU程式設計前景這麼好,作為初級程式設計師或者想學習GPU程式設計的開發者該如何系統的學習呢?這個也是我們的課程所要解決的核心問題。學習一門語言,我們還是要尋找一門能夠系統的學習的課程,這個也是我們多年的工作經驗積累結果,市面上有很多關於GPU程式設計的書,比較經典的書籍《GPU Gems》系列,中文名字:《GPU程式設計精粹》,對於這些大部頭的書籍,並不適合初學者學習。而本課程的內容專門為初學者及以上的程式設計師量身打造的,主要分三大篇:
基礎篇:GPU程式設計常用的向量,矩陣,四元數運算以及GPU與CPU的通訊原理等等這些都是經過提煉後的知識,非常實用;
進階篇:掌握了基礎模組的知識後,接下來就要進一步學習與GPU相關的知識了,著色器,紋理,混合,模板等等都是與GPU程式設計相關的技術點,掌握這些技術點,為深入學習GPU程式設計打下堅實的基礎。
提高篇:本篇講解的都是與實際案例相關的技術,市面上執行的遊戲都與這些技術點相關,掌握了它們可以直接將其應用到自己的專案中;
在這裡我把學習大綱給讀者列一下:
下面就說說我設計這個課程的一些想法,嚴格來說我也是跨行業的,以前是搞伺服器的,讀研究生時方向變成了圖形學,剛接觸GPU程式設計,跟大多數程式設計師一樣的,對此啥都不懂,不管怎樣既然選擇了就要走下去,經過十多年的學習,逐步有了一些心得體會。目前國內學習圖形學的程式設計師相對來說比較少,在此也想把自己的一點經驗分享給哪些想從事圖形學開發的愛好者。
首先看基礎篇的內容,選擇了向量和矩陣運算,這兩個運算不僅在GPU中使用的頻繁,在遊戲引擎中也是最基礎的部分,非常重要。我也會在課程中詳細的介紹向量和矩陣的運算,這樣在後面的實戰專案裡面用起來就得心用手了。渲染管線的出現是引擎發展的一個里程碑,在沒有GPU之前,我們使用的是固定流水線,這個也是當時主流引擎使用的,我還專門為此寫過一本書《手把手教你架構3D遊戲引擎》電子出版社,感興趣的讀者可以看看。另外也出過CSDN視訊教程:
《3D遊戲開發套餐》這些也是關於學習GPU程式設計的基礎,基本的向量和矩陣運算,GPU出現後,以前的固定流水線變成了可程式設計流水線。GPU強大的計算能力,不僅應用於渲染,也加速了人工智慧,深度學習這些大資料平臺的發展。可程式設計渲染管線從DX9開始到現在比較成熟的DX12,自身也經歷了發展,從頂點著色器,可程式設計著色器,到幾何渲染,軟體與硬體相互促進,效果也越來越好,效率也在逐步提升。給讀者展示一下DX12的可程式設計流水線:
上圖是DX11,DX12的固定流水線示意圖,明顯比以前的DX8,DX9多了很多項,這些都增加了渲染效果。會在後面的課程中詳細介紹,這裡給讀者提示一下。
CPU與GPU互動,我們在遊戲優化時,會看這幾個指標,DrawCall的數量,記憶體佔用,其中DrawCall的數量涉及到CPU與GPU的互動,為了讓讀者真正的明白二者的互動,會單獨拿出一節課講解。掌握了這些知識,對於學習GPU前期準備工作足夠了,接下來我們就需要進階了。
進階課程的中會用到我們基礎教程中的知識,我們的課程是環環相扣的,著色器程式設計作為Shader語言最基本的操作,作為開發者必須要掌握的,不論可程式設計流水線怎麼變換,頂點著色器和畫素著色器一直存在的。我們的GPU渲染說的直白一些,渲染是針對圖片進行的,也就是我們說的紋理,遊戲執行也是一張張圖片快速播放。紋理儲存的是RGB或者RGBA的畫素矩陣,GPU對矩陣的計算是非常鍾愛的,速度非常快。混合模式在渲染中比較常用,它針對的是需要鏤空的物體,比如樹葉渲染就會用到混合。
進階課程的後面的技術從模板到環境光散射,列這些技術的目的是讓讀者知道它們實現的原理,它們是GPU程式設計中的核心技術,這些技術在渲染中被廣泛應用,比如我們使用的Unity引擎和UE4引擎,二者都提供了這些技術點的實現。渲染並不是這些單一技術點的實現而是組合起來使用效果更佳,我們講解的技術點都是以實用實戰為主。
提高篇也是實戰篇為了方便讀者更快的掌握Shader程式設計我們使用了Unity這個應用最廣泛的引擎作為基礎,我們只需要關心Shader的編寫就可以了,而無需關心引擎內部的實現及優化。提高篇列舉的GPU實現知識點是遊戲專案實戰中經過檢驗過的,它們大部分都取自遊戲專案的開發。
我們這個課程設計了以上三個階段學習,是一個逐步進階的過程,也是GPU程式設計提升的過程,這麼設計的其中一個重要原因是讓開發者分階段學習,也是一個逐步提升,循序漸進的過程。專案中涉及到GPU程式設計,也會涉及一些優化技術講解,這樣讀者不僅會編寫GPU程式,也會在此基礎上進行優化。
總結
學習GPU程式設計,上面提到學習課程是最基礎的,必須要掌握的,但是GPU程式設計的學習遠遠不止這些,真正使用好了GPU程式設計,它能為我們做很多事情,甚至可以使用GPU編寫小遊戲。現在遊戲中使用的批處理,是CPU與GPU通訊的頻率,隨著硬體的革新,GPU的可程式設計流水線也會越來越容易。