PPMotionBlur.bsl 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. #include "$ENGINE$\PPBase.bslinc"
  2. #include "$ENGINE$\DepthInput.bslinc"
  3. #include "$ENGINE$\PerCameraData.bslinc"
  4. shader PPMotionBlur
  5. {
  6. mixin PPBase;
  7. mixin DepthInput;
  8. mixin PerCameraData;
  9. code
  10. {
  11. cbuffer Params
  12. {
  13. uint gHalfNumSamples;
  14. };
  15. Texture2D gInputTex;
  16. SamplerState gInputSampler
  17. {
  18. Filter = MIN_MAG_MIP_POINT;
  19. };
  20. float4 fsmain(VStoFS input) : SV_Target0
  21. {
  22. // TODO - Deal with MSAA inputs?
  23. float2 currentUV = input.uv0;
  24. float2 ndcPos = input.screenPos;
  25. float curDepth = gDepthBufferTex.Sample(gDepthBufferSamp, currentUV).r;
  26. float4 currentNDC = float4(ndcPos, curDepth, 1);
  27. float4 prevClip = mul(gNDCToPrevNDC, currentNDC);
  28. float2 prevNdcPos = prevClip.xy / prevClip.w;
  29. float2 prevUV = NDCToUV(prevNdcPos);
  30. // TODO - Scale blue length by framerate
  31. // TODO - Clamp to maximum blur radius
  32. float2 blurDir = (prevUV - currentUV) * 0.5;
  33. // TODO - Jitter the samples
  34. float4 output = gInputTex.Sample(gInputSampler, currentUV);
  35. for (int i = -gHalfNumSamples; i < 0; ++i)
  36. {
  37. float2 offset = blurDir * (i / (float)gHalfNumSamples);
  38. output += gInputTex.Sample(gInputSampler, currentUV + offset);
  39. }
  40. for (int i = 1; i <= gHalfNumSamples; ++i)
  41. {
  42. float2 offset = blurDir * (i / (float)gHalfNumSamples);
  43. output += gInputTex.Sample(gInputSampler, currentUV + offset);
  44. }
  45. output /= gHalfNumSamples * 2 + 1;
  46. return output;
  47. }
  48. };
  49. };