34 lines
1.5 KiB
HLSL
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);
|
|
} |