PPChromaticAberration.bsl 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. #include "$ENGINE$\PPBase.bslinc"
  2. shader PPChromaticAberration
  3. {
  4. mixin PPBase;
  5. variations
  6. {
  7. SIMPLE = { false, true };
  8. };
  9. code
  10. {
  11. [internal]
  12. cbuffer Params
  13. {
  14. float2 gInputSize;
  15. float gShiftAmount;
  16. }
  17. SamplerState gInputSamp
  18. {
  19. Filter = MIN_MAG_MIP_POINT;
  20. };
  21. Texture2D gInputTex;
  22. SamplerState gFringeSamp;
  23. Texture2D gFringeTex;
  24. float4 fsmain(VStoFS input) : SV_Target0
  25. {
  26. float2 ndc = 2.0f * input.uv0 - 1.0f;
  27. float2 end = input.uv0 - ndc * dot(ndc, ndc) * gShiftAmount;
  28. #if SIMPLE
  29. {
  30. float2 delta = (end - input.uv0) / 3.0f;
  31. float4 filterA = float4(gFringeTex.Sample(gFringeSamp, float2(0.5f / 3.0f, 0.0f)).rgb, 1.0f);
  32. float4 filterB = float4(gFringeTex.Sample(gFringeSamp, float2(1.5f / 3.0f, 0.0f)).rgb, 1.0f);
  33. float4 filterC = float4(gFringeTex.Sample(gFringeSamp, float2(2.5f / 3.0f, 0.0f)).rgb, 1.0f);
  34. float4 texelA = gInputTex.Sample(gInputSamp, input.uv0);
  35. float4 texelB = gInputTex.Sample(gInputSamp, input.uv0 + delta);
  36. float4 texelC = gInputTex.Sample(gInputSamp, input.uv0 + delta * 2.0f);
  37. float4 sum = texelA * filterA + texelB * filterB + texelC * filterC;
  38. float4 filterSum = filterA + filterB + filterC;
  39. return sum / filterSum;
  40. }
  41. #else
  42. {
  43. float2 diff = end - input.uv0;
  44. int numSamples = clamp((int)length(gInputSize * diff / 2.0f), 3, MAX_SAMPLES);
  45. float2 delta = diff / numSamples;
  46. float2 pos = input.uv0;
  47. float4 sum = 0.0f;
  48. float4 filterSum = 0.0f;
  49. for (int i = 0; i < numSamples; i++)
  50. {
  51. float t = (i + 0.5f) / numSamples;
  52. float4 s = gInputTex.Sample(gInputSamp, pos);
  53. float4 filter = float4(gFringeTex.Sample(gFringeSamp, float2(t, 0.0f)).rgb, 1.0f);
  54. sum += s * filter;
  55. filterSum += filter;
  56. pos += delta;
  57. }
  58. return sum / filterSum;
  59. }
  60. #endif
  61. }
  62. };
  63. };