99 lines
No EOL
2.6 KiB
Text
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));
|
|
;
|
|
} |