70 lines
1.9 KiB
Plaintext
70 lines
1.9 KiB
Plaintext
|
|
#pragma kernel CSLeft
|
|
#pragma kernel CSRight
|
|
#pragma kernel CSUp
|
|
#pragma kernel CSDown
|
|
|
|
RWTexture2D<float4> _Terrain;
|
|
RWTexture2D<float4> _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;
|
|
}
|
|
|