////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 PreResult; RWTexture3D Result; SamplerState my_point_clamp_sampler; float3 ClipmapWorldPosition; float ClipmapScale; float3 VolumeWorldSize; float3 VolumeWorldPosition; Texture3D 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)); ; }