關于《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的光照信息主要來自地面。
PBS在Unity3D中的體現
在Unity3D 5.X中,默認的材質均被Standard Shader和Standard (Specular setup) Shader替代。 我們可以認為,Standard系列的Shader就是Unity3D中的PBS實現。下圖便是使用Standard Shader渲染出來的場景效果。
若我們在Unity3D 5.x中新建一個空場景,你會發現有一個默認的天空盒。此時,我們再新建一個Sphere放在原點。 默認情況下,這個球的材質使用的就是Standard Shader.如下圖所示,它受天空盒影響,上下呈現出不同的顏色。假如你更改天空盒的材質,那么這個球也會跟著變化。
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:在這個模式下,一個對象可以實現淡入淡出效果。
Transparent與Fade模式的區別
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顏色值。
下圖是常見的材質亮度表
更多細節請看官方文檔: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一起變化時的情況表
Smoothness則決定了一個物體的光滑呈度。 即使一個物體表面高光很強烈。若它是一個不光滑的物體,那么其反射會呈不規則的方向分布,會將光能分散到i同的地方。那么到達人眼中的反射光就會少。整體的反射效果就會變得很弱。
物體的由粗糙到光滑的光線反射情況
常見物體Smoothness表
注:當Metallic或者Specular被賦與貼圖后。Smoothness值會失效。 轉而采用Matallic或者Specular貼中的Alpha通道作為Smoothness值。
更多細節請看官方文檔:http://docs.unity3d.com/Manual/StandardShaderMetallicVsSpecular.html
4、Normal Map
Normal Map是Bump Mapping的一種特例化。 它主要是通過貼圖為光照計算時提供更細節的法線信息。使物體低模物體表面具有高度的細節效果。如下圖所示
更多細節請看官方文檔:http://docs.unity3d.com/Manual/StandardShaderMaterialParameterNormalMap.html
5、Heightmap
Heightmap比NormalMap更上一層樓,NormalMap是通過賦與物體表面更多的法線信息,來造成光照上的細節增強。 Normal Map有一個缺點就是,當視線與表面平行時,就失去的法線效果。而Heightmap則直接對某些頂點進行位移。由此也可以看出來,Heightmap的效率開銷會比Normalmap高,要更據情況選擇使用。
高度圖是一張灰度圖,白色表示突出,黑色表示凹陷。如下圖所示
更多細節請看官方文檔:
下面的圖展示了 左:普通效果 中:NormalMap效果 右:Heightmap效果
更多細節請看官方文檔:http://docs.unity3d.com/Manual/StandardShaderMaterialParameterHeightMap.html
6、Occlusion Map
Occlusion Map用于決定一個模型各部位受到間隔光照的影響情況。 間隔光照一般來自于Ambient和環境反射。
Occlusion Map示例
左:無Occlusion Map 右:有Occlusion Map
更多細節請看官方文檔:http://docs.unity3d.com/Manual/StandardShaderMaterialParameterOcclusionMap.html
7、Emission
Emission表示一個物體的自發光程度。默認是純黑,如果為這個物體賦值了非黑色的材質。 那么這個物體即使在黑暗的場景下,也會有亮光。 我們可以簡單的認為,計算公式像這樣:FinalColor = Color + Emission
它一般用來做一些顯示器等會進行自發光的物體材質,如下圖所示。
更多細節請看官方文檔: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
更多細節請看官方文檔:http://docs.unity3d.com/Manual/StandardShaderMaterialParameterDetail.html
9、Fresnel
Fresnel即為菲涅爾效果。物體的表面與視線的夾角的不同,會導致眼睛看到的從物體反射出來的光線的反射量不同。
同一視角下,不同光滑程度的物體菲涅爾效果的差別
注:目前的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
文章列表