Unity3D:基于物理著色器(PBS)的材質(zhì)系統(tǒng)

什么是PBS

PBS(Physically Based Shading)在有一些地方也叫PBR(Physically Based Rendering),是一個(gè)基于物體表面材質(zhì)屬性的著色方法。與之前的Blinn-Phong等算法不同。PBS通過對(duì)物體表面的材質(zhì)屬性與周圍光照信息來進(jìn)行著色計(jì)算。PBS著色系統(tǒng)中,一個(gè)物體不僅受到光源的影響,還會(huì)受到周圍環(huán)境的影響。 這會(huì)使得整個(gè)場景更加真實(shí)。
PBS有一個(gè)大前提,就是它能夠滿足光能傳播過程中的能量守衡。能量守衡體現(xiàn)在三個(gè)方面。
1、一個(gè)對(duì)象反射出來的光照信息,不可能超過它接受到的信息。也就是說,全反射是一個(gè)物體的極限。
2、一個(gè)物體越光亮,那么它的顏色信息應(yīng)該越少。(可以看出,refection 和 diffuse 應(yīng)該是一個(gè)插值關(guān)系)
3、一個(gè)物體越平滑,那么它的高亮點(diǎn)會(huì)越小,越亮。
下圖展示了以下事實(shí)
1、下圖中所有的點(diǎn),光照計(jì)算的方式一模一樣
2、粗糙的表面,受到的光照影響后,亮的面積會(huì)多些。
3、越平滑的表面,高亮點(diǎn)越小,越亮。
4、點(diǎn)A的光照信息來自攝像機(jī)方向。
5、點(diǎn)B的光照信息主要來自天空的藍(lán)色。
6、點(diǎn)C的光照信息主要來自地面。

PBS在Unity3D中的體現(xiàn)

在Unity3D 5.X中,默認(rèn)的材質(zhì)均被Standard Shader和Standard (Specular setup) Shader替代。 我們可以認(rèn)為,Standard系列的Shader就是Unity3D中的PBS實(shí)現(xiàn)。下圖便是使用Standard Shader渲染出來的場景效果。

若我們在Unity3D 5.x中新建一個(gè)空場景,你會(huì)發(fā)現(xiàn)有一個(gè)默認(rèn)的天空盒。此時(shí),我們再新建一個(gè)Sphere放在原點(diǎn)。 默認(rèn)情況下,這個(gè)球的材質(zhì)使用的就是Standard Shader.如下圖所示,它受天空盒影響,上下呈現(xiàn)出不同的顏色。假如你更改天空盒的材質(zhì),那么這個(gè)球也會(huì)跟著變化。

Unity3D中PBS具體內(nèi)容

PBS或者說PBR的原理只是一種指導(dǎo)思想,不同的引擎的實(shí)現(xiàn)還是有細(xì)微的區(qū)別。在此,我們先來看看Unity3D中,PBS的實(shí)現(xiàn)細(xì)節(jié)。請先看一張Standard Shader的材質(zhì)參數(shù)圖

左:Standard Shader 右:Standard(Specular steup)
第一眼看過去,熟悉PBR算法的朋友應(yīng)該很容易看清楚Albedo、Specular、NormalMap、Occlusion、Emission等參數(shù)的意思。其余的就多半只能靠猜了。在此我們逐一說明每一個(gè)參數(shù)的含義。

1、Rendering Mode

Rendering Mode用于在非透明和多種透明效果之間切換。
Opaque:默認(rèn)值,實(shí)體渲染。
Cutout:即Alpha test,通過貼圖的Alpha值縷空模型表面。
Transparent:透明效果,如玻璃,半透明塑料等等。
Fade:在這個(gè)模式下,一個(gè)對(duì)象可以實(shí)現(xiàn)淡入淡出效果。
Transparent與Fade模式的區(qū)別
Transparent模式下,反射和高光疊加的顏色不會(huì)進(jìn)行Alpha效果,也就是說,對(duì)于玻璃等效果,反射足夠強(qiáng)的時(shí)候,只能隱約看到后面的內(nèi)容,這也是符合能量守衡的,反射越多,吸收就越少。我們可以忽略細(xì)節(jié),假設(shè)計(jì)算公式像這樣:DiffuseColor * Alpha + RefColor * (1 - Alpha)。
Fade模式下則不會(huì)進(jìn)行這樣的運(yùn)算,它會(huì)簡單粗爆的進(jìn)行Alpha計(jì)算。我們同樣可以用偽代碼表示:DiffuseColor * Alpha + RefColor * Alpha。
由此可以看出,F(xiàn)ade模式下,有較強(qiáng)反射的半透明物體,效果不會(huì)特別好,需要慎用。
更多細(xì)節(jié)請看官方文檔:http://docs.unity3d.com/Manual/StandardShaderMaterialParameterRenderingMode.html

2、Albedo

Albedo與Diffuse的區(qū)別是,Albedo我們認(rèn)為,它是一個(gè)只擁有顏色信息的“平面”貼圖,即不帶任何AO,SHADOW等光影信息。一個(gè)物體的Alpha信息,也是由這個(gè)提供。Albedo + Tint Color構(gòu)成了物體的Base Color顏色值。
下圖是常見的材質(zhì)亮度表

更多細(xì)節(jié)請看官方文檔:http://docs.unity3d.com/Manual/StandardShaderMaterialParameterAlbedoColor.html

3、Metallic & Specluar & Smoothness

