讓移動(dòng)平臺(tái)也能享受UE4物理著色
來(lái)源:
52vr |
責(zé)任編輯:傳說(shuō)的落葉 |
發(fā)布時(shí)間: 2019-06-04 08:21 | 瀏覽量:
在演示后,我進(jìn)行了一些小小的變更。我刪除了Disney的"hotness"對(duì)幾何方面的修改。根據(jù)Eric Heitz的 最新成果,我可能會(huì)再次改進(jìn)它,在陰影和蒙板間添加關(guān)聯(lián)。但我沒(méi)有在其中加入孔洞(Cavity)參數(shù)。我們?cè)朐谘菔厩斑M(jìn)行此項(xiàng)變更,但發(fā)現(xiàn)使用了可控非傳導(dǎo)性高光反射率。因此我們轉(zhuǎn)而使用Disney模型中定義的高光參數(shù)。
我特別想談到的是這個(gè)著色模型是如何適用于移動(dòng)平臺(tái)的。如您需要查看虛幻引擎4的移動(dòng)平臺(tái)渲染器,請(qǐng)查閱GDC的這些幻燈片。關(guān)于其使用的示例,請(qǐng)查看禪技術(shù)演示,這是在iPad Air上以4xMSAA 1080p在30hz下運(yùn)行的。您也可以查看 靈魂技術(shù)演示。
在一開(kāi)始我們的主要目標(biāo)是想使用和高端PC相同的內(nèi)容創(chuàng)建工作流程。我們還想要支持對(duì)相同資源的渲染,這樣當(dāng)我們?cè)谝苿?dòng)設(shè)備上運(yùn)行它時(shí),所有內(nèi)容都盡我們所能地類似于采用高端渲染器所產(chǎn)生的效果。這意味著要完成許多細(xì)節(jié),比如將gamma值調(diào)整正確,但同時(shí)也意味著我們需要讓著色器也以相同方式運(yùn)作,這樣材質(zhì)能在PC,游戲機(jī)平臺(tái)和移動(dòng)設(shè)備上也以相同方式運(yùn)行。要完成這個(gè)目標(biāo),我們支持在我談話中解釋過(guò)的相同材質(zhì)模型。而底色(BaseColor)、金屬色(Metallic)、高光(Specular)、粗糙度(Roughness)這些參數(shù)以完全同樣的方式產(chǎn)生作用。
很明顯,在移動(dòng)設(shè)備上的運(yùn)算能力要弱得多,所以我們不可能對(duì)每個(gè)光照都計(jì)算其BRDF(雙向反射分布函數(shù))。實(shí)際上,我們僅僅支持動(dòng)態(tài)運(yùn)算的單方向日光。對(duì)陰影進(jìn)行預(yù)計(jì)算并將其作為貼圖空間中帶符號(hào)的距離場(chǎng)來(lái)存儲(chǔ)。所有其它光照都被烘焙到光照貼圖中。光照貼圖使用類似HDR編碼的SH定向表示來(lái)作為高端渲染器,但會(huì)根據(jù)不具有獨(dú)立的、非關(guān)聯(lián)的、alpha壓縮的特點(diǎn)的PVRTC進(jìn)行更高質(zhì)量的壓縮。類似于高端渲染器,預(yù)計(jì)算的高光使用預(yù)卷積的環(huán)境貼圖。使用的是完全相同的預(yù)卷積,并且它們根據(jù)光照貼圖進(jìn)行類似的標(biāo)準(zhǔn)化和縮放。對(duì)于移動(dòng)平臺(tái)來(lái)說(shuō),每個(gè)像素僅提取一張環(huán)境貼圖。
環(huán)境 BRDF
有趣的一點(diǎn)是我們?nèi)绾斡?jì)算環(huán)境BRDF,對(duì)于高端平臺(tái)來(lái)說(shuō),它是使用Monte Carlo整合來(lái)進(jìn)行預(yù)計(jì)算的,并存儲(chǔ)于二維LUT中。對(duì)移動(dòng)平臺(tái)的硬件來(lái)說(shuō),依賴于貼圖提取非常消耗系統(tǒng)資源,更糟的是,OpenGL ES2的8個(gè)采樣器的限制造成了極大的使用限制。使用這個(gè)LUT來(lái)處理采樣器是完全不行的。我轉(zhuǎn)而基于Dimitar Lazarov的作品來(lái)作出了類似的解析版本。形式類似,但根據(jù)我們的著色模型和粗糙度參數(shù)進(jìn)行了調(diào)整。函數(shù)列于下方:
[代碼]:
01 |
<font size= "3" >half3 EnvBRDFApprox( half3 SpecularColor, half Roughness, half NoV ) |
05 |
const half4 c0 = { -1, -0.0275, -0.572, 0.022 }; |
07 |
const half4 c1 = { 1, 0.0425, 1.04, -0.04 }; |
09 |
half4 r = Roughness * c0 + c1; |
11 |
half a004 = min( r.x * r.x, exp2( -9.28 * NoV ) ) * r.x + r.y; |
13 |
half2 AB = half2( -1.04, 1.04 ) * a004 + r.zw; |
15 |
return SpecularColor * AB.x + AB.y; |
這表示我們對(duì)基于光照的貼圖具有較合理的Fresnel值和粗糙度。
在高端平臺(tái)上使用的ENVBRDF
在移動(dòng)平臺(tái)上使用的ENVBRDF近似貼圖
我們檢測(cè)到金屬色和高光材質(zhì)輸出并不連接在一起(這意味著使用了默認(rèn)值)。傳統(tǒng)的非金屬材質(zhì)就是這樣的。本例中我們可以進(jìn)一步優(yōu)化函數(shù)。
[代碼]:
01 |
<font size= "3" >half EnvBRDFApproxNonmetal( half Roughness, half NoV ) |
07 |
const half2 c0 = { -1, -0.0275 }; |
09 |
const half2 c1 = { 1, 0.0425 }; |
11 |
half2 r = Roughness * c0 + c1; |
13 |
return min( r.x * r.x, exp2( -9.28 * NoV ) ) * r.x + r.y; |
我們進(jìn)行類似的優(yōu)化來(lái)完全避免使用環(huán)境貼圖。一些游戲?yàn)椴划a(chǎn)生高光而進(jìn)行優(yōu)化,但并不減少性能消耗。我們轉(zhuǎn)而使用"完全粗糙"的標(biāo)識(shí),它將Roughness(粗糙度)設(shè)置為1并優(yōu)化常量因數(shù)。我們可以看到如下內(nèi)容:
[代碼]:
1 |
<font size= "3" >EnvBRDFApprox( SpecularColor, 1, 1 ) == SpecularColor * 0.4524 - 0.0024</font> |
在此處我進(jìn)行了簡(jiǎn)化:
[代碼]:
1 |
<font size= "3" >DiffuseColor += SpecularColor * 0.45; |
我們僅對(duì)真正需要額外系統(tǒng)性能來(lái)處理的選定對(duì)象使用此標(biāo)識(shí)。
定向光源(DIRECTIONAL LIGHT)
我最后要談到的是如何計(jì)算日光。我之前談到了太陽(yáng)是唯一進(jìn)行動(dòng)態(tài)光照計(jì)算的。不幸的是,即使對(duì)于單個(gè)光照來(lái)說(shuō),全高端著色模型依然占用了過(guò)多的系統(tǒng)性能。而我們使用EnvBRDF來(lái)以類似于預(yù)集成的方式對(duì)其一部分進(jìn)行計(jì)算。我們同時(shí)還有用來(lái)對(duì)環(huán)境貼圖取樣的反射向量。我們的想法是對(duì)用于預(yù)過(guò)濾環(huán)境貼圖的徑向?qū)ΨQ葉片進(jìn)行分析性評(píng)估,并隨后將其結(jié)果與EnvBRDF值相乘,正如我們對(duì)IBL所進(jìn)行的運(yùn)算那樣。將此視為對(duì)比入射光方向來(lái)分析性地整合葉片,而不是我們使用環(huán)境貼圖所做的數(shù)值整合。
首先,我們使用Blinn來(lái)替代GGX NDF。我們隨后使用徑向的Phong葉片來(lái)近似處理Blinn。
Phong進(jìn)一步使用球形高斯來(lái)近似處理(approximated with a Spherical Gaussian):
這讓我們獲得了最終的優(yōu)化形式:
[代碼]:
01 |
<font size= "3" >half D_Approx( half Roughness, half RoL ) |
05 |
half a = Roughness * Roughness; |
09 |
float rcp_a2 = rcp(a2); |
13 |
half c = 0.72134752 * rcp_a2 + 0.39674113; |
15 |
return rcp_a2 * exp2( c * RoL - c ); |
這里 1π 被分解為光照顏色。
最后我們獲得了占用系統(tǒng)性能極少而又合理的著色模型。高光保存了能量,在入射余角處較為靈敏,并且能同時(shí)與基于解析和圖像的光源一起運(yùn)行。即使是移動(dòng)平臺(tái)的硬件也能夠基于物理來(lái)運(yùn)行了。