【技術(shù)美術(shù)百人計(jì)劃】實(shí)時(shí)陰影渲染
基于圖片的實(shí)時(shí)陰影
平面投影陰影:
根據(jù)光的方向,把物體的每個(gè)頂點(diǎn)投影到平面地面上。
數(shù)學(xué)原理:相似三角形
缺點(diǎn):只能投射到平面上,物體必須在光與平面之間。

投影陰影
為每個(gè)陰影投影體設(shè)置一個(gè)相機(jī)
把陰影投影體渲染到陰影紋理中
渲染陰影接收者,與陰影紋理進(jìn)行混合

投影陰影——unity實(shí)現(xiàn)方法
Projector組件:
可以設(shè)置一個(gè)參數(shù)生成一個(gè)視椎體
Projector會(huì)使用提供給他的材質(zhì),繪制所有在他視椎體內(nèi)的物體
用RT(RenderTexture)生成陰影映射圖,把陰影投影體繪制到陰影紋理
給Projector設(shè)置物體和陰影映射圖混合的材質(zhì)

陰影映射:
左側(cè)陰影中的位置,在右側(cè)光照角度一定是不可見(jiàn)的,這就是陰影映射


Unity中的屏幕空間陰影映射:
渲染屏幕空間的深度貼圖
從光源方向渲染陰影映射
在屏幕空間做一次陰影收集計(jì)算(ShadowCollector),這次計(jì)算會(huì)得到一張屏幕空間陰影紋理
在繪制物體時(shí),用物體的屏幕坐標(biāo)uv,采樣3中得到的屏幕空間陰影貼圖

陰影映射的優(yōu)化
陰影映射自陰影問(wèn)題
由于陰影映射分辨率有限,離散的采樣點(diǎn)以及數(shù)值上的偏差可能造成不正確的自陰影,也被成為Z-Fighting或者陰影粉刺(SurfaceAcne)
解決方法:當(dāng)比較深度時(shí),為避免表面自陰影,設(shè)置一個(gè)容錯(cuò)閾值,如:深度偏移(DepthBias)、法線偏移(NormalBias)
但當(dāng)深度偏移設(shè)置過(guò)大,會(huì)導(dǎo)致漏光現(xiàn)象,即陰影與投影者發(fā)生脫節(jié),也叫作PeterPanning問(wèn)題。
深度偏移:增加深度偏移會(huì)使該像素向光源靠近
法線偏移:沿表面法線方向向外偏移
偏移單位是陰影映射的紋素
在ShadowReceive計(jì)算階段,逐像素進(jìn)行
只會(huì)在陰影深度測(cè)試時(shí)使用,不會(huì)影響真實(shí)場(chǎng)景


陰影映射走樣問(wèn)題
以信號(hào)重建的過(guò)程來(lái)審視陰影映射
初始采樣:渲染陰影映射
重采樣:從攝像機(jī)視角對(duì)采樣信號(hào)(陰影映射)重采樣。

透視走樣的原因及其解決方案
陰影映射在世界空間均勻分配
視椎體內(nèi)物體經(jīng)過(guò)透視投影后,近大遠(yuǎn)小,近平面和遠(yuǎn)平面的像素一樣
靠近觀察點(diǎn)的元素所用到采樣點(diǎn)明顯減少
這種誤差稱之為透視走樣

級(jí)聯(lián)陰影映射
透視走樣最有效解決方案
把視椎體分為多個(gè)子視椎體
為每個(gè)子視椎體計(jì)算獨(dú)立的相等大小的陰影映射

重采樣的原因及其解決方案
陰影映射是一張動(dòng)態(tài)生成的紋理
濾波--紋理采樣誤差的解決方案
濾波:
圖像處理中,通過(guò)濾波強(qiáng)調(diào)一些特征或者去除圖像中一些不需要的部分
濾波是一個(gè)鄰域操作算子,利用給定像素周?chē)南袼刂禌Q定此像素最終輸出值。
陰影的濾波:
使用一部分陰影映射采樣點(diǎn)來(lái)計(jì)算某個(gè)指定View采樣點(diǎn)的最終陰影結(jié)果的方法。
PCF濾波
從光的方向生成陰影映射
從view視角渲染場(chǎng)景,用陰影映射進(jìn)行深度測(cè)試
該點(diǎn)通過(guò)深度測(cè)試,取該像素周?chē)付ù笮。V波核)的范圍,計(jì)算他們的可見(jiàn)平均值作為輸出
