分割為mesh之後的地形shader編寫 1

2021-10-06 00:23:54 字數 1982 閱讀 8297

1、如下圖,我們的地形是640x640大小

2、我們要在這個地形上使用乙個紋理進行填充

這個layer的設定tiling settings是320x320

那麼也就是地板磚的大小是320x320的,而我們的地形是640x640的,那麼需要幾塊地板磚呢?

(640/320)*(640/320)=4

對的,就是4塊,我們看上圖左,就可以看到四個金泰熙思密達的頭像了。

如果我們把這個地板磚改為640x640的大小,那麼,我們只需要一塊地板磚:

不出我們所料。

ok,我們知道了,這個tiling settings的意思之後,就需要在**中取得:

public class splatinfo

terrainlayer[

] layers = m_terraindata.terrainlayers;

splatinfo[

] m_splatinfos = new splatinfo[layers.length]

;for

(int i =

0; i < layers.length;

++i)

m_splatinfos[i]

.texturepath = texpath;

m_splatinfos[i]

.sizex = layers[i]

.tilesize.x;

}

然後就是編寫自己的地形shader,然後用這個tilesize了。

關於地形的shader,還有大地形的處理,我會單獨抽出巨大篇幅來說明,這裡只是簡單的介紹titlesize的使用。

右圖是unity原始的地形,左圖是我們分隔之後的地形mesh,這裡分隔單位是一塊128x128的,地形是640x640,所以是分割成為5x5=25個塊。

然後我們的shader是這樣的:

shader "unlit/terrainshader"

} subshader

pass

;struct v2f

; sampler2d _splattex0;

float range;

fixed4 frag (v2f i)

: sv_target

endcg}}}

這行**:

float2 uv0 = i.worldposition.xz * (1.0f / 320);

是注意了是地板磚大小的導數,變換uv。

上面基本沒用問題了,但是,但是,如果我們移動了整體的mesh,如下:

可以看到,這個左圖的mesh,人物頭像偏移了,這是為啥呢?因為我們使用的是頂點的世界座標進行取樣貼圖的。

而我們原始地形是放在零點位置:

而我們的匯出的mesh,我們整體移動到乙個地方,所以此時uv會有偏移,取樣自然會偏移。有什麼辦法可以正確解決呢?

答案是移動地板磚大小的整數倍,如下:

這樣就正確了。

我們也可以更改貼圖的offset來實現,但是這裡取了討巧的方法。

到此結束了嘍,我們下篇部落格見。

MFC 字串分割為陣列

include std vectorsplitcstring cstring strsource,cstring ch 引數1 待分割的字串 引數2 作為分割標誌的字串,比如以 號為標誌分割字串,就填 std vectorsplitcstring cstring strsource,cstring ...

shell將字串分割為陣列

找到有兩種方法 使用內建的分割符ifsstr 192.168.31.65 old ifs ifs 儲存舊的分隔符 ifs array str ifs old ifs 將ifs恢復成原來的 for i in doecho i done以上 輸出 0 192 1 168 2 31 3 65 使用字串替換...

將陣列分割為幾個等長度的子陣列(使用slice)

先了解一下slice方法 slice 1.定義 slice 可從已有陣列中擷取返回指定的元素,形成乙個新的陣列 語法 arrayobject.slice start,end 引數 描述 start 必需。規定從何處開始選取。如果是負數,那麼它規定從陣列尾部開始算起的位置。也就是說,1 指最後乙個元素...