shadow acne(陰影失真)和peter panning(陰影懸浮)

原文鏈接:https://blog.csdn.net/lawest/article/details/106364935

 

總結下來就是:

因爲深度貼圖的分辨率有限,導致多個像素點採樣1個深度,導致陰影失真(acne)

1個解決方法是添加bias,也就是給像素的z加上偏移,這個方法會導致陰影懸浮(peter panning)

最好的解決陰影失真的方法是cull font,只渲背面的深度

可參考:https://zhuanlan.zhihu.com/p/45653702

---------------------

在之前學習陰影映射時看的是這篇文章https://learnopengl-cn.github.io/05 Advanced Lighting/03 Shadows/01 Shadow Mapping/。

但是裏面有兩個點當時是雲裏霧裏,現在重新學習如何實現柔和邊緣陰影時有又遇到些問題,就是在陰影映射是出現的shadow acne(陰影失真)和peter panning(陰影懸浮),

陰影失真如圖:

出現這個問題的原因原文根本就沒講清楚,給出的圖和解釋也十分誤導人,而且給出的解決方法也十分含糊,當時看的的懷疑人生,懷疑自己的智商,在終於搞懂之後我那個氣啊,當時就把桌子給掀了。

會出現陰影失真的根本原因是所生成的深度貼圖的分辨率是有限的,就會造成在fragment位置處取深度圖中的值發生採樣就會出現問題,這裏我引用知乎用戶王十一的回答用的圖(懶得自己畫)。如圖:以四個格子爲四個fragment爲例,由於深度圖分辨率有限四個格子會採樣同一個深度值(由於紋理參數設置的是臨近GL_NEAREST,設置線性也會有這個問題)。

preview

如圖假設採樣這個四方格的正中心,假設這個深度值爲10。

preview

這四個fragment分別取名a,b,c,d,由於光源的位置會導致求得的四個距離會不一樣,先求a到光源的距離假設爲9.8<10,b到光源的距離是11.6 >10,c到光源的距離12.1>10,c到光源的距離9.5<10,。就會導致a和d亮,b和c暗,他們本來應該都是亮的纔對。然後整個光源視椎體下各個片段都會出現這個問題,就會出現上面的明暗交錯的條紋。

preview

 

原文說的解決方法是將fragment到光源的距離適當的縮小bias,就會避免這個問題,但是這種解決方法會帶來另外一個問題,那就是peter panning(陰影懸浮),bias越大懸浮的越厲害。

如果解決一個問題的方法會帶來另外一個問題我們爲什麼要用呢?

   glCullFace(GL_FRONT);
使用正面剔除來生成深度貼圖可以解決正面的陰影失真,也就是說只有物體背面纔會產生深度信息,向地板這種只有一個面的物體不會產生深度信息,這也是合理的,但是這也只能在封閉的物體上這麼做,但是即使這樣物體的背面還是會出現陰影失真,這時候可以用glPolygonOffset來解決這個問題,將深度圖中的值稍微減小一點而不是片段到光源的距離,兩者結合就可以解決這個問題。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章