Files
Fishing2/Packages/com.jbooth.microverse/Scripts/Editor/Resources/MicroVerseHeightSeamer.compute
2025-06-09 23:23:13 +08:00

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;
}