PPGaussianBlurCommon.bslinc 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. mixin PPGaussianBlurCommon
  2. {
  3. code
  4. {
  5. [internal]
  6. cbuffer GaussianBlurParams
  7. {
  8. float4 gSampleOffsets[(MAX_NUM_SAMPLES + 1) / 2];
  9. float4 gSampleWeights[MAX_NUM_SAMPLES];
  10. int gNumSamples;
  11. }
  12. float4 gaussianBlur(Texture2D source, SamplerState samp, float2 uv)
  13. {
  14. // Note: Consider adding a version of this shader with unrolled loop for small number of samples
  15. float4 output = 0;
  16. int idx = 0;
  17. for(; idx < (gNumSamples / 4); idx++)
  18. {
  19. {
  20. float2 sampleUV = uv + gSampleOffsets[idx * 2 + 0].xy;
  21. output += source.SampleLevel(samp, sampleUV, 0) * gSampleWeights[idx * 4 + 0];
  22. }
  23. {
  24. float2 sampleUV = uv + gSampleOffsets[idx * 2 + 0].zw;
  25. output += source.SampleLevel(samp, sampleUV, 0) * gSampleWeights[idx * 4 + 1];
  26. }
  27. {
  28. float2 sampleUV = uv + gSampleOffsets[idx * 2 + 1].xy;
  29. output += source.SampleLevel(samp, sampleUV, 0) * gSampleWeights[idx * 4 + 2];
  30. }
  31. {
  32. float2 sampleUV = uv + gSampleOffsets[idx * 2 + 1].zw;
  33. output += source.SampleLevel(samp, sampleUV, 0) * gSampleWeights[idx * 4 + 3];
  34. }
  35. }
  36. int extraSamples = gNumSamples - idx * 4;
  37. [branch]
  38. if(extraSamples >= 1)
  39. {
  40. float2 sampleUV = uv + gSampleOffsets[idx * 2 + 0].xy;
  41. output += source.SampleLevel(samp, sampleUV, 0) * gSampleWeights[idx * 4 + 0];
  42. [branch]
  43. if(extraSamples >= 2)
  44. {
  45. float2 sampleUV = uv + gSampleOffsets[idx * 2 + 0].zw;
  46. output += source.SampleLevel(samp, sampleUV, 0) * gSampleWeights[idx * 4 + 1];
  47. [branch]
  48. if(extraSamples >= 3)
  49. {
  50. float2 sampleUV = uv + gSampleOffsets[idx * 2 + 1].xy;
  51. output += source.SampleLevel(samp, sampleUV, 0) * gSampleWeights[idx * 4 + 2];
  52. }
  53. }
  54. }
  55. return output;
  56. }
  57. };
  58. };