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