文章出處

Image(1)

關于《Thinking in Unity3D》


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

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

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

 

什么是PBS


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

PBS有一個大前提,就是它能夠滿足光能傳播過程中的能量守衡。能量守衡體現在三個方面。

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

2、一個物體越光亮,那么它的顏色信息應該越少。(可以看出,refection 和 diffuse 應該是一個插值關系)

3、一個物體越平滑,那么它的高亮點會越小,越亮。

下圖展示了以下事實

1、下圖中所有的點,光照計算的方式一模一樣

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

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

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

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

6、點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等參數的意思。其余的就多半只能靠猜了。在此我們逐一說明每一個參數的含義。

 

1、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

 

2、Albedo

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

下圖是常見的材質亮度表

Image(15)

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

 

3、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.5、 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


4、Normal Map

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

Image(23)

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

 

5、Heightmap

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

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

Image(24)

更多細節請看官方文檔:

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

Image(25)

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

 

6、Occlusion Map

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

Image(26)

Occlusion Map示例

 

Image(27)

左:無Occlusion Map  右:有Occlusion Map

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

 

7、Emission

Emission表示一個物體的自發光程度。默認是純黑,如果為這個物體賦值了非黑色的材質。 那么這個物體即使在黑暗的場景下,也會有亮光。 我們可以簡單的認為,計算公式像這樣:FinalColor = Color + Emission

它一般用來做一些顯示器等會進行自發光的物體材質,如下圖所示。

Image(28)

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

 

8、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

 

9、Fresnel

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

Image(30)

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

:目前的Standard Shader并沒有直接為大家提供控制菲涅爾反射效果的因子。 而是通過Smoothness因子間接控制。

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

 

來去如風


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

但是有以下幾點需要注意。

1、雖然Standard提供的參數中,如果不進行設置,Unity3D會進行優化處理,避免額外開銷。 但Standard Shader基于PBS的著色方式,在計算間接光照的時候有大量的開銷。 并且像素著色器的復雜度,也遠遠高于傳統的著色模式。因此,在手機上要慎用。 在PC上,游戲項目也需要進行一定的優化或者根據主次關系進行材質LOD。

2、Standard Shader僅提供了渲染層級的效果展示。 面對游戲中的若干需求,還是需要進行一些定制化。 這就要求我們需要將Builltin Shaders下載下來,在Standard Shader基礎上進行修改。

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

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


文章列表




Avast logo

Avast 防毒軟體已檢查此封電子郵件的病毒。
www.avast.com


arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()