Thinking in Unity3D:基於物理着色(PBS)的材質系統

Image(1)

關於《Thinking in Unity3D》


筆者在研究和使用Unity3D的過程當中,得到了一些Unity3D方面的信息,同時也感嘆Unity3D設計之精妙。不得不說,筆者最近幾年的引擎研發工做中,早已習慣性的從Unity3D中尋找解決方案。html

Unity3D雖比不上UE那麼老練沉穩,氣勢磅礴。也比不上CE那樣炫麗多姿,盛氣凌人。但它的發展勢如破竹,早已遍地生花!故而在此記錄一些本身的心得體會,供你們參詳交流。如有欠妥之處,還望各位及時指正。算法

Thinking in Unity3D由一系列文章組成,文章列表地址:http://www.cnblogs.com/geniusalex/p/5321545.htmlapp

 

什麼是PBS


PBS(Physically Based Shading)在有一些地方也叫PBR(Physically Based Rendering),是一個基於物體表面材質屬性的着色方法。與以前的Blinn-Phong等算法不一樣。PBS經過對物體表面的材質屬性與周圍光照信息來進行着色計算。PBS着色系統中,一個物體不只受到光源的影響,還會受到周圍環境的影響。 這會使得整個場景更加真實。測試

PBS有一個大前提,就是它可以知足光能傳播過程當中的能量守衡。能量守衡體如今三個方面。優化

一、一個對象反射出來的光照信息,不可能超過它接受到的信息。也就是說,全反射是一個物體的極限。ui

二、一個物體越光亮,那麼它的顏色信息應該越少。(能夠看出,refection 和 diffuse 應該是一個插值關係)lua

三、一個物體越平滑,那麼它的高亮點會越小,越亮。spa

下圖展現瞭如下事實設計

一、下圖中全部的點,光照計算的方式如出一轍3d

二、粗糙的表面,受到的光照影響後,亮的面積會多些。

三、越平滑的表面,高亮點越小,越亮。

四、點A的光照信息來自攝像機方向。

五、點B的光照信息主要來自天空的藍色。

六、點C的光照信息主要來自地面。

Image(9)

 

PBS在Unity3D中的體現


在Unity3D 5.X中,默認的材質均被Standard Shader和Standard (Specular setup) Shader替代。 咱們能夠認爲,Standard系列的Shader就是Unity3D中的PBS實現。下圖即是使用Standard Shader渲染出來的場景效果。

Image(10)

若咱們在Unity3D 5.x中新建一個空場景,你會發現有一個默認的天空盒。此時,咱們再新建一個Sphere放在原點。 默認狀況下,這個球的材質使用的就是Standard Shader.以下圖所示,它受天空盒影響,上下呈現出不一樣的顏色。假如你更改天空盒的材質,那麼這個球也會跟着變化。

Image(12)

 

Unity3D中PBS具體內容


PBS或者說PBR的原理只是一種指導思想,不一樣的引擎的實現仍是有細微的區別。在此,咱們先來看看Unity3D中,PBS的實現細節。請先看一張Standard Shader的材質參數圖

左:Standard Shader     右:Standard(Specular steup)

第一眼看過去,熟悉PBR算法的朋友應該很容易看清楚Albedo、Specular、NormalMap、Occlusion、Emission等參數的意思。其他的就多半隻能靠猜了。在此咱們逐一說明每個參數的含義。

 

一、Rendering Mode

Rendering Mode用於在非透明和多種透明效果之間切換。

Opaque:默認值,實體渲染。

Cutout:即Alpha test,經過貼圖的Alpha值縷空模型表面。

Transparent:透明效果,如玻璃,半透明塑料等等。

Fade:在這個模式下,一個對象能夠實現淡入淡出效果。

TransparentFade模式的區別

Transparent模式下,反射和高光疊加的顏色不會進行Alpha效果,也就是說,對於玻璃等效果,反射足夠強的時候,只能隱約看到後面的內容,這也是符合能量守衡的,反射越多,吸取就越少。咱們能夠忽略細節,假設計算公式像這樣:DiffuseColor * Alpha + RefColor * (1 - Alpha)。

Fade模式下則不會進行這樣的運算,它會簡單粗爆的進行Alpha計算。咱們一樣能夠用僞代碼表示:DiffuseColor * Alpha + RefColor * Alpha。

由此能夠看出,Fade模式下,有較強反射的半透明物體,效果不會特別好,須要慎用。

更多細節請看官方文檔:http://docs.unity3d.com/Manual/StandardShaderMaterialParameterRenderingMode.html

 

二、Albedo

Albedo與Diffuse的區別是,Albedo咱們認爲,它是一個只擁有顏色信息的「平面」貼圖,即不帶任何AO,SHADOW等光影信息。一個物體的Alpha信息,也是由這個提供。Albedo + Tint Color構成了物體的Base Color顏色值。

下圖是常見的材質亮度表

Image(15)

更多細節請看官方文檔:http://docs.unity3d.com/Manual/StandardShaderMaterialParameterAlbedoColor.html

 

三、Metallic & Specluar & Smoothness

前面提到Unity3D提供了Standard和Standard(Specular steup)兩種着色方式。 不管是哪一種着色方式,都是控制高光反射結果的。

Specular經過直接賦與顏色的方式來決定高光反射強度。而Metallic則經過一個0~1的值,來決定金屬的反射強度。

不論是在metallic仍是Specular模式下,一但使用了貼圖來決定高光反射效果。引擎將會採用貼圖中的值,設置的Metallic因子,或者Specular Color均會無效。在這種狀況下,兩者是等價的。可是,兩者的效果是不同的。根據實則結果,Metallic的反射比Specular要多一些。

 

