You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

55 lines
1.9 KiB

#include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Common.hlsl"
#include "Packages/com.unity.render-pipelines.core/Runtime/Lighting/ProbeVolume/ProbeVolume.hlsl"
#include "Packages/com.unity.render-pipelines.core/Runtime/Lighting/ProbeVolume/ProbeReferenceVolume.Streaming.cs.hlsl"
ByteAddressBuffer _ScratchBuffer;
float4 UintToFloat4(uint input)
{
float4 result;
result.x = (input & 0x000000FF) / 255.0f;
result.y = ((input >> 8) & 0x000000FF) / 255.0f;
result.z = ((input >> 16) & 0x000000FF) / 255.0f;
result.w = ((input >> 24) & 0x000000FF) / 255.0f;
return result;
}
// Extract two FP16 rgba values encoded in an uint4
void ExtractFP16(uint4 input, out float4 value0, out float4 value1)
{
float4 temp0 = f16tof32(input);
float4 temp1 = f16tof32(input >> 16);
value0.xz = temp0.xy;
value0.yw = temp1.xy;
value1.xz = temp0.zw;
value1.yw = temp1.zw;
}
void ExtractByte(uint4 input, out float4 value0, out float4 value1, out float4 value2, out float4 value3)
{
value0 = UintToFloat4(input.x);
value1 = UintToFloat4(input.y);
value2 = UintToFloat4(input.z);
value3 = UintToFloat4(input.w);
}
void ExtractByte(uint input, out float4 value)
{
value = UintToFloat4(input);
}
void getProbeLocationAndOffsets(uint chunkIndex, uint chunkProbeIndex, out float3 baseProbe, out float3 loc, out float3 probe1Offset, out float3 probe2Offset, out float3 probe3Offset)
{
baseProbe.z = chunkProbeIndex / _ProbeCountInChunkSlice;
uint indexInSlice = chunkProbeIndex - baseProbe.z * _ProbeCountInChunkSlice;
baseProbe.y = indexInSlice / _ProbeCountInChunkLine;
baseProbe.x = indexInSlice - baseProbe.y * _ProbeCountInChunkLine;
uint3 dstChunk = _ScratchBuffer.Load4(chunkIndex * 16).xyz; // *16 because 4 int per chunk.
loc = dstChunk + baseProbe;
probe1Offset = uint3(1, 0, 0);
probe2Offset = uint3(2, 0, 0);
probe3Offset = uint3(3, 0, 0);
}