#pragma kernel CSLeft #pragma kernel CSRight #pragma kernel CSUp #pragma kernel CSDown RWTexture2D _TerrainIndex; RWTexture2D _TerrainWeight; Texture2D _NeighborIndex; Texture2D _NeighborWeight; StructuredBuffer _Mapping; int _Width; int _Height; float4 Map(float4 i) { uint4 index = (uint4)round(i * 32.0); i.x = _Mapping[index.x]; i.y = _Mapping[index.y]; i.z = _Mapping[index.z]; i.w = _Mapping[index.w]; return i/32.0; } [numthreads(512,1,1)] void CSLeft (uint3 id : SV_DispatchThreadID) { _TerrainIndex[int2(0,id.x)] = Map(_NeighborIndex[int2(_Width, id.x)]); _TerrainWeight[int2(0,id.x)] = _NeighborWeight[int2(_Width, id.x)]; } [numthreads(512,1,1)] void CSRight (uint3 id : SV_DispatchThreadID) { _TerrainIndex[int2(_Width,id.x)] = Map(_NeighborIndex[int2(0, id.x)]); _TerrainWeight[int2(_Width,id.x)] = _NeighborWeight[int2(0, id.x)]; } [numthreads(512,1,1)] void CSDown (uint3 id : SV_DispatchThreadID) { _TerrainIndex[int2(id.x, 0)] = Map(_NeighborIndex[int2(id.x, _Height)]); _TerrainWeight[int2(id.x, 0)] = _NeighborWeight[int2(id.x, _Height)]; } [numthreads(512,1,1)] void CSUp (uint3 id : SV_DispatchThreadID) { _TerrainIndex[int2(id.x, _Height)] = Map(_NeighborIndex[int2(id.x, 0)]); _TerrainWeight[int2(id.x, _Height)] = _NeighborWeight[int2(id.x, 0)]; }