中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

unity3d中如何使用屏幕空間改善shadowmap漏光

發布時間:2022-01-13 16:06:41 來源:億速云 閱讀:180 作者:小新 欄目:大數據

這篇文章主要介紹了unity3d中如何使用屏幕空間改善shadowmap漏光,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

前因

自從實時陰影發展到了shadowmap時代,漏光和 Shadow Acne就形影不離。除非你可以無腦極大提升shadowmap精度 或可以做到很短距離的實時陰影 否則并不好解決這常見問題。如下圖

unity3d中如何使用屏幕空間改善shadowmap漏光  
bias調大就漏光 ,bias調小就自陰影出錯

動態bias方案

我早年在網易引擎部面試的時候 總監大佬問過我這問題。我當年很得意,告訴他我自創并實現過demo的做法,計算shadowmap 不僅寫入深度 也寫入 投影表面的世界法線(或投影表面的SV_PrimitiveID 這個更省空間),這樣繪制陰影的時候就能根據自己表面的世界法線 是否與投影表面接近來判斷 是否自己投影給自己 如果是bias算的大些 否則算的小些。因為既然bias 固定數值都不行,那就實現動態bias,這樣邏輯上就成立。大佬冷靜的說,shadowmap本身就精度不足 你同尺寸數據也不能提升太多。(實際測試確實提升不太大),他接著小心翼翼地問道:你就不能在屏幕空間想想辦法?當年的我除了ssao模仿的實現一次 根本沒靈活掌握各種其他SS技巧而且也沒經驗,于是答不出來。但是看得出他的小心翼翼 仿佛再問一句就會泄露做法一般,我就印象深刻的記下:這個點可能很容易想出來有時間了就去嘗試。現在剛好是時候了。

屏幕空間改善漏光方案

我想到屏幕空間上一個像素可以根據深度圖去檢查,他往光線方向上短距離內是否有遮擋物,如果有那么應該有陰影。于是我選擇把bias調大,如上圖左圖,然后想辦法去把漏的光補上。沒有選自陰影出錯然后 把陰影消去是因為,投影者不一定就在附近所以不能簡單的消去陰影。但是 漏光處如果有投影一定是在附近所以更好查詢。先看效果很不錯。

unity3d中如何使用屏幕空間改善shadowmap漏光  

 
屏幕空間優化后 比2個bias最好效果結合一起還好  


這么大的提升 代碼量居然只要6句 采樣的也是已有的深度圖性能基本沒問題.代碼直接帶詳細說明。簡單測試函數就寫在了 LightingMyStandard_GI 內,根據實際項目可放屏幕陰影計算shader,任何地方只要能獲取世界坐標就可以

void LightingMyStandard_GI( SurfaceOutputStandard s, UnityGIInput data,inout UnityGI gi)    {              //當前位置 往光線方向移動0.1米 定位虛擬投影物 看看那里是否真有物體 如果有就算遮擋      float4 casterWpos =float4( data.worldPos +  data.light.dir * 0.1f,1);       //轉到裁剪空間      float4 casterNdc = mul(UNITY_MATRIX_VP, casterWpos);                        //轉到ndc空間      casterNdc /= casterNdc.w;                       //轉到采樣坐標去看看這里實際屏幕深度多少      float2 samplePos = casterNdc.xy * 0.5 + 0.5;                        //獲得虛擬投影物位置實際深度      float depth = SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, samplePos);             // 如果虛擬投影物 被遮擋 就算真有遮擋物 陰影為黑色 //實際項目 最好轉到 Linear01Depth(depth) * _ProjectionParams.z 比較真實距離 和 有效范圍內才算遮擋                              if (depth > casterNdc.z) data.atten = 0;                           //以下為函數原內容                         #if defined(UNITY_PASS_DEFERRED) && UNITY_ENABLE_REFLECTION_BUFFERS         gi = UnityGlobalIllumination(data, s.Occlusion, s.Normal);                        #else      Unity_GlossyEnvironmentData g = UnityGlossyEnvironmentSetup(s.Smoothness, data.worldViewDir, s.Normal, lerp(unity_ColorSpaceDielectricSpec.rgb, s.Albedo, s.Metallic));        gi = UnityGlobalIllumination(data, s.Occlusion, s.Normal, g);                        #endif          }

如果虛擬投影物 被遮擋 就算真有遮擋物 陰影為黑色 ,實際項目 最好轉到 Linear01Depth(depth) * _ProjectionParams.z 比較真實距離 和 有效范圍內才算遮擋

感謝你能夠認真閱讀完這篇文章,希望小編分享的“unity3d中如何使用屏幕空間改善shadowmap漏光”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,更多相關知識等著你來學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

萨迦县| 乐亭县| 烟台市| 共和县| 大关县| 福州市| 新泰市| 乌兰察布市| 万山特区| 高邮市| 若尔盖县| 图们市| 常熟市| 平凉市| 阿荣旗| 登封市| 巫溪县| 洛隆县| 绥江县| 腾冲县| 吴忠市| 贡嘎县| 毕节市| 平乐县| 庆云县| 法库县| 抚远县| 隆尧县| 搜索| 镇原县| 蓝山县| 辽中县| 宜良县| 通许县| 武功县| 平顶山市| 扎赉特旗| 若尔盖县| 通化市| 南漳县| 陇川县|