前面提到Unity3D提供了Standard和Standard(Specular steup)兩種著色方式。 無論是哪種著色方式,都是控制高光反射結(jié)果的。
Specular通過直接賦與顏色的方式來決定高光反射強(qiáng)度。而Metallic則通過一個(gè)0~1的值,來決定金屬的反射強(qiáng)度。
不管是在metallic還是Specular模式下,一但使用了貼圖來決定高光反射效果。引擎將會(huì)采用貼圖中的值,設(shè)置的Metallic因子,或者Specular Color均會(huì)無效。在這種情況下,二者是等價(jià)的。但是,二者的效果是不一樣的。根據(jù)實(shí)則結(jié)果,Metallic的反射比Specular要多一些。

Metallic為1的情況下,左:Smoothness=0.0、中:Smoothness=0.5、 Smoothness=1.0

常見物體的Specular+Smoothness一起變化時(shí)的情況表

常見物體的Metallic表

Smoothness則決定了一個(gè)物體的光滑呈度。 即使一個(gè)物體表面高光很強(qiáng)烈。若它是一個(gè)不光滑的物體,那么其反射會(huì)呈不規(guī)則的方向分布,會(huì)將光能分散到i同的地方。那么到達(dá)人眼中的反射光就會(huì)少。整體的反射效果就會(huì)變得很弱。

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

常見物體Smoothness表
注:當(dāng)Metallic或者Specular被賦與貼圖后。Smoothness值會(huì)失效。 轉(zhuǎn)而采用Matallic或者Specular貼中的Alpha通道作為Smoothness值。
更多細(xì)節(jié)請看官方文檔:http://docs.unity3d.com/Manual/StandardShaderMetallicVsSpecular.html

4、Normal Map

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

更多細(xì)節(jié)請看官方文檔:http://docs.unity3d.com/Manual/StandardShaderMaterialParameterNormalMap.html

5、Heightmap

Heightmap比NormalMap更上一層樓,NormalMap是通過賦與物體表面更多的法線信息,來造成光照上的細(xì)節(jié)增強(qiáng)。 Normal Map有一個(gè)缺點(diǎn)就是,當(dāng)視線與表面平行時(shí),就失去的法線效果。而Heightmap則直接對(duì)某些頂點(diǎn)進(jìn)行位移。由此也可以看出來,Heightmap的效率開銷會(huì)比Normalmap高,要更據(jù)情況選擇使用。
高度圖是一張灰度圖,白色表示突出,黑色表示凹陷。如下圖所示

更多細(xì)節(jié)請看官方文檔:
下面的圖展示了 左:普通效果 中:NormalMap效果 右:Heightmap效果

更多細(xì)節(jié)請看官方文檔:http://docs.unity3d.com/Manual/StandardShaderMaterialParameterHeightMap.html

6、Occlusion Map

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

Occlusion Map示例

左:無Occlusion Map 右:有Occlusion Map
更多細(xì)節(jié)請看官方文檔:http://docs.unity3d.com/Manual/StandardShaderMaterialParameterOcclusionMap.html

7、Emission

Emission表示一個(gè)物體的自發(fā)光程度。默認(rèn)是純黑,如果為這個(gè)物體賦值了非黑色的材質(zhì)。 那么這個(gè)物體即使在黑暗的場景下,也會(huì)有亮光。 我們可以簡單的認(rèn)為,計(jì)算公式像這樣:FinalColor = Color + Emission
它一般用來做一些顯示器等會(huì)進(jìn)行自發(fā)光的物體材質(zhì),如下圖所示。

更多細(xì)節(jié)請看官方文檔:http://docs.unity3d.com/Manual/StandardShaderMaterialParameterEmission.html

8、Detail Mask & Secondary Maps

Secondary Maps用于在物體的表面增加細(xì)節(jié)。我們可以為一個(gè)物體再賦值一套Albedo和NormalMap. 經(jīng)測試,第一套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

更多細(xì)節(jié)請看官方文檔:http://docs.unity3d.com/Manual/StandardShaderMaterialParameterDetail.html

9、Fresnel

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

同一視角下,不同光滑程度的物體菲涅爾效果的差別
注:目前的Standard Shader并沒有直接為大家提供控制菲涅爾反射效果的因子。 而是通過Smoothness因子間接控制。
更多細(xì)節(jié)請看官方文檔:http://docs.unity3d.com/Manual/StandardShaderFresnel.html

Unity3D 5.x中對(duì)材質(zhì)系統(tǒng)的改進(jìn),進(jìn)一步促進(jìn)了Unity3D畫質(zhì)效果的提升。 而基于PBS的著色系統(tǒng),也讓美術(shù)人員在實(shí)現(xiàn)某些高級(jí)效果的時(shí)候,不用糾結(jié)選用哪個(gè)材質(zhì)更好了。
但是有以下幾點(diǎn)需要注意。
1、雖然Standard提供的參數(shù)中,如果不進(jìn)行設(shè)置,Unity3D會(huì)進(jìn)行優(yōu)化處理,避免額外開銷。 但Standard Shader基于PBS的著色方式,在計(jì)算間接光照的時(shí)候有大量的開銷。 并且像素著色器的復(fù)雜度,也遠(yuǎn)遠(yuǎn)高于傳統(tǒng)的著色模式。因此,在手機(jī)上要慎用。 在PC上,游戲項(xiàng)目也需要進(jìn)行一定的優(yōu)化或者根據(jù)主次關(guān)系進(jìn)行材質(zhì)LOD。
2、Standard Shader僅提供了渲染層級(jí)的效果展示。 面對(duì)游戲中的若干需求,還是需要進(jìn)行一些定制化。 這就要求我們需要將Builltin Shaders下載下來,在Standard Shader基礎(chǔ)上進(jìn)行修改。
3、對(duì)于手機(jī)項(xiàng)目,建議自已根據(jù)項(xiàng)目需求進(jìn)行材質(zhì)編寫,去除不必要的間接光照計(jì)算。
整體參考文檔地址:http://docs.unity3d.com/Manual/shader-StandardShader.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容