#pragma kernel CSLeft #pragma kernel CSRight #pragma kernel CSUp #pragma kernel CSDown RWTexture2D _Terrain; RWTexture2D _Neighbor; int _Width; int _Height; #define API_HAS_GUARANTEED_R16_SUPPORT !(SHADER_API_VULKAN || SHADER_API_GLES || SHADER_API_GLES3) float4 PackHeightmap(float height) { #if (API_HAS_GUARANTEED_R16_SUPPORT) return height; #else uint a = (uint)(65535.0f * height); return float4((a >> 0) & 0xFF, (a >> 8) & 0xFF, 0, 0) / 255.0f; #endif } float UnpackHeightmap(float4 height) { #if (API_HAS_GUARANTEED_R16_SUPPORT) return height.r; #else return (height.r + height.g * 256.0f) / 257.0f; // (255.0f * height.r + 255.0f * 256.0f * height.g) / 65535.0f #endif } [numthreads(512,1,1)] void CSLeft (uint3 id : SV_DispatchThreadID) { float v = UnpackHeightmap(_Neighbor[int2(_Width, id.x)]) + UnpackHeightmap(_Terrain[int2(0,id.x)]); float4 pk = PackHeightmap(v*0.5); _Terrain[int2(0,id.x)] = pk; _Neighbor[int2(_Width, id.x)] = pk; } [numthreads(512,1,1)] void CSRight (uint3 id : SV_DispatchThreadID) { float v = UnpackHeightmap(_Neighbor[int2(0, id.x)]) + UnpackHeightmap(_Terrain[int2(_Width,id.x)]); float4 pk = PackHeightmap(v*0.5); _Terrain[int2(_Width,id.x)] = pk; _Neighbor[int2(0, id.x)] = pk; } [numthreads(512,1,1)] void CSDown (uint3 id : SV_DispatchThreadID) { float v = UnpackHeightmap(_Neighbor[int2(id.x, _Height)]) + UnpackHeightmap(_Terrain[int2(id.x, 0)]); float4 pk = PackHeightmap(v*0.5); _Terrain[int2(id.x, 0)] = pk; _Neighbor[int2(id.x, _Height)] = pk; } [numthreads(512,1,1)] void CSUp (uint3 id : SV_DispatchThreadID) { float v = UnpackHeightmap(_Neighbor[int2(id.x, 0)]) + UnpackHeightmap(_Terrain[int2(id.x, _Height)]); float4 pk = PackHeightmap(v*0.5); _Neighbor[int2(id.x, 0)] = pk; _Terrain[int2(id.x, _Height)] = pk; }