PPDownsample.bsl 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. #include "$ENGINE$\PPBase.bslinc"
  2. technique 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. Texture2D gInputTex;
  32. // position is expected to be at the center of 2x2 pixel tile, in UV
  33. float4 bilinearFilter(float2 position)
  34. {
  35. return gInputTex.Sample(gInputSamp, position);
  36. }
  37. #endif
  38. float4 fsmain(VStoFS input) : SV_Target0
  39. {
  40. // input.uv0 is in the center of 2x2 block of pixels. If MSAA is enabled the value is
  41. // in pixels, otherwise normal UV range.
  42. #if QUALITY == 0
  43. // Single bilinearly filtered sample (2x2 block average)
  44. return bilinearFilter(input.uv0);
  45. #else // QUALITY == 1
  46. // Four bilinearly filtered samples (4x4 block average)
  47. float4 samples[4];
  48. [unroll]
  49. for(uint i = 0; i < 4; i++)
  50. samples[i] = bilinearFilter(input.uv0 + gOffsets[i]);
  51. return (samples[0] + samples[1] + samples[2] + samples[3]) * 0.25f;
  52. #endif // QUALITY
  53. }
  54. };
  55. };