Bloom.hlsl 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. #include "Uniforms.hlsl"
  2. #include "Transform.hlsl"
  3. #include "Samplers.hlsl"
  4. #include "ScreenPos.hlsl"
  5. #ifndef D3D11
  6. // D3D9 uniforms
  7. uniform float cBloomThreshold;
  8. uniform float2 cBloomMix;
  9. uniform float2 cBlurHOffsets;
  10. uniform float2 cBlurHInvSize;
  11. #else
  12. // D3D11 constant buffers
  13. #ifdef COMPILEVS
  14. cbuffer CustomVS : register(b6)
  15. {
  16. float2 cBlurHOffsets;
  17. }
  18. #else
  19. cbuffer CustomPS : register(b6)
  20. {
  21. float cBloomThreshold;
  22. float2 cBloomMix;
  23. float2 cBlurHInvSize;
  24. }
  25. #endif
  26. #endif
  27. static const float offsets[5] = {
  28. 2.0,
  29. 1.0,
  30. 0.0,
  31. -1.0,
  32. -2.0,
  33. };
  34. static const float weights[5] = {
  35. 0.1,
  36. 0.25,
  37. 0.3,
  38. 0.25,
  39. 0.1
  40. };
  41. void VS(float4 iPos : POSITION,
  42. out float2 oTexCoord : TEXCOORD0,
  43. out float2 oScreenPos : TEXCOORD1,
  44. out float4 oPos : OUTPOSITION)
  45. {
  46. float4x3 modelMatrix = iModelMatrix;
  47. float3 worldPos = GetWorldPos(modelMatrix);
  48. oPos = GetClipPos(worldPos);
  49. oTexCoord = GetQuadTexCoord(oPos) + cBlurHOffsets;
  50. oScreenPos = GetScreenPosPreDiv(oPos);
  51. }
  52. void PS(float2 iTexCoord : TEXCOORD0,
  53. float2 iScreenPos : TEXCOORD1,
  54. out float4 oColor : OUTCOLOR0)
  55. {
  56. #ifdef BRIGHT
  57. float3 rgb = Sample2D(DiffMap, iScreenPos).rgb;
  58. oColor = float4((rgb - cBloomThreshold) / (1.0 - cBloomThreshold), 1.0);
  59. #endif
  60. #ifdef BLURH
  61. float3 rgb = 0.0;
  62. for (int i = 0; i < 5; ++i)
  63. rgb += Sample2D(DiffMap, iTexCoord + (float2(offsets[i], 0.0)) * cBlurHInvSize).rgb * weights[i];
  64. oColor = float4(rgb, 1.0);
  65. #endif
  66. #ifdef BLURV
  67. float3 rgb = 0.0;
  68. for (int i = 0; i < 5; ++i)
  69. rgb += Sample2D(DiffMap, iTexCoord + (float2(0.0, offsets[i])) * cBlurHInvSize).rgb * weights[i];
  70. oColor = float4(rgb, 1.0);
  71. #endif
  72. #ifdef COMBINE
  73. float3 original = Sample2D(DiffMap, iScreenPos).rgb * cBloomMix.x;
  74. float3 bloom = Sample2D(NormalMap, iTexCoord).rgb * cBloomMix.y;
  75. // Prevent oversaturation
  76. original *= saturate(1.0 - bloom);
  77. oColor = float4(original + bloom, 1.0);
  78. #endif
  79. }