PPGaussianBlur.bsl 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. #include "$ENGINE$\PPBase.bslinc"
  2. technique PPGaussianBlur
  3. {
  4. mixin PPBase;
  5. code
  6. {
  7. [internal]
  8. cbuffer Input
  9. {
  10. float4 gSampleOffsets[(MAX_NUM_SAMPLES + 1) / 2];
  11. float4 gSampleWeights[(MAX_NUM_SAMPLES + 3) / 4];
  12. int gNumSamples;
  13. }
  14. SamplerState gInputSamp;
  15. Texture2D gInputTex;
  16. float4 fsmain(VStoFS input) : SV_Target0
  17. {
  18. // Note: Consider adding a version of this shader with unrolled loop for small number of samples
  19. float4 output = 0;
  20. int idx = 0;
  21. for(; idx < (gNumSamples / 4); idx++)
  22. {
  23. {
  24. float2 uv = input.uv0 + gSampleOffsets[idx * 2 + 0].xy;
  25. output += gInputTex.SampleLevel(gInputSamp, uv, 0) * gSampleWeights[idx].x;
  26. }
  27. {
  28. float2 uv = input.uv0 + gSampleOffsets[idx * 2 + 0].zw;
  29. output += gInputTex.SampleLevel(gInputSamp, uv, 0) * gSampleWeights[idx].y;
  30. }
  31. {
  32. float2 uv = input.uv0 + gSampleOffsets[idx * 2 + 1].xy;
  33. output += gInputTex.SampleLevel(gInputSamp, uv, 0) * gSampleWeights[idx].z;
  34. }
  35. {
  36. float2 uv = input.uv0 + gSampleOffsets[idx * 2 + 1].zw;
  37. output += gInputTex.SampleLevel(gInputSamp, uv, 0) * gSampleWeights[idx].w;
  38. }
  39. }
  40. int extraSamples = gNumSamples - idx * 4;
  41. [branch]
  42. if(extraSamples >= 1)
  43. {
  44. float2 uv = input.uv0 + gSampleOffsets[idx * 2 + 0].xy;
  45. output += gInputTex.SampleLevel(gInputSamp, uv, 0) * gSampleWeights[idx].x;
  46. [branch]
  47. if(extraSamples >= 2)
  48. {
  49. float2 uv = input.uv0 + gSampleOffsets[idx * 2 + 0].zw;
  50. output += gInputTex.SampleLevel(gInputSamp, uv, 0) * gSampleWeights[idx].y;
  51. [branch]
  52. if(extraSamples >= 3)
  53. {
  54. float2 uv = input.uv0 + gSampleOffsets[idx * 2 + 1].xy;
  55. output += gInputTex.SampleLevel(gInputSamp, uv, 0) * gSampleWeights[idx].z;
  56. }
  57. }
  58. }
  59. return output;
  60. }
  61. };
  62. };