New Matso DOF effects
diff --git a/src/engine/GPURenderer/renderProgs/depthOfField.fragment b/src/engine/GPURenderer/renderProgs/depthOfField.fragment
index acf4d12..6f40fff 100644
--- a/src/engine/GPURenderer/renderProgs/depthOfField.fragment
+++ b/src/engine/GPURenderer/renderProgs/depthOfField.fragment
@@ -1,50 +1,96 @@
-uniform sampler2D u_DiffuseMap;
-uniform sampler2D u_DepthMap;
+uniform sampler2D u_TextureMap;
+uniform sampler2D u_ScreenDepthMap;
+
+uniform vec2 u_Dimensions;
+uniform vec4 u_ViewInfo; // zfar / znear, zfar
+
+uniform vec4 u_Local0; // dofValue, dynamicGlowEnabled, 0, direction
+uniform vec4 u_Local1; // testvalues
varying vec2 var_TexCoords;
-varying vec4 var_ViewInfo; // zfar / znear, zfar
-varying vec2 var_Dimensions;
-varying vec4 var_Local0; // viewAngX, viewAngY, 0, 0
+varying float var_FocalDepth;
+
+vec2 sampleOffset = vec2(1.0/u_Dimensions);
+
+#define PIOVER180 0.017453292
+
+//MATSO DOF
+#define fMatsoDOFChromaPow 2.4 // [0.2 to 3.0] Amount of chromatic abberation color shifting.
+#define fMatsoDOFBokehCurve 6.0 // [0.5 to 20.0] Bokeh curve.
+#define fMatsoDOFBokehLight 4.0//0.512 // [0.0 to 2.0] Bokeh brightening factor.
+#define fMatsoDOFBokehAngle 10 // [0 to 360] Rotation angle of bokeh shape.
+
+#define iMatsoDOFBokehQuality 10 // [1 to 10] Blur quality as control value over tap count.
+#define DOF_BLURRADIUS 10.0
+
+const vec2 tdirs[4] = vec2[4]( vec2(-0.306, 0.739), vec2(0.306, 0.739), vec2(-0.739, 0.306), vec2(-0.739, -0.306) );
+
+float ExpandDepth(float depth)
+{
+ return depth * 255.0;
+}
-void main()
+vec4 GetMatsoDOFCA(sampler2D col, vec2 tex, float CoC)
{
- //gl_FragColor = texture2D(u_DiffuseMap, var_TexCoords.st);
- //return;
+ vec3 chroma;
+ chroma.r = pow(0.5, fMatsoDOFChromaPow * CoC);
+ chroma.g = pow(1.0, fMatsoDOFChromaPow * CoC);
+ chroma.b = pow(1.5, fMatsoDOFChromaPow * CoC);
+
+ vec2 tr = ((2.0 * tex - 1.0) * chroma.r) * 0.5 + 0.5;
+ vec2 tg = ((2.0 * tex - 1.0) * chroma.g) * 0.5 + 0.5;
+ vec2 tb = ((2.0 * tex - 1.0) * chroma.b) * 0.5 + 0.5;
+
+ vec3 color = vec3(texture2D(col, tr).r, texture2D(col, tg).g, texture2D(col, tb).b) * (1.0 - CoC);
- // calculate the screen texcoord in the 0.0 to 1.0 range
- //vec2 st = var_TexCoords.st * r_FBufScale;
- //vec2 st = var_TexCoords.st / var_Dimensions.st;
- vec2 st = var_TexCoords.st;
+ return vec4(color, 1.0);
+}
- // scale by the screen non-power-of-two-adjust
- //st *= r_NPOTScale;
+vec4 GetMatsoDOFBlur(int axis, vec2 coord, sampler2D SamplerHDRX)
+{
+ vec4 tcol = texture2D(SamplerHDRX, coord.xy);
+ float focalDepth = var_FocalDepth;
+ float coordDepth = ExpandDepth(texture2D(u_ScreenDepthMap, coord.xy).x);
+ float depthDiff = (coordDepth - focalDepth);
+ vec2 discRadius = (depthDiff * float(DOF_BLURRADIUS)) * sampleOffset.xy * 0.5 / float(iMatsoDOFBokehQuality);
+ float wValue = 1.0;
+
+ if (depthDiff < 0.0)
+ {
+ // Close to camera pixels, blur much less so player model is not blury...
+ discRadius *= 0.003;
+ }
- float focus = 0.98; // focal distance, normalized 0.8-0.999
- //float radius = 0.5; // 0 - 20.0
- float radius = 5.0; // 0 - 20.0
+ discRadius *= 0.5;
- vec4 sum = vec4(0.0, 0.0, 0.0, 0.0);
+ for (int i = -iMatsoDOFBokehQuality; i < iMatsoDOFBokehQuality; i++)
+ {
+ vec2 taxis = tdirs[axis];
- // autofocus
- focus = texture2D(u_DepthMap, vec2(0.5, 0.5)).r;
+ taxis.x = cos(fMatsoDOFBokehAngle*PIOVER180)*taxis.x-sin(fMatsoDOFBokehAngle*PIOVER180)*taxis.y;
+ taxis.y = sin(fMatsoDOFBokehAngle*PIOVER180)*taxis.x+cos(fMatsoDOFBokehAngle*PIOVER180)*taxis.y;
+
+ float fi = float(i);
+ vec2 tcoord = coord.xy + (taxis * fi * discRadius).xy;
- const float tap = 5.0;
- const float taps = tap * 2.0 + 1.0;
+ vec4 ct;
- float depth = texture2D(u_DepthMap, st).r;
- float delta = (abs(depth - focus) * abs(depth - focus)) / float(tap);
- delta *= radius;
- //delta = clamp(radius * delta, -max, max);
+ ct = texture2D(SamplerHDRX, tcoord.xy);
- for(float i = -tap; i < tap; i++)
- {
- for(float j = -tap; j < tap; j++)
- {
- sum += texture2D(u_DiffuseMap, st + ((vec2(i, j) * delta) / var_Dimensions.st));
- }
+ // my own pseudo-bokeh weighting
+ float b = dot(length(ct.rgb),0.333) + length(ct.rgb) + 0.1;
+ float w = pow(b, fMatsoDOFBokehCurve) + abs(fi);
+
+ tcol += ct * w;
+ wValue += w;
}
- sum *= 1.0 / (taps * taps);
+ tcol /= wValue;
+
+ return vec4(tcol.rgb, 1.0);
+}
- gl_FragColor = sum;
+void main ()
+{
+ gl_FragColor = GetMatsoDOFBlur(int(u_Local0.a), var_TexCoords, u_TextureMap);
}
diff --git a/src/engine/GPURenderer/renderProgs/depthOfField.vertex b/src/engine/GPURenderer/renderProgs/depthOfField.vertex
index dab9acc..38abcb8 100644
--- a/src/engine/GPURenderer/renderProgs/depthOfField.vertex
+++ b/src/engine/GPURenderer/renderProgs/depthOfField.vertex
@@ -3,21 +3,48 @@ attribute vec4 attr_TexCoord0;
uniform mat4 u_ModelViewProjectionMatrix;
-uniform vec4 u_ViewInfo; // zfar / znear, zfar
-uniform vec2 u_Dimensions;
-uniform vec4 u_Local0; // viewAngX, viewAngY, 0, 0
+uniform sampler2D u_ScreenDepthMap;
+
+uniform vec4 u_Local0; // dofValue, 0, 0, 0
varying vec2 var_TexCoords;
-varying vec4 var_ViewInfo; // zfar / znear, zfar
-varying vec2 var_Dimensions;
-varying vec4 var_Local0; // viewAngX, viewAngY, 0, 0
+varying float var_FocalDepth;
+
+
+#define BLUR_FOCUS
+//#define DOF_MANUALFOCUSDEPTH 253.8 //253.0 //[0.0 to 1.0] Manual focus depth. 0.0 means camera is focus plane, 1.0 means sky is focus plane.
+#define DOF_FOCUSPOINT vec2(0.5,0.75)//vec2(0.5,0.5) //[0.0 to 1.0] Screen coordinates of focus point. First value is horizontal, second value is vertical position.
+
+
+float GetLinearDepth(float depth)
+{
+ //return 1 / ((depth * ((u_ViewInfo.g - u_ViewInfo.r) / (-u_ViewInfo.g * u_ViewInfo.r)) + u_ViewInfo.g / (u_ViewInfo.g * u_ViewInfo.r)));
+ return depth * 255.0;
+}
+
+float GetFocalDepth(vec2 focalpoint)
+{
+ //if (u_Local0.r == 1.0 || u_Local0.r == 3.0)
+ // return DOF_MANUALFOCUSDEPTH;
+
+ float depthsum = 0.0;
+
+ depthsum+=GetLinearDepth(texture(u_ScreenDepthMap,focalpoint).x) * 0.999;
+
+#ifdef BLUR_FOCUS
+ depthsum+=GetLinearDepth(texture(u_ScreenDepthMap,focalpoint+vec2(-0.1, -0.1)).x) * 0.999;
+ depthsum+=GetLinearDepth(texture(u_ScreenDepthMap,focalpoint+vec2(0.1, 0.1)).x) * 0.999;
+ depthsum+=GetLinearDepth(texture(u_ScreenDepthMap,focalpoint+vec2(-0.1, 0.1)).x) * 0.999;
+ depthsum+=GetLinearDepth(texture(u_ScreenDepthMap,focalpoint+vec2(0.1, -0.1)).x) * 0.999;
+ depthsum = depthsum/5.0;
+#endif //BLUR_FOCUS
+
+ return depthsum;
+}
-void main()
+void main()
{
- // transform vertex position into homogenous clip-space
gl_Position = u_ModelViewProjectionMatrix * vec4(attr_Position, 1.0);
var_TexCoords = attr_TexCoord0.st;
- var_ViewInfo = u_ViewInfo;
- var_Dimensions = u_Dimensions.st;
- var_Local0 = u_Local0.rgba;
+ var_FocalDepth = GetFocalDepth(DOF_FOCUSPOINT);
}
GitHub
sha: 78025f0f