ToneMapCS.hlsl 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. // RUN: %dxc -E main -T cs_6_0 %s | FileCheck %s
  2. // CHECK: threadId
  3. //
  4. // Copyright (c) Microsoft. All rights reserved.
  5. // This code is licensed under the MIT License (MIT).
  6. // THIS CODE IS PROVIDED *AS IS* WITHOUT WARRANTY OF
  7. // ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING ANY
  8. // IMPLIED WARRANTIES OF FITNESS FOR A PARTICULAR
  9. // PURPOSE, MERCHANTABILITY, OR NON-INFRINGEMENT.
  10. //
  11. // Developed by Minigraph
  12. //
  13. // Author: James Stanard
  14. //
  15. #include "ShaderUtility.hlsli"
  16. #include "PostEffectsRS.hlsli"
  17. Texture2D<float3> SrcColor : register( t0 );
  18. StructuredBuffer<float> Exposure : register( t1 );
  19. Texture2D<float3> Bloom : register( t2 );
  20. RWTexture2D<float3> DstColor : register( u0 );
  21. RWTexture2D<float> OutLuma : register( u1 );
  22. SamplerState LinearSampler : register( s0 );
  23. cbuffer ConstantBuffer_x : register( b0 )
  24. {
  25. float2 g_RcpBufferDim;
  26. float g_BloomStrength;
  27. float g_LumaGamma;
  28. };
  29. [RootSignature(PostEffects_RootSig)]
  30. [numthreads( 8, 8, 1 )]
  31. void main( uint3 DTid : SV_DispatchThreadID )
  32. {
  33. float2 TexCoord = (DTid.xy + 0.5) * g_RcpBufferDim;
  34. // Load HDR and bloom
  35. float3 hdrColor = SrcColor[DTid.xy] + g_BloomStrength * Bloom.SampleLevel( LinearSampler, TexCoord, 0 );
  36. // Tone map to LDR. ToneMap() reads and writes the [0, 1] space. Exposure[2] = Exposure / PeakIntensity,
  37. // which normalizes [0, Peak] to [0, 1].
  38. #if PRESERVE_HUE
  39. float3 ldrColor = ToneMap2( hdrColor * Exposure[2] );
  40. #else
  41. float3 ldrColor = ToneMap( hdrColor * Exposure[2] );
  42. #endif
  43. DstColor[DTid.xy] = ldrColor;
  44. OutLuma[DTid.xy] = RGBToLogLuminance( ldrColor, g_LumaGamma );
  45. }