RWTexture2D paradeBucketR : register(u1); RWTexture2D paradeBucketG : register(u2); RWTexture2D paradeBucketB : register(u3); RWTexture2D paradeBucketA : register(u4); RWTexture2D vectorScopeBucket : register(u5); RWTexture2D paradeOut : register(u6); RWTexture2D 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); }