【Unity Shaders】學習筆記——渲染管線


【Unity Shaders】學習筆記——Shader和渲染管線


轉載請注明出處:http://www.cnblogs.com/-867259206/p/5595924.html

寫作本系列文章時使用的是Unity5.3。
寫代碼之前:

  1. 當然啦,如果Unity都沒安裝的話肯定不會來學Unity Shaders吧?

  2. 閱讀本系列文章之前你需要有一些編程的概念。

  3. 在VS里面,Unity Shaders是沒有語法高亮顯示和智能提示的,VS黨可以參考一下這篇文章使代碼高亮顯示,也可以下載shaderlabvsNShader之類的插件使代碼高亮顯示。

  4. 這是針對小白的Unity Shaders的基礎知識,如果你已經有了基礎或者你是大神,那么這些文章不適合你。

  5. 由於作者水平的局限,文中或許會有謬誤之處,懇請指出。


Shader的意思就是着色器,也就是“給物體上色”,所以Shader的作用就是計算物體最終顯示的顏色是什么。
GPU這個名詞相信大家都不陌生。它是計算機處理圖像的元件。GPU是Graphic Processing Unit(圖形處理單元)的縮寫。由於 GPU 具有高並行結構(highly parallel structure),所以 GPU 在處理圖形數據和復雜算法方面擁有比 CPU 更高的效率。我們來看一下下面兩段代碼的對比,這兩段代碼都是提取 2D 圖像上每個像素點的顏色值,第一段是在CPU上運算的C++代碼,第二段是在GPU上運算的Cg代碼:

CPU要用for循環語句遍歷像素,而GPU只要一行代碼就夠了。GPU在圖形處理方面很強大吧?
而Shader,就是GPU執行的一段針對3D對象進行操作的程序。

Shader開發語言

  • HLSL: 主要用於Direct3D。平台:windows。

  • GLSL: 主要用於OpenGL。 平台:移動平台(iOS,安卓),mac(only use when you target Mac OS X or OpenGL ES 2.0)

  • CG:與DirectX 9.0以上以及OpenGL 完全兼容。運行時或事先編譯成GPU匯編代碼。
    CG比HLSL、GLSL支持更多的平台,Unity Shader采用CG/HLSL作為開發語言。

Unity3d里CG如何編譯

  • Windows:Direct3D GPU匯編代碼

  • Mac:OpenGL GPU匯編代碼

  • Flash: flash GPU匯編代碼

  • Ios/Android: Unity會將CG轉換成GLSL代碼
    也就是除了移動平台會把CG轉換成GLSL代碼,其余平台都是轉換成匯編代碼。

渲染管線

Shader按管線分類一般分為固定渲染管線與可編程渲染管線。
渲染管線(Rendering Pipeline)其實就是GPU渲染流程。你可以這樣理解渲染,在一個三維坐標系下,給定一個視點(即攝相機),給定三維物體、光源以及照明模式、紋理等信息,如何繪制一幅呈現在視點畫面中的二維圖像的過程。
早期GPU遵循的管線叫固定管線(Existing Fixed Function Pipeline)。
                     
(英語不太好的查下圖中每個方框里的單詞,因為我懶得在圖上標注中文了)
圖中橙色的部分是用戶可以通過GPU配置的。顧名思義,固定管線就是功能固定的管線啦。所謂的功能固定,按照我的理解,就是物體表面與光的反射、折射的算法固定,無法修改,因此物體只能表現出類似塑料的那種質感(如果你用3DMax建過模型,你會理解的),雖然可以用貼圖來彌補。固定管線只能配置“是否開啟霧效”、“是否開啟光照”、“是否開啟深度測試”等一些參數,而不能控制物體與光交互的算法。不同質感的物體,比如金屬和木頭,金屬反光強烈,看起來質感堅硬,木頭反光較弱,看起來質感較軟一些,金屬和木頭兩種材質着色的算法應該是不一樣的。總之,固定管線因為功能固定,無法在程序上對物體細節的表現給予更多更自由的控制,無法達到更多更炫酷的效果。
如今已經不再需要學習固定管線了,GPU都已經進入了2.0時代,新的顯卡都是可編程渲染管線了。
所謂的可編程,就是上面所說的功能固定的那個部分,變成可以由程序員編程控制了。這樣自由度就更大了,可以表現出更多的特效了。
先來看看可編程渲染管線的流程吧。

第一塊橙色,是Vertex Shader(頂點着色),第二塊橙色是Fragment Shader(片元着色)。這兩個部分,就是程序員可以編程的部分了。頂點着色程序,它的作用是逐個對頂點進行變換,得到物體的輪廓,然后對面上的像素進行線性插值。片元着色程序,根據檢測不同,來決定是否修正每個像素的color等信息,逐像素處理。Vertex的輸出是Fragment的輸入。Vertex是頂點變換,輸入和輸出都需要包含頂點的position信息;Fragment是色深的變化,輸出一般只有color信息。如果你是第一次接觸這部分的知識,你可能會覺得有些迷惑,不過沒關系,隨着學習的深入你會漸漸明白。你只要大致明白,定點着色器主要是對頂點進行處理,而片元着色器主要是計算像素的色彩。
其實還有其他的着色程序,但這里不會涉及,所以不會深入說明。

OpenGL渲染管線

 


 

如圖所示,這是OpenGL的工作流程圖。
關於圖中的各個過程具體都在做些什么工作,可以看看這篇 博客,講得挺詳細的,我就不贅述了。
上述的這些過程,初學者可以簡單地記為四個部分

 

頂點變換 → 圖元裝配和光柵化 → 片元紋理映射和着色 → 寫入幀緩存

可編程的部分就是頂點變換和片元着色啦。

Unity3D的四種Shader

Unity的Shader有四種:

  1. Fixed function shader 屬於固定渲染管線Shader, 基本用於高級Shader在老顯卡無法顯示時的備用Shader。

  2. Vertex and Fragment Shader 最強大的Shader類型,屬於可編程渲染管線。使用的是CG/HLSL語言。也就是我上面說過的兩種。

  3. Surface Shader Unity3d推薦的Shader類型。它是一個代碼生成器,幫我們將重復的代碼省去了,使得編寫Shader更為容易。使用的也是CG/HLSL語言。

  4. Compute Shader 這是Unity3D新增的一種。看下度娘百科對它的介紹:

Compute Shader技術是微軟DirectX 11 API新加入的特性,在Compute Shader的幫助下,程序員可直接將GPU作為並行處理器加以利用,GPU將不僅具有3D渲染能力,也具有其他的運算能力,也就是我們說的GPGPU的概念和物理加速運算。

Compute Shader 使用HLSL語言。

接下來我們就要從最簡單的Surface Shader學起。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM