PPDownsample.bsl 1.5 KB

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