Files
Cielonos/Assets/PotaToon/Shaders/OIT/OitUtils.hlsl
SoulliesOfficial 7c1cb7e8e1 Temp FIN
2025-12-14 18:40:00 -05:00

43 lines
1.2 KiB
HLSL

#ifndef OIT_UTILS_INCLUDED
#define OIT_UTILS_INCLUDED
// Unity's HLSL seems not to support dynamic array size, so we can only set this before compilation
#define MAX_SORTED_PIXELS 8
#define POW_2_24 16777216
//https://github.com/GameTechDev/AOIT-Update/blob/master/OIT_DX11/AOIT%20Technique/AOIT.hlsl
// UnpackRGBA takes a uint value and converts it to a float4
float4 UnpackRGBA(uint packedInput)
{
float4 unpackedOutput;
uint4 p = uint4((packedInput & 0xFFUL),
(packedInput >> 8UL) & 0xFFUL,
(packedInput >> 16UL) & 0xFFUL,
(packedInput >> 24UL));
unpackedOutput = ((float4)p) / 255;
return unpackedOutput;
}
// PackRGBA takes a float4 value and packs it into a UINT (8 bits / float)
uint PackRGBA(float4 unpackedInput)
{
uint4 u = (uint4)(saturate(unpackedInput) * 255 + 0.5);
uint packedOutput = (u.w << 24UL) | (u.z << 16UL) | (u.y << 8UL) | u.x;
return packedOutput;
}
float UnpackDepth(uint uDepthSampleIdx) {
return (float)(uDepthSampleIdx >> 8UL) / (POW_2_24 - 1);
}
uint UnpackSampleIdx(uint uDepthSampleIdx) {
return uDepthSampleIdx & 0xFFUL;
}
uint PackDepthSampleIdx(float depth, uint uSampleIdx) {
uint d = (uint)(saturate(depth) * (POW_2_24 - 1));
return d << 8UL | uSampleIdx;
}
#endif // OIT_UTILS_INCLUDED