PPBokehDOFPrepare.bsl 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. #include "$ENGINE$\DepthOfFieldCommon.bslinc"
  2. #include "$ENGINE$\PPBase.bslinc"
  3. #include "$ENGINE$\DepthInput.bslinc"
  4. #include "$ENGINE$\PerCameraData.bslinc"
  5. shader PPBokehDOFPrepare
  6. {
  7. mixin DepthOfFieldCommon;
  8. mixin PPBase;
  9. mixin DepthInput;
  10. mixin PerCameraData;
  11. variations
  12. {
  13. MSAA_COUNT = { 1, 2 };
  14. };
  15. code
  16. {
  17. cbuffer Params
  18. {
  19. float2 gInvInputSize;
  20. };
  21. #if MSAA_COUNT > 1
  22. Texture2DMS<float4> gInputTex;
  23. #else
  24. Texture2D gInputTex;
  25. SamplerState gInputSampler
  26. {
  27. Filter = MIN_MAG_MIP_POINT;
  28. };
  29. #endif
  30. float4 fsmain(VStoFS input) : SV_Target0
  31. {
  32. float2 uvScale;
  33. #if MSAA_COUNT > 1
  34. uvScale = float2(1.0f, 1.0f);
  35. #else
  36. uvScale = gInvInputSize;
  37. #endif
  38. float2 uvs[4];
  39. uvs[0] = input.uv0 + uvScale * float2(-0.5f, -0.5f);
  40. uvs[1] = input.uv0 + uvScale * float2( 0.5f, -0.5f);
  41. uvs[2] = input.uv0 + uvScale * float2(-0.5f, 0.5f);
  42. uvs[3] = input.uv0 + uvScale * float2( 0.5f, 0.5f);
  43. float4 samples[4];
  44. float2 layers[4];
  45. [unroll]
  46. for(uint i = 0; i < 4; ++i)
  47. {
  48. #if MSAA_COUNT > 1
  49. samples[i].rgb = gInputTex.Load(uvs[i], 0).rgb;
  50. samples[i].a = -convertFromDeviceZ(gDepthBufferTex.Load(uvs[i], 0).r);
  51. #else
  52. samples[i].rgb = gInputTex.Sample(gInputSampler, uvs[i]).rgb;
  53. samples[i].a = -convertFromDeviceZ(gDepthBufferTex.SampleLevel(gDepthBufferSamp, uvs[i], 0).r);
  54. #endif
  55. layers[i] = computeLayerContributions(samples[i].a);
  56. }
  57. float2 layerSum = layers[0] + layers[1] + layers[2] + layers[3];
  58. bool isFrontLayer = layerSum.x > layerSum.y;
  59. float4 mask = isFrontLayer
  60. ? float4(layers[0].x, layers[1].x, layers[2].x, layers[3].x)
  61. : float4(layers[0].y, layers[1].y, layers[2].y, layers[3].y);
  62. float maskSum = dot(mask, float4(1.0f, 1.0f, 1.0f, 1.0f));
  63. [flatten]
  64. if(maskSum > 0.001f)
  65. return (samples[0] * mask.x + samples[1] * mask.y + samples[2] * mask.z + samples[3] * mask.w) / maskSum;
  66. return samples[0];
  67. }
  68. };
  69. };