近來看Graphics的概念,對shader簡單查了一下,感覺下篇文章講的挺好,個人感覺shader(中文翻譯着色器),其實就是個效果器,就是告訴GPU我當前的模型渲染成什么樣的效果,比如金光燦燦,比如由明變暗之類的。之所以叫着色器,是因為模型有了之后,給這個模型各種各樣的效果,其實就是着色(上色)的過程,所以叫着色器也是合適的。
下面是轉載的文章:
前言
Shader,中文名為着色器,對很多開發者來說它是一個神秘的存在,想學但是又不知道如何去學,或者學了一段時間發現Get不到它的點,始終感覺游離在外,無法開竅。
那么本專欄(Unity技術美術)在前幾篇介紹了美術資源標准后,打算接下來花一些篇章來講下如何從零基礎入門Shader,目的在於讓初學Shader的程序或者美術可以快速進入這個豐富多彩的世界。
什么是Shader
雖然上面有簡單的說了下Shader就是着色器,但是還是有必要詳細說明一下具體什么是Shader。
Shader其實就是專門用來渲染圖形的一種技術,通過shader,我們可以自定義顯卡渲染畫面的算法,使畫面達到我們想要的效果。小到每一個像素點,大到整個屏幕,比如下面這兩個游戲內比較常見的效果。
Shader分為兩類 :
- 頂點Shader(3D圖形都是由一個個三角面片組成的,頂點Shader就是計算每個三角面片上的頂點,並為最終像素渲染做准備)。
- 像素Shader,顧名思義,就是以像素為單位,計算光照、顏色的一系列算法。 幾個不同的圖形API都有各自的Shader語言,在DirectX中,頂點shader叫做 Vertex Shader ,像素Shader叫做 Pixel Shader; 在OpenGL中,頂點Shader也叫做 Vertex Shader ,但像素Shader叫做 Fragment Shader,也就是我們常說的片斷Shader或者片元Shader。
說白了,Shader其實就是一段代碼,這段代碼的作用是告訴GPU具體怎樣去繪制模型的每一個頂點的顏色以及最終每一個像素點的顏色。
Shader編程語言
既然Shader是一段代碼,那必然要用一種語言來書寫它,目前主流的有三種語言:
- 基於OpenGL的OpenGL Shading Language,簡稱GLSL。
- 基於DirectX的High Level Shading Language,簡稱HLSL。
- 還有NVIDIA公司的C for Graphic,簡稱Cg語言。
GLSL與HLSL分別是基於OpenGL和Direct3D的接口,兩者不能混用。而Cg語言是用於圖形的C語言,這其實說明了當時設計人員的一個初衷,就是讓基於圖形硬件的編程變得和C語言編程一樣方便,自由。正如C++和 Java的語法是基於C的,Cg語言本身也是基於C語言的。如果您使用過C、C++、Java其中任意一個,那么Cg的語法也是比較容易掌握的。Cg語言極力保留了C語言的大部分語義,力圖讓開發人員從硬件細節中解脫出來,Cg同時擁有高級語言的好處,如代碼的易重用性,可讀性高等。
Cg語言是Microsoft和NVIDIA相互協作在標准硬件光照語言的語法和語義上達成了一致,所以,HLSL和Cg其實是同一種語言。
美術人員看到這里時也不用害怕,語法上並不難,而且在后續的章節中碰到相關的語法時我們會詳細的進行說明。
什么是Unity Shader
顯卡有NVIDIA、ATI、Intel等等。。。
圖形API有OpenGL、DirectX、OpenglES、Vulkan、Metal等等。。。
Shader編程語言有GLSL、HLSL、Cg等等。。。
是不是有點頭暈,該怎么去選擇呢?在Unity中我們又應該如何做呢?
其實在Unity中反而一切變的簡單起來了,我們只需關心如何去這實現我們想要的效果就好了,其余的事情全部交給Unity來自動處理。因為我們在Unity中編寫的Shader最終會根據不同的平台來編繹成不同的着色器語言,那么我們在Unity中應該用什么語言來書寫Shader呢?
官方的建議是用Cg/HLSL來編寫,當然你也可以使用GLSL,主要是因為Cg/HLSL有更好的跨平台性,更傾向於使用Cg/HLSL來編寫Shader程序。
Unity Shader嚴格來說並不是傳統上的Shader,而是Unity自身封裝后的一種便於書寫的Shader,又稱為ShaderLab。
在Unity中有3種Shader(其實就是三種不同的寫法):
- Surface Shaders 表面着色器
- Vertex/Fragment Shaders 頂點/片斷着色器
- Fixed Function Shaders 固定管線着色器
其中Fixed Function Shaders已經被淘汰,完全沒有學習的必要了。
Surface Shader其實就是Unity對Vertex/Fragment Shader的又一層包裝,以使Shader的制作方式更符合人類的思維模式,同時可以以極少的代碼來完成不同的光照模型與不同平台下需要考慮的事情。
但是Surface Shader也有它的局限性,就是Vertex/Fragment Shader能實現的效果,Surface Shader不一定能實現,反過來則成立,Surface Shader能實現的Vertex/Fragment Shader則一定可以實現。
並且在Unity2018后的版本中推出了Unity官方自己的可視化Shader工具(Shader Graph)。從生成的代碼上來看,也全部是用的Vertex/Fragment Shader,那是不是可以理解為在今后的可編程渲染管線中,Unity自己也拋棄了Surface Shader,而全部采用了Vertex/Fragment Shader?
總之,在今后的學習過程中,也會涉及一些Surface Shader的內容,但主要還是會以Vertex/Fragment為主。
另外,學會Shader也會給我們帶來很多的好處:
- 游戲中模型顯示粉色的情況你一定碰到過吧,是Shader丟失呢,還是Shader不符合當前平台呢,又或者是Shader上有語法的錯誤呢?如果我們有了解並學會Shader的話,這些問題就不會再是一臉懵逼啦。
- 內建Unity Shader僅僅只是“通用”用例,不足以滿足我們所有的畫面表現需求。
- 一旦掌握Shader,可以為游戲/應用創造獨一無二的視覺享受。根據實際需求,為游戲和應用實現特定功能的Shader。
- 能大大的幫助我們做渲染上的性能優化,因為通過Shader可以控制渲染什么以及如何渲染。
- 撰寫Shader的能力對於游戲團隊非常重要,掌握Shader技能的開發一直是炙手可熱的職位。現在一個不爭的事實就是,技術美術永遠是各大廠商的稀缺資源。
轉載自: https://zhuanlan.zhihu.com/p/46745694
