1/*
2   Fast Sharpen Shader
3
4   Copyright (C) 2005 - 2019 guest(r) - guest.r@gmail.com
5
6   This program is free software; you can redistribute it and/or
7   modify it under the terms of the GNU General Public License
8   as published by the Free Software Foundation; either version 2
9   of the License, or (at your option) any later version.
10
11   This program is distributed in the hope that it will be useful,
12   but WITHOUT ANY WARRANTY; without even the implied warranty of
13   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14   GNU General Public License for more details.
15
16   You should have received a copy of the GNU General Public License
17   along with this program; if not, write to the Free Software
18   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
19*/
20
21#pragma parameter SHARPEN  "Sharpen strength"       1.00 0.0 2.00 0.05
22#pragma parameter CONTR    "Ammount of sharpening"  0.07 0.0 0.25 0.01
23#pragma parameter DETAILS  "Details sharpened "     1.00 0.0 1.00 0.05
24
25#if defined(VERTEX)
26
27#if __VERSION__ >= 130
28#define COMPAT_VARYING out
29#define COMPAT_ATTRIBUTE in
30#define COMPAT_TEXTURE texture
31#else
32#define COMPAT_VARYING varying
33#define COMPAT_ATTRIBUTE attribute
34#define COMPAT_TEXTURE texture2D
35#endif
36
37#ifdef GL_ES
38#define COMPAT_PRECISION mediump
39#else
40#define COMPAT_PRECISION
41#endif
42
43COMPAT_ATTRIBUTE vec4 VertexCoord;
44COMPAT_ATTRIBUTE vec4 TexCoord;
45COMPAT_VARYING vec4 TEX0;
46
47vec4 _oPosition1;
48uniform mat4 MVPMatrix;
49uniform COMPAT_PRECISION int FrameDirection;
50uniform COMPAT_PRECISION int FrameCount;
51uniform COMPAT_PRECISION vec2 OutputSize;
52uniform COMPAT_PRECISION vec2 TextureSize;
53uniform COMPAT_PRECISION vec2 InputSize;
54COMPAT_VARYING vec2 g10;
55COMPAT_VARYING vec2 g01;
56COMPAT_VARYING vec2 g12;
57COMPAT_VARYING vec2 g21;
58
59// compatibility #defines
60#define vTexCoord TEX0.xy
61#define SourceSize vec4(TextureSize, 1.0 / TextureSize) //either TextureSize or InputSize
62#define OutSize vec4(OutputSize, 1.0 / OutputSize)
63
64void main()
65{
66    gl_Position = MVPMatrix * VertexCoord;
67    TEX0.xy = TexCoord.xy * 1.00001;
68   g10 = vec2( 0.3333,-1.0)*SourceSize.zw;
69   g01 = vec2(-1.0,-0.3333)*SourceSize.zw;
70   g12 = vec2(-0.3333, 1.0)*SourceSize.zw;
71   g21 = vec2( 1.0, 0.3333)*SourceSize.zw;
72}
73
74#elif defined(FRAGMENT)
75
76#ifdef GL_ES
77#ifdef GL_FRAGMENT_PRECISION_HIGH
78precision highp float;
79#else
80precision mediump float;
81#endif
82#define COMPAT_PRECISION mediump
83#else
84#define COMPAT_PRECISION
85#endif
86
87#if __VERSION__ >= 130
88#define COMPAT_VARYING in
89#define COMPAT_TEXTURE texture
90out COMPAT_PRECISION vec4 FragColor;
91#else
92#define COMPAT_VARYING varying
93#define FragColor gl_FragColor
94#define COMPAT_TEXTURE texture2D
95#endif
96
97uniform COMPAT_PRECISION int FrameDirection;
98uniform COMPAT_PRECISION int FrameCount;
99uniform COMPAT_PRECISION vec2 OutputSize;
100uniform COMPAT_PRECISION vec2 TextureSize;
101uniform COMPAT_PRECISION vec2 InputSize;
102uniform sampler2D Texture;
103COMPAT_VARYING vec4 TEX0;
104COMPAT_VARYING vec2 g10;
105COMPAT_VARYING vec2 g01;
106COMPAT_VARYING vec2 g12;
107COMPAT_VARYING vec2 g21;
108
109// compatibility #defines
110#define Source Texture
111#define vTexCoord TEX0.xy
112
113#define SourceSize vec4(TextureSize, 1.0 / TextureSize) //either TextureSize or InputSize
114#define OutSize vec4(OutputSize, 1.0 / OutputSize)
115
116#ifdef PARAMETER_UNIFORM
117uniform COMPAT_PRECISION float SHARPEN;
118uniform COMPAT_PRECISION float CONTR;
119uniform COMPAT_PRECISION float DETAILS;
120#else
121#define SHARPEN   1.2
122#define CONTR  0.08
123#define DETAILS   1.0
124#endif
125
126void main()
127{
128	vec3 c10 = COMPAT_TEXTURE(Source, vTexCoord + g10).rgb;
129	vec3 c01 = COMPAT_TEXTURE(Source, vTexCoord + g01).rgb;
130	vec3 c21 = COMPAT_TEXTURE(Source, vTexCoord + g21).rgb;
131	vec3 c12 = COMPAT_TEXTURE(Source, vTexCoord + g12).rgb;
132	vec3 c11 = COMPAT_TEXTURE(Source, vTexCoord      ).rgb;
133	vec3 b11 = (c10+c01+c12+c21)*0.25;
134
135	float contrast = max(max(c11.r,c11.g),c11.b);
136	contrast = mix(2.0*CONTR, CONTR, contrast);
137
138	vec3 mn1 = min(min(c10,c01),min(c12,c21)); mn1 = min(mn1,c11*(1.0-contrast));
139	vec3 mx1 = max(max(c10,c01),max(c12,c21)); mx1 = max(mx1,c11*(1.0+contrast));
140
141	vec3 dif = pow(mx1-mn1+0.0001, vec3(0.75,0.75,0.75));
142	vec3 sharpen = mix(vec3(SHARPEN*DETAILS), vec3(SHARPEN), dif);
143
144	c11 = clamp(mix(c11,b11,-sharpen), mn1,mx1);
145
146	FragColor = vec4(c11,1.0);
147}
148#endif
149