BloomHDR.hlsl 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. #include "Uniforms.hlsl"
  2. #include "Transform.hlsl"
  3. #include "Samplers.hlsl"
  4. #include "ScreenPos.hlsl"
  5. #include "PostProcess.hlsl"
  6. uniform float cBloomHDRThreshold;
  7. uniform float2 cBloomHDRBlurDir;
  8. uniform float cBloomHDRBlurRadius;
  9. uniform float cBloomHDRBlurSigma;
  10. uniform float2 cBloomHDRMix;
  11. uniform float2 cBright2Offsets;
  12. uniform float2 cBright4Offsets;
  13. uniform float2 cBright8Offsets;
  14. uniform float2 cBright16Offsets;
  15. uniform float2 cBright2InvSize;
  16. uniform float2 cBright4InvSize;
  17. uniform float2 cBright8InvSize;
  18. uniform float2 cBright16InvSize;
  19. static const int BlurKernelSize = 5;
  20. void VS(float4 iPos : POSITION,
  21. out float4 oPos : POSITION,
  22. out float2 oTexCoord : TEXCOORD0,
  23. out float2 oScreenPos : TEXCOORD1)
  24. {
  25. float4x3 modelMatrix = iModelMatrix;
  26. float3 worldPos = GetWorldPos(modelMatrix);
  27. oPos = GetClipPos(worldPos);
  28. oTexCoord = GetQuadTexCoord(oPos);
  29. #ifdef BLUR2
  30. oTexCoord = GetQuadTexCoord(oPos) + cBright2Offsets;
  31. #endif
  32. #ifdef BLUR4
  33. oTexCoord = GetQuadTexCoord(oPos) + cBright4Offsets;
  34. #endif
  35. #ifdef BLUR8
  36. oTexCoord = GetQuadTexCoord(oPos) + cBright8Offsets;
  37. #endif
  38. #ifdef BLUR16
  39. oTexCoord = GetQuadTexCoord(oPos) + cBright16Offsets;
  40. #endif
  41. #ifdef COMBINE2
  42. oTexCoord = GetQuadTexCoord(oPos) + cBright2Offsets;
  43. #endif
  44. #ifdef COMBINE4
  45. oTexCoord = GetQuadTexCoord(oPos) + cBright4Offsets;
  46. #endif
  47. #ifdef COMBINE8
  48. oTexCoord = GetQuadTexCoord(oPos) + cBright8Offsets;
  49. #endif
  50. #ifdef COMBINE16
  51. oTexCoord = GetQuadTexCoord(oPos) + cBright16Offsets;
  52. #endif
  53. oScreenPos = GetScreenPosPreDiv(oPos);
  54. }
  55. void PS(float2 iTexCoord : TEXCOORD0,
  56. float2 iScreenPos : TEXCOORD1,
  57. out float4 oColor : COLOR0)
  58. {
  59. #ifdef BRIGHT
  60. float3 color = tex2D(sDiffMap, iScreenPos).rgb;
  61. oColor = float4(max(color - cBloomHDRThreshold, 0.0), 1.0);
  62. #endif
  63. #ifdef BLUR16
  64. oColor = GaussianBlur(BlurKernelSize, cBloomHDRBlurDir, cBright16InvSize * cBloomHDRBlurRadius, cBloomHDRBlurSigma, sDiffMap, iTexCoord);
  65. #endif
  66. #ifdef BLUR8
  67. oColor = GaussianBlur(BlurKernelSize, cBloomHDRBlurDir, cBright8InvSize * cBloomHDRBlurRadius, cBloomHDRBlurSigma, sDiffMap, iTexCoord);
  68. #endif
  69. #ifdef BLUR4
  70. oColor = GaussianBlur(BlurKernelSize, cBloomHDRBlurDir, cBright4InvSize * cBloomHDRBlurRadius, cBloomHDRBlurSigma, sDiffMap, iTexCoord);
  71. #endif
  72. #ifdef BLUR2
  73. oColor = GaussianBlur(BlurKernelSize, cBloomHDRBlurDir, cBright2InvSize * cBloomHDRBlurRadius, cBloomHDRBlurSigma, sDiffMap, iTexCoord);
  74. #endif
  75. #ifdef COMBINE16
  76. oColor = tex2D(sDiffMap, iScreenPos) + tex2D(sNormalMap, iTexCoord);
  77. #endif
  78. #ifdef COMBINE8
  79. oColor = tex2D(sDiffMap, iScreenPos) + tex2D(sNormalMap, iTexCoord);
  80. #endif
  81. #ifdef COMBINE4
  82. oColor = tex2D(sDiffMap, iScreenPos) + tex2D(sNormalMap, iTexCoord);
  83. #endif
  84. #ifdef COMBINE2
  85. float3 color = tex2D(sDiffMap, iScreenPos).rgb * cBloomHDRMix.x;
  86. float3 bloom = tex2D(sNormalMap, iTexCoord).rgb * cBloomHDRMix.y;
  87. oColor = float4(color + bloom, 1.0);
  88. #endif
  89. }