GPU Gems1 - 13 使用遮挡区间映射产生模糊的阴影(Generating Soft Shadows Using Occlusion Interval Maps)
這章介紹了一種渲染軟陰影的技術,稱為遮擋區間映射(Occlusion Interval Maps),能夠正確地在靜態場景中渲染出光源沿著預定路徑移動時產生的模糊陰影。之所以叫遮擋區間映射,是因為此算法使用紋理貼圖來存儲這種光源可見、而本身被遮擋的區間。
對于需現實的加油站的Demo,文章一開始本打算使用一種預計算的可見度技術,例如球諧光照(Spherical Harmonic Lighting [Sloan et al.2002])來實現,但可惜的是無法達到目的,因為球諧光照適用的是非常低頻的光照,不適用于像太陽那樣小面積的光源。所以后來才開發出遮擋區間映射這種新的預計算可見度的技術,它能夠支持實時太陽照射的軟陰影。通過把問題簡化為在固定軌道上的線性光源來達到目的。
?該文章采用的算法原理是將影子表達為一個可見度函數,當點在影子中是,它的值時0,當它被照明的時候,它的值是1.在渲染的時候,計算這個可見度函數,再講結果乘以一個著色計算,得出最終的顏色值。具體看見度函數原理如一下兩個圖:第一個圖是隨時間便宜,可見性值的變化,第二個圖是第一個圖模糊后的結果。
?
?
具體實現是將可見性函數的上升部分和下降部分分布存儲在兩張紋理中,之后在shader中進行計算。?
half softshadow(sampler2D riseTexture,sampler2D fallTexture,float2 texCoord,half intervalStart,half intervalEnd,half intervalInverseWidth) {half4 rise = h4tex2D (riseTexture, texCoord);half4 fall = h4tex2D (fallTexture, texCoord);half4 minTerm = min (fall, intervalEnd);half4 maxTerm = max (rise, intervalStart);return dot (intervalInverseWidth, saturate (minTerm - maxTerm)); }需要注意,遮擋區間映射(Occlusion IntervalMaps)技術有一些局限性,只對沿固定軌道傳播的單條光線的靜態場景適用。這意味著它對人物和其他動態物體的陰影無效。但是其適用于靜態戶外場景中的陰影渲染。并且此技術因為遮擋區間映射對每個通道需要8位的進度,紋理壓縮將導致視覺效果失真。因此,必須禁用紋理壓縮,從而增加了紋理用量。
使用遮擋區間映射(Occlusion Interval Maps)技術,通過損失一定運行性能來獲得在靜態場景上實時運行的軟陰影算法。遮擋區間映射(Occlusion Interval Maps)可以用作靜態光照貼圖的替代品,從而實現動態效果,可以得到從日出到日落光照明變化的動態效果。如下圖。
?
?
?
?
?
?
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的GPU Gems1 - 13 使用遮挡区间映射产生模糊的阴影(Generating Soft Shadows Using Occlusion Interval Maps)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 单因素方差分析(oneway ANOVA
- 下一篇: readLine