Metallic爲1的狀況下,左:Smoothness=0.0、中:Smoothness=0.五、 Smoothness=1.0

 

 

常見物體的Specular+Smoothness一塊兒變化時的狀況表

 

 

Image(20)常見物體的Metallic表

 

Smoothness則決定了一個物體的光滑呈度。 即便一個物體表面高光很強烈。若它是一個不光滑的物體,那麼其反射會呈不規則的方向分佈,會將光能分散到i同的地方。那麼到達人眼中的反射光就會少。總體的反射效果就會變得很弱。

 

Image(21)

物體的由粗糙到光滑的光線反射狀況

 

Image(22)

常見物體Smoothness表

注:當Metallic或者Specular被賦與貼圖後。Smoothness值會失效。 轉而採用Matallic或者Specular貼中的Alpha通道做爲Smoothness值。

更多細節請看官方文檔:http://docs.unity3d.com/Manual/StandardShaderMetallicVsSpecular.html


四、Normal Map

Normal Map是Bump Mapping的一種特例化。 它主要是經過貼圖爲光照計算時提供更細節的法線信息。使物體低模物體表面具備高度的細節效果。以下圖所示

Image(23)

更多細節請看官方文檔:http://docs.unity3d.com/Manual/StandardShaderMaterialParameterNormalMap.html

 

五、Heightmap

Heightmap比NormalMap更上一層樓,NormalMap是經過賦與物體表面更多的法線信息,來形成光照上的細節加強。 Normal Map有一個缺點就是,當視線與表面平行時,就失去的法線效果。而Heightmap則直接對某些頂點進行位移。由此也能夠看出來,Heightmap的效率開銷會比Normalmap高,要更據狀況選擇使用。

高度圖是一張灰度圖,白色表示突出,黑色表示凹陷。以下圖所示

Image(24)

更多細節請看官方文檔:

下面的圖展現了 左:普通效果   中:NormalMap效果 右:Heightmap效果

Image(25)

更多細節請看官方文檔:http://docs.unity3d.com/Manual/StandardShaderMaterialParameterHeightMap.html

 

六、Occlusion Map

Occlusion Map用於決定一個模型各部位受到間隔光照的影響狀況。 間隔光照通常來自於Ambient和環境反射。

Image(26)

Occlusion Map示例

 

Image(27)

左:無Occlusion Map  右:有Occlusion Map

更多細節請看官方文檔:http://docs.unity3d.com/Manual/StandardShaderMaterialParameterOcclusionMap.html

 

七、Emission

Emission表示一個物體的自發光程度。默認是純黑,若是爲這個物體賦值了非黑色的材質。 那麼這個物體即便在黑暗的場景下,也會有亮光。 咱們能夠簡單的認爲,計算公式像這樣:FinalColor = Color + Emission

它通常用來作一些顯示器等會進行自發光的物體材質,以下圖所示。

Image(28)

更多細節請看官方文檔:http://docs.unity3d.com/Manual/StandardShaderMaterialParameterEmission.html

 

八、Detail Mask & Secondary Maps

Secondary Maps用於在物體的表面增長細節。咱們能夠爲一個物體再賦值一套Albedo和NormalMap. 經測試,第一套Albedo和第二套Albedo的疊加算法以下  AlbedoFinal = Albedo0.rgb  * Albedo1.a + Albedo0.rgb * Albedo1.rgb

Detail Mask則用於第一套貼圖和第二套貼圖的混合。具體公式以下。

Albedo0.rgb = Albedo0.rgb * (1 - DetailMask.a);

Albedo1.rgb = Albedo1.rgb * DetailMask.a;

AlbedoFinal = Albedo0.rgb  * Albedo1.a + Albedo0.rgb * Albedo1.rgb

Image(29)

更多細節請看官方文檔:http://docs.unity3d.com/Manual/StandardShaderMaterialParameterDetail.html

 

九、Fresnel

Fresnel即爲菲涅爾效果。物體的表面與視線的夾角的不一樣,會致使眼睛看到的從物體反射出來的光線的反射量不一樣。

Image(30)

同一視角下,不一樣光滑程度的物體菲涅爾效果的差異

:目前的Standard Shader並無直接爲你們提供控制菲涅爾反射效果的因子。 而是經過Smoothness因子間接控制。

更多細節請看官方文檔:http://docs.unity3d.com/Manual/StandardShaderFresnel.html

 

來去如風


Unity3D 5.x中對材質系統的改進,進一步促進了Unity3D畫質效果的提高。 而基於PBS的着色系統,也讓美術人員在實現某些高級效果的時候,不用糾結選用哪一個材質更好了。

可是有如下幾點須要注意。

一、雖然Standard提供的參數中,若是不進行設置,Unity3D會進行優化處理,避免額外開銷。 但Standard Shader基於PBS的着色方式,在計算間接光照的時候有大量的開銷。 而且像素着色器的複雜度,也遠遠高於傳統的着色模式。所以,在手機上要慎用。 在PC上,遊戲項目也須要進行必定的優化或者根據主次關係進行材質LOD。

二、Standard Shader僅提供了渲染層級的效果展現。 面對遊戲中的若干需求,仍是須要進行一些定製化。 這就要求咱們須要將Builltin Shaders下載下來,在Standard Shader基礎上進行修改。

三、對於手機項目,建議自已根據項目需求進行材質編寫,去除沒必要要的間接光照計算。

總體參考文檔地址:http://docs.unity3d.com/Manual/shader-StandardShader.html

相關文章
相關標籤/搜索