書中第一章介紹了Shader的基本概念以及實現語言,內容很少,能夠用一下幾點歸納第一章內容,html
1,Shader是運行在GPU上對三維物體,進行着色處理、光影計算以及紋理顏色的呈現。程序員
2,Shader的編程方式經歷了從最初的固定管線到可編程管線的發展。在可編程管線中Shader分爲頂點Shader和片斷Shader。頂點Shader具備處理變換網格物體頂點的功能,網格通過硬件的格柵化後,片斷Shader會對每個片斷(預備像素),進行各類測試,最終渲染成可見像素。編程
3,目前Shader實現語言包括3種,微軟提供的HLSL(High Level Shading Language),OpenGL提供的GLSL(OpenGL Shading Language)以及NIVIDIA提供的Cg(C for graphics)。在Unity中對Shader的編程語言支持的重點是Cg。後端
以上就是第一章中的所有內容,這裏還有幾個重要的知識點值得思考和拓展:網絡
下面將對上訴四個問題進行逐一的分析解答,答案來結合網上搜集的資料以及自身的理解。編程語言
1.Shader爲何針對是三維物體?學習
在書中對Shader的定義中特地提到Shader是對三維物體完成着色、光影以及紋理顏色的呈現。其實這個問題有兩點能夠很好的解釋,測試
首先說是三維物體不如說成是三維空間中的物體,這個物體能夠是一個2D平面也能夠是一個3D物體,在Unity3D中不管3D、2D物體以及UI等都是經過Shader來進行處理渲染和顯示效果的。這裏不是說2D的平面或者UI就不能使用Shader,而是全部在三維空間中的物體都是經過Shader來完成渲染的顯示的。3d
其次,Shader主要完成的工做是對物體進行着色、光影以及紋理的呈現,這裏要拿二維空間和三維空間進行對比,在二維空間中,物體能夠簡單的理解爲一個平面一張紙,和三維空間相比,二維明顯少了光和影的變換,而光和影的處理是shader中最爲關鍵的一點。光和影的呈現是須要光源和物體的朝向,在二維空間中,物體和光源永遠都是平行的,看不到紋理以及顏色的變化,甚至連物體都看不到,更別談Shader對物體的處理了。htm
因此Shader主要是運行在GPU中對三維物體進行處理的。
2.DirectX和OpenGL?
OpenGL是個專業的3D程序接口,是一個功能強大,調用方便的底層3D圖形庫,OpenGL是個與.硬件無關的軟件接口,能夠在不一樣的平臺如Windows 9五、Windows NT、Unix、Linux、MacOS、OS/2之間進行移植。所以,支持OpenGL的軟件具備很好的移植性,能夠得到很是普遍的應用。在專業高端繪圖領域,OpenGL是不能被取代的。
OpenGL仍然是惟一可以取代微軟對3D圖形技術的徹底控制的API。遊戲開發人員是一個有着獨立思想的羣體,不少重要的開發人員目前仍然在使用Open GL。所以,硬件開發商正在設法增強對它的支持。Direct3D目前還不能支持高端的圖形設備和專業應用; Open GL在這些領域佔據着統治地位。
DirectX是一種應用程序接口(API),按照性質分類,能夠分爲四大部分,顯示部分、聲音部分、輸入部分和網絡部分。
其中,DirectDraw(DDraw)和Direct3D(D3D),前者主要負責2D圖像加速。它包括不少方面:咱們播放mpg、DVD電影、看圖、玩小遊戲等等都是用的DDraw,你能夠把它理解成全部劃線的部分都是用的DDraw。後者則主要負責3D效果的顯示,好比 CS中的場景和人物、FIFA中的人物等等,都是使用了DirectX的Direct3D。
表面上好像D3D比OpenGL支持更多的功能,其實因爲D3D不支持硬件擴展,如硬件全景陰影,硬件渲染順序無關半透明材質等新技術根本沒法使用,而D3D(特指D3D8)自己提供的功能只有一小部分能在使用HAL且硬件不支持時模擬,你要用大量代碼分析硬件能力和採起不一樣策略。
3.OpenGL渲染流程
在詳細介紹OpenGL渲染流程以前,建議先查詢下GPU相關知識,對OpenGL工做流程的理解會有較大的幫助。
這裏列舉下GPU圖形處理過程當中幾個關鍵的階段:
Tessellation過程
Tessellation過程其實說白了就是GPU肯定幾何模型構造的過程,還需根據改變幾何模型構造,例如更改頂點位置、添加新的頂點以及細分曲面的功能,細分曲面能夠這樣理解,在一個三角形中添加一個頂點並與原三角形頂點相連,這樣就會增長三個三角形,適當調整中間頂點的位置,就使得以前的曲面形狀更加平滑。下圖體現了Tessellation確認幾何模型構造的過程。
TMU單元
在GPU中,TMU單元負責材質庫以及顯存中的紋理進行定址和抓取,程序員會預先烘焙好一些材質,這些材質擁有基本的色彩及形貌特徵,TMU單元會根據幾何表面的須要從材質庫中定位並抓取合適的材質,以便構成物體表面的基本外貌,方便後續的Shader單元對顏色進行正確的計算,同時減輕整個渲染過程的壓力。
基本材質操做:
材質抓取過程
US單元
GPU的US單元會根據程序的須要對每個像素的RGB值進行計算,不論光影仍是色澤,最終均可以經過這些數值表達的顏色來正確的進行反映。US單元中的ALU在完成對RGB值的計算以後會把它傳輸給ROP單元與紋理進行混合。
ALU:
延遲渲染(Deferred shading)
GPU渲染過程當中會根據圖形的須要,將光照之類的操做從傳統的Pixel Shader前段直接轉移到整個流水線後端的MRT(多目標渲染)裏。這種延遲改變了shader操做的順序,將其延續到了緊貼混合以前
Deferred shading過程
ROP單元
GPU圖像處理的最後一步,所有像素填充進紋理,並使得紋理最終得到正確的表現效果。具體步驟上ROP會將ALU中計算的RGB值與TMU單元抓取的紋理進行混合並進行輸出。
shader及texture混合過程:
這裏就不繼續介紹GPU的圖形處理,感興趣的能夠到上面連接中自行查看。
迴歸主題接着介紹OpenGL中的渲染管線。
管線這個術語描述了opengl渲染的整個過程。openGL採用cs模型:c是cpu,s是GPU,c給s的輸入是vertex信息和Texture信息,s的輸出是顯示器上顯示的圖像。
下面兩張圖比較清楚的講述了OpenGL中的渲染管線:
Vertex Processing爲OpenGL的頂點處理階段,由頂點處理管線負責,主要完成了將三維物體頂點轉換到屏幕空間座標的過程。主要分爲頂點數據處理、模型視圖變換、投影變換、裁剪處理、透視除法處理、試點處理最終輸出成屏幕座標。
Rasterization光柵化處理。在OpenGL的頂點處理階段完成後,以圖元爲基本單位,生成圖元的位置座標以及屬性,以後光柵化會利用圖元頂點經過差值的方式計算圖元覆蓋全部像素的屬性。這個過程就被成爲OpenGL的光柵化過程。這一過程分爲兩步,第一決定窗口座標中的哪些整型柵格區域被基本圖元佔用;第二分配一個顏色值和一個深度值到各個區域。
Fragment Processing片斷處理。光柵化處理將圖元映射到屏幕的像素後,會生成片斷處理所須要的片斷(fragment),片斷處理會對片斷進行裁剪並結合光照、陰影以及光的顏色等計算像素最終的顏色值。以後還會深度測試以及混合測試階段判斷像素是否須要丟棄等。最終顯示在屏幕上。
最後附上一個連接,詳細介紹了OpenGL原理。
4.固定管線和可編程管線的區別
OpenGL渲染管線經歷了從固定管線到可編程管線的發展。
固定管線和可編程管線最大的區別在因而否有Shader來參與OpenGL的繪製。
可編程管線中利用了頂點Shader以及片斷Shader完成了OpenGL的渲染過程。其中頂點Shader從cpu中讀取頂點信息,包括頂點位置、顏色以及紋理座標等。以後輸出的頂點組合,進入圖元裝配階段(Primitive Assembly),將頂點轉化一個個圖元(三角形、直線、點精靈等元素),通過光柵化的操做,生成能夠在屏幕上可繪製的二維像素片斷,以後經過片斷Shader結合光照等處理計算像素最終的顏色值,通過逐片斷處理後,把生成的片斷放入到framebuffer中,最終產生屏幕上的像素。
在固定管線中沒有使用Shader來完成OpenGL的繪製,具體的流程能夠參考下圖,這裏就不着重說明了。
5.Cg語言的參考學習
對於Cg語言的介紹會在下一篇文章中學習介紹。