發現守望先鋒的地表很特別,不像是在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裡開發,每週...