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