一種基於高度的材質混合方式 地表篇

2021-07-25 13:14:14 字數 2176 閱讀 9962

發現守望先鋒的地表很特別,不像是在unity那裡畫的那種材質間線性過渡,找了一下資料,感覺像是根據高度在shader中計算的

這是一種簡單的近似方法

高度混合的原理:

簡單的線性混合是這樣的,就是mix/lerp一下,但是這樣很醜,不自然

得到高度圖只取最大高度的材質就是這種結果,像是泥土平鋪在石頭上

還有一種是最需要的,材質間的過渡

這就需要有乙個2x2的float資訊來先畫分好材質間的大分水嶺,同樣是進行上面的取最大值。(細節高度與分水嶺高度相加)

分水嶺高度實現情況有下面兩種:

a.繪製法

1.如果想要地形材質受美工控制,就像守望這樣的,可以由美工繪製,位置也確定的,可以在繪製地表的shader中直接加這種高度材質混合

b.隨機法

1.找一張或多張的四方連續雜訊貼圖做混合,多張重複性會減少(兩張就好,一張大的一張小一些的,密度不同,再在shader中進行一下uv的縮放與偏移,增加多樣性,減少重複)||或者乾脆shader計算出噪音(手遊要考慮消耗,pc主機可以使用)

google一下seamless noisetexture

先大體混合出材質劃分即分水嶺高度

2.再用高度混合

float4 c = tex2d(_maintex, i.uv_maintex);

float4 c2 = tex2d(_maintex2, i.uv_maintex);

float noise = tex2d(_noisetex, i.uv_noisetex).x;

float noise2 = tex2d(_noisetex2, i.uv_noisetex2).x;

noise =saturate(pow(saturate(noise*noise2*1.5),_ni)*_ni*_ns);

float height = saturate(tex2d(_heighttex, i.uv_maintex).y*_h1);

float height2 =saturate( tex2d(_heighttex2, i.uv_maintex).y*_h2);

float depth = _di;

float ma = max((1-noise) + height, noise +height2) - depth;

float b1 = max((1-noise) + height - ma, 0);

float b2 = max(noise + height2 - ma, 0);

c = (c * b1 + c2 * b2) / (b1 + b2);

此處的noise即是分水嶺高度

貼圖是在網上隨便找了兩張無縫貼圖,高度圖是找了個工具用貼圖轉了高度圖

多材質也可以使用這種方法,可以多加高度圖進行計算,也可以把近似相同高度的材質共用乙個高度

參考:

----wolf96  2016/12/21

一種基於地理資訊的服務方式

一種基於地理資訊的服務方式 我們的口號是 讓生活更美好。代表我要給 取的名字。我們的宗旨是 以數字地圖的方式提供給使用者關於現代城市的精緻生活的資訊。某天,你在網路上搜尋到杭州有一家小飯店的烤魚很好吃,有人提供給你關於這家飯店的位置的文字資訊,並且你打算去吃。但真正到動身的時候卻發現,由於對於有些街...

一種新的布局方式

通過王老師的講解,讓我認識到了自己的不足,也學到了一種新的布局方式 主要是宋老師 恐嚇 我們,說如果我們去面試,面試官如果要我們使用這種方式,我們怎麼辦,怎麼解決,我才想深入了解下的 王老師提出了兩個問題,她自己也為我們解答了,現在需要我們自己去總結,化為自己的知識。第乙個問題 為什麼會兩個內聯標籤...

換一種工作的方式

畢業5年多了,婚也結了,也想要個baby了,但是我和我拿個美麗的 太太還是隔著一段長長的鐵路,前些天晚上打 她說家裡出了很多的蟲子,一種不隻名的那種,害的嚇壞了。心裡很是難過,我想該結束這段分離的日子了。昨天和leader進行了一次商談,最後同意我改變一下工作的方式,可以長時間在home裡開發,每週...