WuhuIslandTesting/Library/PackageCache/com.unity.render-pipelines.universal@8148.0.7-4/Shaders/Volumetrics/ClipMapGenerator.compute
2025-01-07 02:06:59 +01:00

99 lines
No EOL
2.6 KiB
Text

////This generates a combined clipmap so we don't have to sample every volume map every frame////
//TODO: Add cascades or tapper
#pragma kernel ClipMapGen
#pragma kernel ClipMapClear
#pragma kernel ClipMapHeight
Texture3D<float4> PreResult;
RWTexture3D<float4> Result;
SamplerState my_point_clamp_sampler;
float3 ClipmapWorldPosition;
float ClipmapScale;
float3 VolumeWorldSize;
float3 VolumeWorldPosition;
Texture3D<float4> VolumeMap;
SamplerState trilinear_clamp_sampler;
float VolumeDensity;
shared float _GlobalExtinction;
float4 clearColor;
[numthreads(4, 4, 4)]
void ClipMapClear(uint3 id : SV_DispatchThreadID)
{
Result[id.xyz] = float4(0, 0, 0, 0);
//Result[id.xyz] = clearColor;
}
[numthreads(4,4,4)]
void ClipMapGen (uint3 id : SV_DispatchThreadID)
{
//uint count, stride;
float3 ClipRes = float3(0,0,0);
Result.GetDimensions(ClipRes.x, ClipRes.y, ClipRes.z);
float4 UVW;
UVW.xyz = (id + 0.5) / ClipRes.xyz; //0-1 scaling
UVW.w = 1;
float4 WorldCoord = UVW * ClipmapScale + ClipmapWorldPosition.xyzz;
float3 MapUVW = (WorldCoord.xyz - VolumeWorldPosition) / VolumeWorldSize;
//TODO: Make sampling calculations run or not if they are inside or out of the clipped area
float ClipUVW =
step(MapUVW.x, 1) * step(0, MapUVW.x) *
step(MapUVW.y, 1) * step(0, MapUVW.y) *
step(MapUVW.z, 1) * step(0, MapUVW.z);
//float tempden = distance(WorldCoord.xyz,0) > 3 ? 0:10 ;
float3 VolRes = float3(0, 0, 0);
VolumeMap.GetDimensions(VolRes.x, VolRes.y, VolRes.z);
//float3 VolPixSize = VolumeWorldSize / VolRes;
//float3 ClipPixSize = ClipmapScale / ClipRes;
// Move this math into the C# side, no reason to do this per pixel!
float3 VolPixPerClipPix = (ClipmapScale * VolRes) / (VolumeWorldSize * ClipRes); // ClipPixSize / VolPixSize;
float maxScale = max(VolPixPerClipPix.x, max(VolPixPerClipPix.y, VolPixPerClipPix.z));
float mip = log2(maxScale);
//Sample baked volume and clip it off to its area
//Doing max of the two results to account for overlaps
float4 colors = max(PreResult[id.xyz], VolumeMap.SampleLevel(trilinear_clamp_sampler, MapUVW, mip) * ClipUVW);
colors.a = 0;
Result[id.xyz] = colors;
}
[numthreads(4, 4, 4)]
void MediapGen(uint3 id : SV_DispatchThreadID)
{
}
[numthreads(4, 4, 4)]
void ClipMapHeight(uint3 id : SV_DispatchThreadID)
{
//uint count, stride;
float4 UVW = float4(0,0,0,0);
Result.GetDimensions(UVW.x, UVW.y, UVW.z);
UVW.xyz = (id + 0.5) / UVW.xyz; //0-1 scaling
UVW.w = 1;
float4 WorldCoord = UVW * ClipmapScale + ClipmapWorldPosition.xyzz;
//float heightDens = WorldCoord.y > 0 ? 0:1;
float heightDens = _GlobalExtinction;
Result[id.xyz] = max(PreResult[id.xyz].rgba,float4(0,0,0,heightDens));
;
}