49de3fde71247654ed552a468f3bd9bdce2ffb2e
[simavr] / examples / board_reprap / gfx / postproc.fs
1 #version 120
2
3 // References:
4 // http://www.geeks3d.com/20110405/fxaa-fast-approximate-anti-aliasing-demo-glsl-opengl-test-radeon-geforce/3/
5 // http://jmonkeyengine.googlecode.com/svn-history/r9095/trunk/engine/src/core-data/Common/MatDefs/Post/
6
7 #extension GL_EXT_gpu_shader4 : enable
8
9 uniform sampler2D m_Texture;
10 uniform vec2 g_Resolution = vec2(800,600);
11
12 //uniform float m_VxOffset;
13 uniform float m_SpanMax = 8.0;
14 uniform float m_ReduceMul = (1.0/8.0);
15
16 varying vec2 texCoord;
17 varying vec4 posPos;
18
19 #define FxaaTex(t, p) texture2D(t, p)
20
21     #define OffsetVec(a, b) ivec2(a, b)
22     #define FxaaTexOff(t, p, o, r) texture2DLodOffset(t, p, 0.0, o)
23
24 vec3 FxaaPixelShader(
25   vec4 posPos,   // Output of FxaaVertexShader interpolated across screen.
26   sampler2D tex, // Input texture.
27   vec2 rcpFrame) // Constant {1.0/frameWidth, 1.0/frameHeight}.
28 {
29
30     #define FXAA_REDUCE_MIN   (1.0/128.0)
31     //#define FXAA_REDUCE_MUL   (1.0/8.0)
32     //#define FXAA_SPAN_MAX     8.0
33
34     vec3 rgbNW = FxaaTex(tex, posPos.zw).xyz;
35     vec3 rgbNE = FxaaTexOff(tex, posPos.zw, OffsetVec(1,0), rcpFrame.xy).xyz;
36     vec3 rgbSW = FxaaTexOff(tex, posPos.zw, OffsetVec(0,1), rcpFrame.xy).xyz;
37     vec3 rgbSE = FxaaTexOff(tex, posPos.zw, OffsetVec(1,1), rcpFrame.xy).xyz;
38
39     vec3 rgbM  = FxaaTex(tex, posPos.xy).xyz;
40
41     vec3 luma = vec3(0.299, 0.587, 0.114);
42     float lumaNW = dot(rgbNW, luma);
43     float lumaNE = dot(rgbNE, luma);
44     float lumaSW = dot(rgbSW, luma);
45     float lumaSE = dot(rgbSE, luma);
46     float lumaM  = dot(rgbM,  luma);
47
48     float lumaMin = min(lumaM, min(min(lumaNW, lumaNE), min(lumaSW, lumaSE)));
49     float lumaMax = max(lumaM, max(max(lumaNW, lumaNE), max(lumaSW, lumaSE)));
50
51     vec2 dir;
52     dir.x = -((lumaNW + lumaNE) - (lumaSW + lumaSE));
53     dir.y =  ((lumaNW + lumaSW) - (lumaNE + lumaSE));
54
55     float dirReduce = max(
56         (lumaNW + lumaNE + lumaSW + lumaSE) * (0.25 * m_ReduceMul),
57         FXAA_REDUCE_MIN);
58     float rcpDirMin = 1.0/(min(abs(dir.x), abs(dir.y)) + dirReduce);
59     dir = min(vec2( m_SpanMax,  m_SpanMax),
60           max(vec2(-m_SpanMax, -m_SpanMax),
61           dir * rcpDirMin)) * rcpFrame.xy;
62
63     vec3 rgbA = (1.0/2.0) * (
64         FxaaTex(tex, posPos.xy + dir * vec2(1.0/3.0 - 0.5)).xyz +
65         FxaaTex(tex, posPos.xy + dir * vec2(2.0/3.0 - 0.5)).xyz);
66     vec3 rgbB = rgbA * (1.0/2.0) + (1.0/4.0) * (
67         FxaaTex(tex, posPos.xy + dir * vec2(0.0/3.0 - 0.5)).xyz +
68         FxaaTex(tex, posPos.xy + dir * vec2(3.0/3.0 - 0.5)).xyz);
69
70     float lumaB = dot(rgbB, luma);
71
72     if ((lumaB < lumaMin) || (lumaB > lumaMax))
73     {
74         return rgbA;
75     }
76     else
77     {
78         return rgbB; 
79     }
80 }
81
82 void main()
83 {
84     vec2 rcpFrame = vec2(1.0) / g_Resolution;
85     gl_FragColor = vec4(FxaaPixelShader(posPos, m_Texture, rcpFrame), 1.0);
86 //      gl_FragColor.g *= 2;
87 }