Unity PBR渲染技術系列一

國慶假期終於空閒了,利用休息這段時間,把最近一直研究Unity的渲染技術成果給大家分享一下,目前,在遊戲開發方面,兩個職位比較火,一個是圖形學程序,另一個是美術TA。這兩個職位有個共同的特徵就是需要掌握Shader編程。Unity官方提供了一些Shader的渲染比如Standard。但是這個遠遠不能滿足程序開發需求。需要我們自己去開發一些Shader滿足需求,很多人對寫Shader都比較頭疼,學習Shader有兩種方式:一種是從原理開始學習,這需要學習者掌握數學知識,另外對固定流水線和可編程流水線熟練掌握,這二者會涉及到矩陣控件變換,很多人就在此卡住了;其實我們完全可以繞開這層,採用第二種學習方式就是走一個捷徑,採用Shader工具比如Shader Forge和Shader Graph。爲了能夠快速的掌握PBR技術,在此建議讀者學習Shader Graph,這個跟UE4的非常相似,其實通過工具的使用也是爲了給美術TA和圖形學編程者降低進入門檻。使用工具編程對Shader的基本語法還是要懂的,否則在連線過程中也會不知所措。下面我們就以渲染一個角色的皮質衣服爲例給讀者講解如何製作?下面是效果圖。
在這裏插入圖片描述
上圖顯示的裙子是皮質的效果,如果策劃提了這個需求後,作爲美術TA或者圖形學編程者該如何實現?那我們就要分析這個效果需要哪些貼圖實現了,Diffuse是必不可少的,我們的皮質衣服有亮度,而且亮度有明有暗,這個自然讓人想到了法線的表現,兩張貼圖搞定了,剩下的就是皮質的體現了,我們看看Unity爲我們提供了一個結構體,而且這個結構體我們可以自己定義,結構代碼如下所示:


		struct SurfaceOutputCustomLightingCustom
		{
			half3 Albedo;
			half3 Normal;
			half3 Emission;
			half Metallic;
			half Smoothness;
			half Occlusion;
			half Alpha;
			Input SurfInput;
			UnityGIInput GIData;
		};

在這個結構體中,我們會使用Metallic和Smoothness兩個參數,因爲表示物體表面的反射率與光照的反射程度由Metallic和Smoothness來控制的。這樣我們的渲染技術我們就分析完成了。兩個參數對應的是兩張貼圖,一張用於表現Metallic,一種表現Smoothness。從優化角度講,我們會將二者合併成一張貼圖。這樣我們只需要三張貼圖就可以實現我們的皮質效果:一張是Albedo(diffuse),一張是Normal法線貼圖,一張是Metallic和Smoothness合併的貼圖。貼圖問題解決了。
如下圖所示:
在這裏插入圖片描述
下面我們就要通過Shader Grapth進行效果的渲染了。
第一步:把我們的貼圖先在Shader Graph中表示出來,效果如下所示:
在這裏插入圖片描述
我們還是使用了Standard Surface Light,這樣我們的貼圖就全部用上了,這也是我們的核心部分,我們明白了原理直接連線就可以了。
第二步:針對PBR會用到一些算法比如Fresnel菲涅爾效果針對也是反射,這個Shader Graph也爲我們實現好了,直接拿過來使用就可以了,如下圖所示:
在這裏插入圖片描述
最後,我們需要把它們鏈接起來,這樣我們的皮質渲染效果才能實現出來。當然少不了紋理的Mutiply相乘和紋理的疊加Add,以及Clamp和saturate函數的使用。最終我們的Shader如下所示:
在這裏插入圖片描述
另外,該Shader不僅能渲染皮質的,還能渲染布料的,二者的區別只是在貼圖上,通過繪製的貼圖改變,我們還可以做出布料的材質效果,Shader是跟上面提到的一樣,實現效果如下所示:
在這裏插入圖片描述
所以Shader寫好了後,通過改變材質,得出的效果是完全不一樣的。很神奇吧?
總結
隨着硬件的提升,玩家對遊戲品質的要求越來越高,以前做遊戲要求玩家的面數在1500個三角面片的時代已經過去了,現在需要的是次世代效果,面數在12000-15000之間。這些都對渲染提高了要求,PBR渲染技術對於遊戲品質的提升起到了非常好的效果,掌握了PBR技術就掌握了次世代渲染技術。這個會通過一個系列給讀者介紹。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章