SHARE
TWEET

MGE fog-linked DoF

a guest Jan 7th, 2015 3,205 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. // Shaped Bokeh Depth of Field
  2. // CoC Calculations based off Knu's DoF shader for MGE
  3. // Blurring Algorithm Created by Tomerk
  4. // Optimized by Ethatron
  5. // Ported to MGE by vtastek
  6.  
  7. int mgeflags = 0;
  8.  
  9. // ---------------------------------------
  10. // TWEAKABLE VARIABLES.
  11.  
  12. float fogrange;
  13. float fogstart;
  14.  
  15. extern float fr = 59.715;                       // retina focus point, dpt
  16. // set slightly lower than fp to simulate myopia or as an alternative to MGE's distant blur
  17. // set slightly higher than fp+fpa to simulate hyperopia
  18.  
  19. extern float fp = 60.0;                 // eye relaxed focus power, dpt
  20. extern float fpa = 0.0;                 // accomodation, dpt
  21. // set lower to simulate presbyopia
  22.  
  23. extern float base_blur_radius = 0.383;          // base blur radius;
  24. // higher values mean more blur when out of DoF and shorter DoF.
  25.  
  26. extern float R = 32.0;                          // maximum blur radius in pixels;
  27.  
  28. extern bool EdgeWeighting = 1;          // 0 has constant weighting in highlights,
  29.                                                 // 1 gives edges more weight in highlights
  30.  
  31. extern bool NoWeaponBlur = 1;           // Set to true to keep weapons from blurring
  32. extern float weaponblur_cutoff = 40.0;          // Cutoff distance for what is considered a weapon
  33.  
  34. extern float fogblur_modifier = 10.0;
  35.  
  36. #undef  SMOOTHBLUR                              // when on, smooths the blur, may have a performance hit
  37.  
  38. extern float zzTargetPosX = 0.5;
  39. extern float zzTargetPosY = 0.5;
  40. // forcus target position
  41.  
  42.  
  43. // END OF TWEAKABLE VARIABLES.
  44. // ---------------------------------------
  45.  
  46.  
  47.  
  48. float2 rcpres;
  49.  
  50. texture lastshader;
  51. texture lastpass;
  52. texture depthframe;
  53.  
  54. sampler PassSamplerL = sampler_state {
  55.         Texture = <lastshader>;
  56.  
  57.         AddressU = Mirror;
  58.         AddressV = Mirror;
  59.  
  60.         MagFilter = Linear;
  61.         MinFilter = Linear;
  62.         MipFilter = None;
  63. };
  64.  
  65. sampler s1 = sampler_state { texture=<depthframe>; AddressU=Clamp; AddressV=Clamp; };
  66. sampler s3 = sampler_state { texture=<lastpass>; AddressU=Mirror; AddressV=Mirror; MagFilter=Linear; MinFilter=Linear; };
  67.  
  68.  
  69.  
  70. struct VSOUT
  71. {
  72.         float4 vertPos : POSITION;
  73.         float2 UVCoord : TEXCOORD0;
  74. };
  75.  
  76. struct VSIN
  77. {
  78.         float4 vertPos : POSITION0;
  79.         float2 UVCoord : TEXCOORD0;
  80. };
  81.  
  82. VSOUT FrameVS(VSIN IN)
  83. {
  84.         VSOUT OUT = (VSOUT)0.0f;
  85.  
  86.         OUT.vertPos = IN.vertPos;
  87.         OUT.UVCoord = IN.UVCoord;
  88.  
  89.         return OUT;
  90. }
  91.  
  92.  
  93.  
  94. #define M 60
  95. static float2 taps[M] =
  96. {
  97.         float2(  0.0000,  0.2500 ),
  98.         float2( -0.2165,  0.1250 ),
  99.         float2( -0.2165, -0.1250 ),
  100.         float2( -0.0000, -0.2500 ),
  101.         float2(  0.2165, -0.1250 ),
  102.         float2(  0.2165,  0.1250 ),
  103.         float2(  0.0000,  0.5000 ),
  104.         float2( -0.2500,  0.4330 ),
  105.         float2( -0.4330,  0.2500 ),
  106.         float2( -0.5000,  0.0000 ),
  107.         float2( -0.4330, -0.2500 ),
  108.         float2( -0.2500, -0.4330 ),
  109.         float2( -0.0000, -0.5000 ),
  110.         float2(  0.2500, -0.4330 ),
  111.         float2(  0.4330, -0.2500 ),
  112.         float2(  0.5000, -0.0000 ),
  113.         float2(  0.4330,  0.2500 ),
  114.         float2(  0.2500,  0.4330 ),
  115.         float2(  0.0000,  0.7500 ),
  116.         float2( -0.2565,  0.7048 ),
  117.         float2( -0.4821,  0.5745 ),
  118.         float2( -0.6495,  0.3750 ),
  119.         float2( -0.7386,  0.1302 ),
  120.         float2( -0.7386, -0.1302 ),
  121.         float2( -0.6495, -0.3750 ),
  122.         float2( -0.4821, -0.5745 ),
  123.         float2( -0.2565, -0.7048 ),
  124.         float2( -0.0000, -0.7500 ),
  125.         float2(  0.2565, -0.7048 ),
  126.         float2(  0.4821, -0.5745 ),
  127.         float2(  0.6495, -0.3750 ),
  128.         float2(  0.7386, -0.1302 ),
  129.         float2(  0.7386,  0.1302 ),
  130.         float2(  0.6495,  0.3750 ),
  131.         float2(  0.4821,  0.5745 ),
  132.         float2(  0.2565,  0.7048 ),
  133.         float2(  0.0000,  1.0000 ),
  134.         float2( -0.2588,  0.9659 ),
  135.         float2( -0.5000,  0.8660 ),
  136.         float2( -0.7071,  0.7071 ),
  137.         float2( -0.8660,  0.5000 ),
  138.         float2( -0.9659,  0.2588 ),
  139.         float2( -1.0000,  0.0000 ),
  140.         float2( -0.9659, -0.2588 ),
  141.         float2( -0.8660, -0.5000 ),
  142.         float2( -0.7071, -0.7071 ),
  143.         float2( -0.5000, -0.8660 ),
  144.         float2( -0.2588, -0.9659 ),
  145.         float2( -0.0000, -1.0000 ),
  146.         float2(  0.2588, -0.9659 ),
  147.         float2(  0.5000, -0.8660 ),
  148.         float2(  0.7071, -0.7071 ),
  149.         float2(  0.8660, -0.5000 ),
  150.         float2(  0.9659, -0.2588 ),
  151.         float2(  1.0000, -0.0000 ),
  152.         float2(  0.9659,  0.2588 ),
  153.         float2(  0.8660,  0.5000 ),
  154.         float2(  0.7071,  0.7071 ),
  155.         float2(  0.5000,  0.8660 ),
  156.         float2(  0.2588,  0.9659 )
  157. };
  158.  
  159. static float k = 0.00001;
  160.  
  161. float4 DepthOfField(float2 tex : TEXCOORD0) : COLOR0 {
  162.         float depth = tex2D(s1,tex).r;
  163.        float focus = tex2D(s1, float2(0.5, 0.5)).r;
  164.         float s = focus * 0.0142;
  165.         float z = depth * 0.0142;
  166.         float weapon = 1;
  167.  
  168.         float fpf = clamp(1 / s + fr, fp, fp + fpa);
  169.         float c = base_blur_radius * 0.009 * (fr - fpf + 1 / z) / fr / k;
  170.         c = sign(z - s) * min(abs(c), R) / (2 * R);
  171.         float fogblur = smoothstep((fogstart/fogblur_modifier)-(fogblur_modifier*25), fogstart/fogblur_modifier, z);
  172.         c *= fogblur;
  173.         if (NoWeaponBlur) {
  174.                 weapon = smoothstep(weaponblur_cutoff-0.05, weaponblur_cutoff, z);
  175.                 c *= weapon;
  176.         }
  177.        
  178.         return float4(tex2D(PassSamplerL, tex).rgb, c + 0.5);
  179. }
  180.  
  181. float4 SmartBlur( float2 tex : TEXCOORD0 ) : COLOR0 {
  182.         float4 color = tex2D(s3, tex);
  183.         const float c = 2 * R * (color.a - 0.5);
  184.  
  185.         float weight = (1 / (c * c + 1)) * dot(color.rgb + 0.01, float3(0.2126, 0.7152, 0.0722));
  186.         weight = max(0, weight);
  187.         if (EdgeWeighting)
  188.                 weight *= 0.25;
  189.  
  190.         color *= weight;
  191.         float amount = weight;
  192.  
  193.         for (int i = 0; i < M; i++) {
  194.                 float2 dir = taps[i];
  195.  
  196.                 float2 s_tex = tex + rcpres * dir * c;
  197.                 float4 s_color = tex2D(s3, s_tex);
  198.                 float  s_c = abs((s_color.a - 0.5) * 2 * R);
  199.  
  200.                 if (c < 0)
  201.                         s_c = max(abs(c), s_c);
  202.  
  203.                 weight = (1 / (s_c * s_c + 1)) * dot(s_color.rgb + 0.01, float3(0.2126, 0.7152, 0.0722));
  204.                 weight *= saturate(1 - smoothstep(s_c, s_c * 1.1, length(dir) * abs(c)));
  205.  
  206.                 if (EdgeWeighting)
  207.                         weight *= saturate(0.25 + 0.75 * pow(length(dir) * c / (s_c), 2));
  208.  
  209.                 color  += s_color * max(0, weight);
  210.                 amount +=           max(0, weight);
  211.         }
  212.  
  213. #ifdef SMOOTHBLUR
  214.         return float4(color.rgb / amount, c / (2 * R) + 0.5);
  215. #endif
  216.  
  217.         return float4(color.rgb / amount, 1);
  218. }
  219.  
  220. float4 HorizontalBlur(float2 tex : TEXCOORD0) : COLOR0 {
  221.  
  222.         float4 color = tex2D(s3, tex);
  223.         const float c = 2 * R * (color.a - 0.5);
  224.         float scale = c / 8; color *= 6;
  225.  
  226.         color += tex2D(s3, float2(tex.x - (rcpres.x    ) * scale, tex.y)) * 4;
  227.         color += tex2D(s3, float2(tex.x + (rcpres.x    ) * scale, tex.y)) * 4;
  228.  
  229.         color += tex2D(s3, float2(tex.x - (rcpres.x * 2) * scale, tex.y)) * 1;
  230.         color += tex2D(s3, float2(tex.x + (rcpres.x * 2) * scale, tex.y)) * 1;
  231.  
  232.         return float4(color.rgb / 16, c / (2 * R) + 0.5);
  233. }
  234.  
  235. float4 VerticalBlur(float2 tex : TEXCOORD0) : COLOR0 {
  236.  
  237.         float4 color = tex2D(s3, tex);
  238.         const float c = 2 * R * (color.a - 0.5);
  239.         float scale = c / 8; color *= 6;
  240.  
  241.         color += tex2D(s3, float2(tex.x, tex.y - (rcpres.y    ) * scale)) * 4;
  242.         color += tex2D(s3, float2(tex.x, tex.y + (rcpres.y    ) * scale)) * 4;
  243.  
  244.         color += tex2D(s3, float2(tex.x, tex.y - (rcpres.y * 2) * scale)) * 1;
  245.         color += tex2D(s3, float2(tex.x, tex.y + (rcpres.y * 2) * scale)) * 1;
  246.  
  247.         return float4(color.rgb / 16, 1);
  248. }
  249.  
  250.  
  251. technique T0 < string MGEinterface = "MGE XE 0"; >
  252. {
  253.         pass {
  254.                 VertexShader = compile vs_3_0 FrameVS();
  255.                 PixelShader  = compile ps_3_0 DepthOfField();
  256.         }
  257.  
  258.         pass {
  259.                 VertexShader = compile vs_3_0 FrameVS();
  260.                 PixelShader  = compile ps_3_0 SmartBlur();
  261.         }
  262.  
  263. #ifdef SMOOTHBLUR
  264.         pass {
  265.                 VertexShader = compile vs_3_0 FrameVS();
  266.                 PixelShader  = compile ps_3_0 HorizontalBlur();
  267.         }
  268.  
  269.         pass {
  270.                 VertexShader = compile vs_3_0 FrameVS();
  271.                 PixelShader  = compile ps_3_0 VerticalBlur();
  272.         }
  273. #endif
  274. }
RAW Paste Data
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
 
Top