44 lines
963 B
Text
44 lines
963 B
Text
|
//!type library
|
||
|
//!include lib/utils.glsl
|
||
|
|
||
|
float DOF_CoC(
|
||
|
in float z )
|
||
|
{
|
||
|
return uMaxBlur * min( 1 ,
|
||
|
max( 0 , abs( z - uSharpDist ) - uSharpRange ) / uBlurFalloff );
|
||
|
}
|
||
|
|
||
|
// z: z at UV
|
||
|
// coc: blur radius at UV
|
||
|
// uv: initial coordinate
|
||
|
// blurvec: smudge direction
|
||
|
vec3 DOF_Blur(
|
||
|
in float z ,
|
||
|
in float coc ,
|
||
|
in vec2 uv ,
|
||
|
in vec2 blurvec )
|
||
|
{
|
||
|
vec3 sumcol = vec3( 0. );
|
||
|
for ( int i = 0 ; i < u_Samples ; i++ ) {
|
||
|
float r = i;
|
||
|
#ifdef DOF_USE_RANDOM
|
||
|
r += M_Hash( uv + float( i + uTime ) ) - .5;
|
||
|
#endif
|
||
|
r = r / float( u_Samples - 1 ) - .5;
|
||
|
vec2 p = uv + r * coc * blurvec;
|
||
|
vec3 smpl = texture( u_Input , p ).xyz;
|
||
|
float sz = texture( u_Depth , p ).x;
|
||
|
if ( sz < z ) {
|
||
|
// if sample is closer consider it's CoC
|
||
|
p = uv + r * min( coc , DOF_CoC( sz ) ) * blurvec;
|
||
|
p = uv + r * DOF_CoC( sz ) * blurvec;
|
||
|
smpl = texture( u_Input , p ).xyz;
|
||
|
}
|
||
|
sumcol += smpl;
|
||
|
}
|
||
|
sumcol /= float( u_Samples );
|
||
|
sumcol = max( sumcol , 0. );
|
||
|
return sumcol;
|
||
|
}
|
||
|
|