Files
bluflame/aquarium/src/intro/framework/shaders/paradeVectorscopeSpread.hlsl
2026-04-18 22:31:51 +02:00

34 lines
1.5 KiB
HLSL

RWTexture2D<uint> paradeBucketR : register(u1);
RWTexture2D<uint> paradeBucketG : register(u2);
RWTexture2D<uint> paradeBucketB : register(u3);
RWTexture2D<uint> paradeBucketA : register(u4);
RWTexture2D<uint> vectorScopeBucket : register(u5);
RWTexture2D<uint4> paradeOut : register(u6);
RWTexture2D<uint4> vectorScopeOut : register(u7);
[numthreads(16, 16, 1)]
void main( uint3 id : SV_DispatchThreadID )
{
uint4 parade = uint4(
255.0f * log(1.0f + paradeBucketR[id.xy]) / log(1.0f + paradeBucketR[uint2(256, 0)]),
255.0f * log(1.0f + paradeBucketG[id.xy]) / log(1.0f + paradeBucketG[uint2(256, 0)]),
255.0f * log(1.0f + paradeBucketB[id.xy]) / log(1.0f + paradeBucketB[uint2(256, 0)]),
255.0f * log(1.0f + paradeBucketA[id.xy]) / log(1.0f + paradeBucketA[uint2(256, 0)]));
paradeOut[id.xy + uint2(0 * 256, 0)] = parade.w;
paradeOut[id.xy + uint2(3 * 256, 0)] = parade.z * float4(1, 0, 0, 1);
paradeOut[id.xy + uint2(2 * 256, 0)] = parade.y * float4(0, 1, 0, 1);
paradeOut[id.xy + uint2(1 * 256, 0)] = parade.x * float4(0, 0, 1, 1);
float luminance = 1.0f - max(0.0f, min(1.0f, log(1.0f + vectorScopeBucket[id.xy]) / log(1.0f + vectorScopeBucket[uint2(256, 0)])));
float2 f = (id.xy - 128.0f) / 128.0f;
if (length(f) > 1)
luminance = 0.0f;
float2 uv = ((id.xy / 128.0f) - 1.0f) * float2(0.436f, 0.615f);
float3 _a = float3(0, -0.3950f, 2.03252f);
float3 _b = float3(1.14025f, -0.581f, 0);
uint3 rgb = luminance * 255.0f * min(1, max(0, (0.5f + uv.x * _a + uv.y * _b)));
vectorScopeOut[id.xy] = uint4(rgb.zyx, 255);
}