2
0

PPDownsample.bsl 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. #include "$ENGINE$\PPBase.bslinc"
  2. shader PPDownsample
  3. {
  4. mixin PPBase;
  5. variations
  6. {
  7. QUALITY = { 0, 1 };
  8. MSAA = { true, false };
  9. };
  10. code
  11. {
  12. [internal]
  13. cbuffer Input
  14. {
  15. float2 gOffsets[4];
  16. }
  17. #if MSAA
  18. Texture2DMS<float4> gInputTex;
  19. // position is expected to be at the center of 2x2 pixel tile, in pixels
  20. float4 bilinearFilter(float2 position)
  21. {
  22. float4 sampleSum;
  23. sampleSum = gInputTex.Load(trunc(position + float2(-0.5f, -0.5f)), 0);
  24. sampleSum += gInputTex.Load(trunc(position + float2(0.5f, -0.5f)), 0);
  25. sampleSum += gInputTex.Load(trunc(position + float2(-0.5f, 0.5f)), 0);
  26. sampleSum += gInputTex.Load(trunc(position + float2(0.5f, 0.5f)), 0);
  27. return sampleSum * 0.25f;
  28. }
  29. #else
  30. SamplerState gInputSamp
  31. {
  32. AddressU = CLAMP;
  33. AddressV = CLAMP;
  34. AddressW = CLAMP;
  35. };
  36. Texture2D gInputTex;
  37. // position is expected to be at the center of 2x2 pixel tile, in UV
  38. float4 bilinearFilter(float2 position)
  39. {
  40. return gInputTex.Sample(gInputSamp, position);
  41. }
  42. #endif
  43. float4 fsmain(VStoFS input) : SV_Target0
  44. {
  45. // input.uv0 is in the center of 2x2 block of pixels. If MSAA is enabled the value is
  46. // in pixels, otherwise normal UV range.
  47. #if QUALITY == 0
  48. // Single bilinearly filtered sample (2x2 block average)
  49. return bilinearFilter(input.uv0);
  50. #else // QUALITY == 1
  51. // Four bilinearly filtered samples (4x4 block average)
  52. float4 samples[4];
  53. [unroll]
  54. for(uint i = 0; i < 4; i++)
  55. samples[i] = bilinearFilter(input.uv0 + gOffsets[i]);
  56. return (samples[0] + samples[1] + samples[2] + samples[3]) * 0.25f;
  57. #endif // QUALITY
  58. }
  59. };
  60. };