地平线:黎明时分中的云渲染技术
最簡單的辦法是采用raymarching,噪聲可以簡單的采用fbm,但是程序感嚴重
兩種噪聲疊加,Perlin-Worley noise,連續感減弱不少
一張基礎的3d紋理,控制大體形狀,一個通道存Perlin - Worley noise,其他三個存不同頻率的Worley noise
一張細節3d紋理,不同頻率的Worley noise
一張2d紋理,curl noise,一般用于流體模擬,可以對云進行distort,增加湍流感
在高度上使用紋理控制密度,可以表現層云,積云,積雨云
此外,在高度上整體設置一個0-1的漸變,因為低空沒云
在云的邊界處減去第二個3d紋理,能夠得到侵蝕效果
小貼士,如果你把基礎云層的Worley noise倒置,會得到一些不錯的形狀。
使用2d紋理去distort第二個3d紋理,可以模擬大氣湍流造成的旋渦扭曲
用一張圖去整體上控制云層,能夠模擬不同天氣下的表現,r通道表示密度,g通道表示降雨量,b為云形。天氣系統通過在游戲過程中進行的模擬來調節這些通道。積雨云直接在頭頂(白色),遠處是規則的積云。我們可以讓藝術家去控制這些模擬。
默認天氣是積云和層云的組合。大部分是層云。
降水量達到0.7將會產生積云。
使用天氣系統來確保地平線上的云層總是有趣的,并在山上分開。
從15000米的距離開始…在玩家周圍35000米半徑范圍內繪制云景
渲染采用Beer’s law
前向散射幾率更大,使用henyey greenstein function來矯正
此外,云層厚的地方in-scattered light更多,導致邊緣會暗一些
加入powder函數,兩個公式疊加去模擬這個效果
注意這個效果和方向光方向及視角方向有關
在有雨的地方增加光吸收率,來使其變暗
游戲賣號平臺最終公式
地球是圓的,所以遠處地平線會和云接在一起
1500米到4000米之間是體積云
海拔4000米以上是alto和卷云。上層云不是很厚,可以通過動畫紋理模擬
由于存在基礎噪聲和細節噪聲,只有在基礎噪聲返回非0時才需要檢測細節噪聲
為了不"錯過",切換到高細節樣本之前要向后退一步
當到達alpha為1時,也就是到最高點了,停止Raymarching
如果連續返回非0,切換到基礎噪聲,直到再次返回0
采樣點數量和視角相關
注意密度會隨高度衰減,也就是上面提到的0-1漸變
但是這樣還不夠
在朝向光的圓錐上采樣6個點模擬陰影,最后一點距離要遠一點
為了提高采樣的性能,當alpha達到0.3時,切換到簡單版本的著色器版本進行采樣。這使著色器速度提高了2倍
6點采樣在低空的貢獻大于比爾定律,而隨著高度上升,又會回到標準的體渲染方式
最后一步,采樣最高層的二維紋理
以上是高空云層的幾種形態
現實中,不同頻率的光線在云中混合,會產生非常美麗的色彩效果。所以我們要根據以下模型為云上色:
- 環境光貢獻隨高度增加而增加
- 直接照明將以陽光顏色為主
- 大氣散射會隨高度增加去替代云層顏色
優化:每幀渲染1/4
前一幀要reproject,如果是邊緣,無法reproject,則從一個低分辨率buffer上采樣
在half res下渲染,最后upscal
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的地平线:黎明时分中的云渲染技术的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Cocos Creator 3D 材质系
- 下一篇: 游戏中子弹的工作原理