基於網格的無限大戰爭迷霧實現方案

2021-09-02 17:47:26 字數 829 閱讀 2249

戰爭迷霧常見的實現方案是使用一張貼圖儲存地圖上每個格仔有無迷霧,然後對這樣貼圖進行模糊後作為mask,可以實現邊緣柔和漸變的迷霧效果。如果地圖大小是固定的,那麼使用採用固定的一張或多張貼圖的方案,覆蓋整個地圖。但是如果地圖是無限大的,那麼隨著攝像機的移動,這些貼圖必然要比較頻繁地更新,而每次更新都需要重新進行模糊,根據實際情況效能不一定好。這裡給出乙個基於網格的無限大戰爭迷霧實現方案。

首先建立乙個mesh,裡面有n個跟地圖上的格仔形狀大小都一樣的迷霧塊,數量足夠鋪滿整個螢幕。這個mesh就像是個物件池,物件就是裡面的每個迷霧塊。

當攝像機移動時,移出螢幕的迷霧塊被**,填補到螢幕的另一側。攝像機移動的時候只需要改變mesh裡相應的迷霧塊的頂點位置即可。通過這種方式不管地圖有多大,都能保證有足夠的迷霧擋在攝像機前。

為了實現邊緣柔和漸變的效果,需要把迷霧塊的頂點在vertex shader裡沿法線往外延伸一段距離,延伸的距離越大,alpha越低。alpha值可以通過取樣類似於這樣的貼圖獲得:

要得到比較好的柔和漸變效果的話,向外延伸的距離就要比較大,這樣會導致螢幕重繪率加大。解決辦法是分兩次繪製。第一次繪製不延伸的mesh,完全不透明,zwrite=on。第二次繪製向外延伸的mesh,啟用alpha blend,ztest=less, zwrite=off,mesh往攝像機前方的方向移動一點點,以避免zfighting。這樣完全不透明的部分就不會重複繪製。

另外這個方案要做迷霧消散動畫也比較簡單,只要在vertex shader裡面操作頂點座標即可。例如簡單的迷霧塊平移的消散動畫,只要外部把移動方向和移動速度傳給shader,然後vertex shader裡v.vertex += _movedir * _movespeed * _time.x即可。

無限大小矩陣的設計

這一久在學習動力學,遇到乙個很棘手的問題 接觸力的計算,即為當乙個物體的某一點與另乙個問題的相對速度 vr v1 v2 點積 n 為0 或接近0時所受到的力,需要使用隨意行 和 列的矩陣 我稱它為 bigmatrix 而微軟的dxsdk的數學庫並沒有提供大於 4x4的矩陣,所以決定自己寫乙個,經過一...

為什麼理想電流源的等效內阻是無限大

電流源和電 壓 源是兩個概念,你可以把電流源想象成乙個只提供電流,不接負載時電壓為0的源.這正好和電源相反,電源是乙個只提供電壓,不接負載的時候電流為0的源.理想的電流源是不管這個電流源接多少負載,電流始終不變.這就和理想的電壓源不管接多少負載電壓始終不變乙個道理.我們知道乙個電池串接乙個燈泡可以發...

m 公升的水倒入 n 個相同的容器 容器無限大

要把 m 公升的水倒入 n 個相同的容器中 假設容器足夠大 允許有的容器是空的,問共有多少種不同的倒法?用k表示 5,1,1和1,5,1和 1,1,5 是同一種倒法。input 第一行是測試資料的數目 x 0 x 20 以下每行均包含二個整數m和n,以空格分開。1 m,n 10。output 對輸入...