(HDRP)全局光照技术初探(一)-光照模式与阴影技术
談及光照模式與陰影,不可避免的需要知道:全局光照陰影技術從何而來?為什么需要這些技術?
什么是全局光照?
全局照明(GI)是一個系統,用于模擬光從表面反射到其他表面(間接光)的方式,而不是僅限于直接從光源(直接光)照射到表面的光。 全局光照 = 直接光照 + 間接光照
真實的陰影?
在現實生活中,由于光線會被物體表面無數次吸收、反彈直至衰減(此內容我在PBR流程原理中已經詳細介紹過),陰影是“柔和的”“真實的”。保證畫面真實并提供實時運算是所有人理想的追求,然而現實比較骨感,實時光照陰影只模擬光源第一次從發射到物體表面產生的畫面,對于光線反彈一概不管(想問光線追蹤的自己去搜,別杠)。這導致了一個問題——陰影暗部死黑一片,你以為畫面這樣?
事實上是這樣
為什么同樣有高光和陰影,游戲畫面就成了這樣?還是上面的問題,實時光照目前的技術并不能模擬光的多次反彈,由于只提供直接光照,暗部銜接僵硬。那些“天生才有地中海發型的家伙”發明了靠「光柵化」來渲染物體的技術。好比將我們的電腦屏幕當做一個攝像機鏡頭,而「光柵化」技術就是將游戲中的 3D 場景和光影轉化為 2D 平面上的像素點,而你所看到的反射、陰影等效果,實則是靠后期加工或是其它預烘焙技術(預渲染)模擬出來的。對于Lighting烘焙及LightMap等技術的講解,請參照我另外一篇文章——(HDRP)全局光照技術初探(二)-光照烘焙技術
(實時光線追蹤在這里不做探討)
提供間接光照的本質是采用類似離線渲染的方式預計算出一套只記錄光照信息貼圖(對第二套UV采樣),并在片元著色階段進行相應的計算。
知道了光照局限性和陰影原因,我們來談談HDRP中提供了哪些陰影以及對應的光照模式。
陰影的種類
光源投射陰影
屏幕空間陰影
Contact Shadow(接觸陰影) Miro Shadow(微陰影) Ambient Occlusion(環境光遮蔽)光源投射陰影
影響陰影的兩種光照模式
除Realtime模式外,HDRP支持的投射混合陰影產生主要由兩種光照模式影響:
在Baked Indirect模式下,所有的物體將會接受實時陰影信息,烘焙的光照貼圖不會包含陰影信息。由于某些光照是烘焙的(因此是預先計算的),在運行時更改任何參數都會導致在組合實時光照和預計算光照時出現不一致的結果。無論是 Baked Indirect 還是 Shadowmask ,直接光照的影響就像實時光源一樣,可以實時更改光源的顏色、強度甚至變換等參數。但是,烘焙值是預先計算的,在運行時無法更改。
——
在ShadowMask 模式下,不同的物體會接受不同的陰影信息
1.當shadowmask的光源被設置為Distance-Shadowmask時
| 接受實時光照信息 | 接受實時光信息 |
| 通過LightProbe接受烘焙的間接光照信息 | 通過光照貼圖接受間接光照信息 |
| 接受動態的實時陰影信息,在Distance范圍內,以ShadowMap陰影的方式 | 接受動態的實時陰影信息,在Distance范圍內,以ShadowMap陰影的方式 |
| 接受靜態物體陰影信息,在Distance范圍內,以ShadowMap陰影的方式 | 接受靜態物體陰影信息,在Distance范圍內,以ShadowMap陰影的方式 |
| 在Distance范圍外,以LightProbe獲取靜態物體的烘焙陰影信息 | 在Distance范圍外,以光照貼圖的方式獲取靜態物體的烘焙陰影信息 |
2.當shadowmask的光源被設置為Shadowmask時
| 接受實時光照信息 | 接受實時光照信息 |
| 通過LightProbe接受烘焙的間接光照信息 | 通過光照貼圖接受間接光照信息 |
| 接受動態的實時陰影信息,在Distance范圍內,以ShadowMap陰影的方式 | 接受動態的實時陰影信息,在Distance范圍內,以ShadowMap陰影的方式 |
| 接受靜態物體陰影信息,在Distance范圍內,以ShadowMap陰影的方式 | 接受靜態物體陰影信息,在Distance范圍內,以ShadowMap陰影的方式 |
| 在Distance范圍外,以LightProbe獲取靜態物體的烘焙陰影信息,不受Distance影響 | 以光照貼圖的方式獲取靜態物體的烘焙陰影信息,不受Distance影響 |
——
shadowmask與Distance-Shadowmask對比
| 占用更高的GPU性能 | 占用更高的Memory |
| 陰影效果較好 | 提高Shadow Resolution可以獲得好的陰影效果 |
| Disatance內的所有物體陰影都是實時計算的 | 只有動態物體的陰影是實時計算的 |
什么是Shadow Mapping
Shadow Mapping是一種著名的基于圖像空間的陰影實現方法,上面提到的ShadowMap是通過這種方法生成的深度紋理
Shadow Mapping我總結了一下基本原理:
當然也可以通過對比“燈光到片元的距離”與“相機到片元的距離”
Shadow Mapping技術產生的問題及“緩解”辦法
上面我有說到Shadow Mapping通過對比深度值(或距離)的方式判斷陰影區域,由于ShadowMap的紋理分辨率問題,使得N個像素只能對應一個ShadowMap上的采樣點(一個像素或由多個片元組成),片元計算會認為對應區域屬于陰影區域,由此產生黑白相間的條紋自陰影,并且當燈光與物體表面的夾角越小,Shadow Acne自陰影區域越明顯。下面我們看看解決Shadow Acne的方法:
再談深度值對比,深度值說的是不夠嚴謹的,圖形學中稱之為“深度場”,這一大片場地記錄著深度信息。投影的產生是由于在投影區域與光源之間存在遮擋像素,該像素到光源的深度總是小于該像素到攝像機的深度,通過該方法判斷為投影區域并由此產生Shadow Acne的問題。那么有沒有什么方法緩解這種問題呢?使得像素到光源的深度總是足夠小于該像素到攝像機的深度,這種足夠使得我們引入了一個可變的偏移常量-Bias,Bias能夠盡量減小燈光到片元距離場的值,由此Shadow Acne自陰影的產生會明顯減少
皆大歡喜了嗎?并沒有,Bias的方法產生另外一個問題——在交界處丟失一定區域的陰影(當然丟失陰影說法不太正確,而是陰影的一種走樣現象)
為了解決丟失陰影的問題,HDRP中還引入了一種基于屏幕空間的Contact Shadow接觸陰影的方法。Contact Shadow為彌補Shadow Mapping的技術缺陷
Percentage Closer Filtering反走樣技術 (PCF)
以下內容待更新2022/5/12
總結
以上是生活随笔為你收集整理的(HDRP)全局光照技术初探(一)-光照模式与阴影技术的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【时间序列分析】01.时间序列与平稳序列
- 下一篇: java乘法代码_java九九乘法表代码