本文轉(zhuǎn)自Unity Connect博主 taecg
前言
Shader惨险,中文名為著色器讹语,對很多開發(fā)者來說它是一個神秘的存在搞糕,想學(xué)但是又不知道如何去學(xué)勇吊,或者學(xué)了一段時間發(fā)現(xiàn)Get不到它的點(diǎn),始終感覺游離在外窍仰,無法開竅汉规。
那么本專欄(Unity技術(shù)美術(shù))在前幾篇介紹了美術(shù)資源標(biāo)準(zhǔn)后,打算接下來花一些篇章來講下如何從零基礎(chǔ)入門Shader驹吮,目的在于讓初學(xué)Shader的程序或者美術(shù)可以快速進(jìn)入這個豐富多彩的世界针史。
什么是Shader
雖然上面有簡單的說了下Shader就是著色器,但是還是有必要詳細(xì)說明一下具體什么是Shader碟狞。
Shader其實(shí)就是專門用來渲染圖形的一種技術(shù)啄枕,通過shader,我們可以自定義顯卡渲染畫面的算法族沃,使畫面達(dá)到我們想要的效果射亏。小到每一個像素點(diǎn),大到整個屏幕竭业。
Shader分為兩類 :
頂點(diǎn)Shader(3D圖形都是由一個個三角面片組成的,頂點(diǎn)Shader就是計(jì)算每個三角面片上的頂點(diǎn)及舍,并為最終像素渲染做準(zhǔn)備)未辆。
片斷Shader,顧名思義锯玛,就是以片斷為單位咐柜,計(jì)算光照、顏色的一系列算法攘残。 幾個不同的圖形API都有各自的Shader語言拙友,在DirectX中,頂點(diǎn)shader叫做 Vertex Shader 歼郭,片斷Shader叫做 Pixel Shader遗契,也就是像素著色器; 在OpenGL中病曾,頂點(diǎn)Shader也叫做 Vertex Shader 牍蜂,片斷Shader叫做 Fragment Shader,也就是我們常說的片斷Shader或者片元Shader泰涂。
說白了鲫竞,Shader其實(shí)就是一段代碼,這段代碼的作用是告訴GPU具體怎樣去繪制模型的每一個頂點(diǎn)的顏色以及最終每一個像素點(diǎn)的顏色逼蒙。
Shader編程語言
既然Shader是一段代碼从绘,那必然要用一種語言來書寫它,目前主流的有三種語言:
1.基于OpenGL的OpenGL Shading Language,簡稱GLSL僵井。
2.基于DirectX的High Level Shading Language,簡稱HLSL陕截。
3.還有NVIDIA公司的C for Graphic,簡稱Cg語言驹沿。
GLSL與HLSL分別是基于OpenGL和Direct3D的接口艘策,兩者不能混用。而Cg語言是用于圖形的C語言渊季,這其實(shí)說明了當(dāng)時設(shè)計(jì)人員的一個初衷朋蔫,就是讓基于圖形硬件的編程變得和C語言編程一樣方便,自由却汉。正如C++和 Java的語法是基于C的驯妄,Cg語言本身也是基于C語言的。如果您使用過C合砂、C++青扔、Java其中任意一個,那么Cg的語法也是比較容易掌握的翩伪。Cg語言極力保留了C語言的大部分語義微猖,力圖讓開發(fā)人員從硬件細(xì)節(jié)中解脫出來,Cg同時擁有高級語言的好處缘屹,如代碼的易重用性凛剥,可讀性高等。
Cg語言是Microsoft和NVIDIA相互協(xié)作在標(biāo)準(zhǔn)硬件光照語言的語法和語義上達(dá)成了一致轻姿,所以犁珠,HLSL和Cg其實(shí)是同一種語言。
美術(shù)人員看到這里時也不用害怕互亮,語法上并不難犁享,而且在后續(xù)的章節(jié)中碰到相關(guān)的語法時我們會詳細(xì)的進(jìn)行說明。
什么是Unity Shader
顯卡有NVIDIA豹休、ATI炊昆、Intel等等。慕爬。窑眯。
圖形API有OpenGL、DirectX医窿、OpenglES磅甩、Vulkan、Metal等等姥卢。卷要。渣聚。
Shader編程語言有GLSL、HLSL僧叉、Cg等等奕枝。。瓶堕。
是不是有點(diǎn)頭暈隘道,該怎么去選擇呢?在Unity中我們又應(yīng)該如何做呢郎笆?
其實(shí)在Unity中反而一切變的簡單起來了谭梗,我們只需關(guān)心如何去這實(shí)現(xiàn)我們想要的效果就好了,其余的事情全部交給Unity來自動處理宛蚓。因?yàn)槲覀冊赨nity中編寫的Shader最終會根據(jù)不同的平臺來編繹成不同的著色器語言激捏,那么我們在Unity中應(yīng)該用什么語言來書寫Shader呢?
官方的建議是用Cg/HLSL來編寫凄吏,當(dāng)然你也可以使用GLSL远舅,主要是因?yàn)镃g/HLSL有更好的跨平臺性,更傾向于使用Cg/HLSL來編寫Shader程序痕钢。
Unity Shader嚴(yán)格來說并不是傳統(tǒng)上的Shader,而是Unity自身封裝后的一種便于書寫的Shader图柏,又稱為ShaderLab。
在Unity中有3種Shader(其實(shí)就是三種不同的寫法):
1.Surface Shaders 表面著色器
2.Vertex/Fragment Shaders 頂點(diǎn)/片斷著色器
3.Fixed Function Shaders 固定管線著色器
其中Fixed Function Shaders已經(jīng)被淘汰任连,完全沒有學(xué)習(xí)的必要了爆办。
Surface Shader其實(shí)就是Unity對Vertex/Fragment Shader的又一層包裝,以使Shader的制作方式更符合人類的思維模式课梳,同時可以以極少的代碼來完成不同的光照模型與不同平臺下需要考慮的事情。
但是Surface Shader也有它的局限性余佃,就是Vertex/Fragment Shader能實(shí)現(xiàn)的效果暮刃,Surface Shader不一定能實(shí)現(xiàn),反過來則成立爆土,Surface Shader能實(shí)現(xiàn)的Vertex/Fragment Shader則一定可以實(shí)現(xiàn)椭懊。
并且在Unity2018后的版本中推出了Unity官方自己的可視化Shader工具(Shader Graph)。從生成的代碼上來看步势,也全部是用的Vertex/Fragment Shader氧猬,那是不是可以理解為在今后的可編程渲染管線中,Unity自己也拋棄了Surface Shader坏瘩,而全部采用了Vertex/Fragment Shader盅抚?
總之,在今后的學(xué)習(xí)過程中倔矾,也會涉及一些Surface Shader的內(nèi)容妄均,但主要還是會以Vertex/Fragment為主柱锹。
另外,學(xué)會Shader也會給我們帶來很多的好處:
游戲中模型顯示粉色的情況你一定碰到過吧丰包,是Shader丟失呢禁熏,還是Shader不符合當(dāng)前平臺呢,又或者是Shader上有語法的錯誤呢邑彪?如果我們有了解并學(xué)會Shader的話瞧毙,這些問題就不會再是一臉懵逼啦。
內(nèi)建Unity Shader僅僅只是“通用”用例寄症,不足以滿足我們所有的畫面表現(xiàn)需求宙彪。
一旦掌握Shader,可以為游戲/應(yīng)用創(chuàng)造獨(dú)一無二的視覺享受瘸爽。根據(jù)實(shí)際需求您访,為游戲和應(yīng)用實(shí)現(xiàn)特定功能的Shader。
能大大的幫助我們做渲染上的性能優(yōu)化剪决,因?yàn)橥ㄟ^Shader可以控制渲染什么以及如何渲染灵汪。
撰寫Shader的能力對于游戲團(tuán)隊(duì)非常重要,掌握Shader技能的開發(fā)一直是炙手可熱的職位「塘剩現(xiàn)在一個不爭的事實(shí)就是享言,技術(shù)美術(shù)永遠(yuǎn)是各大廠商的稀缺資源。
好處多多渗鬼,大家快快學(xué)習(xí)起來吧~
文章鏈接
https://connect.unity.com/p/ling-ji-chu-ru-men-unity-shader-yi?app=true
更多相關(guān)知識歡迎大家使用Unity官方app關(guān)注該博主~