/* Genesis Dithering and Pseudo Transparency Shader v1.3 - Pass 0 by Sp00kyFox, 2014 Neighbor anaylsis via dot product of the difference vectors. */ // Parameter lines go here: #pragma parameter MODE "GDAPT Monochrome Analysis" 0.0 0.0 1.0 1.0 #pragma parameter PWR "GDAPT Color Metric Exp" 2.0 0.0 10.0 0.1 #if defined(VERTEX) #if __VERSION__ >= 130 #define COMPAT_VARYING out #define COMPAT_ATTRIBUTE in #define COMPAT_TEXTURE texture #else #define COMPAT_VARYING varying #define COMPAT_ATTRIBUTE attribute #define COMPAT_TEXTURE texture2D #endif #ifdef GL_ES #define COMPAT_PRECISION mediump #else #define COMPAT_PRECISION #endif COMPAT_ATTRIBUTE vec4 VertexCoord; COMPAT_ATTRIBUTE vec4 COLOR; COMPAT_ATTRIBUTE vec4 TexCoord; COMPAT_VARYING vec4 COL0; COMPAT_VARYING vec4 TEX0; COMPAT_VARYING vec2 t1; vec4 _oPosition1; uniform mat4 MVPMatrix; uniform COMPAT_PRECISION int FrameDirection; uniform COMPAT_PRECISION int FrameCount; uniform COMPAT_PRECISION vec2 OutputSize; uniform COMPAT_PRECISION vec2 TextureSize; uniform COMPAT_PRECISION vec2 InputSize; #define vTexCoord TEX0.xy #define SourceSize vec4(TextureSize, 1.0 / TextureSize) //either TextureSize or InputSize #define outsize vec4(OutputSize, 1.0 / OutputSize) void main() { gl_Position = MVPMatrix * VertexCoord; COL0 = COLOR; TEX0.xy = TexCoord.xy; t1 = 1.0 / SourceSize.xy; } #elif defined(FRAGMENT) #if __VERSION__ >= 130 #define COMPAT_VARYING in #define COMPAT_TEXTURE texture out vec4 FragColor; #else #define COMPAT_VARYING varying #define FragColor gl_FragColor #define COMPAT_TEXTURE texture2D #endif #ifdef GL_ES #ifdef GL_FRAGMENT_PRECISION_HIGH precision highp float; #else precision mediump float; #endif #define COMPAT_PRECISION mediump #else #define COMPAT_PRECISION #endif uniform COMPAT_PRECISION int FrameDirection; uniform COMPAT_PRECISION int FrameCount; uniform COMPAT_PRECISION vec2 OutputSize; uniform COMPAT_PRECISION vec2 TextureSize; uniform COMPAT_PRECISION vec2 InputSize; uniform sampler2D Texture; COMPAT_VARYING vec4 TEX0; COMPAT_VARYING vec2 t1; // compatibility #defines #define Source Texture #define vTexCoord TEX0.xy #define SourceSize vec4(TextureSize, 1.0 / TextureSize) //either TextureSize or InputSize #define outsize vec4(OutputSize, 1.0 / OutputSize) #ifdef PARAMETER_UNIFORM // All parameter floats need to have COMPAT_PRECISION in front of them uniform COMPAT_PRECISION float MODE; uniform COMPAT_PRECISION float PWR; #else #define MODE 0.0 #define PWR 2.0 #endif #define dotfix(x,y) clamp(dot(x,y), 0.0, 1.0) // NVIDIA Fix #define TEX(dx,dy) COMPAT_TEXTURE(Source, vTexCoord+vec2((dx),(dy))*t1).xyz // Reference: http://www.compuphase.com/cmetric.htm COMPAT_PRECISION float eq(vec3 A, vec3 B) { vec3 diff = A-B; float ravg = (A.x + B.x) * 0.5; diff *= diff * vec3(2.0 + ravg, 4.0, 3.0 - ravg); return pow( smoothstep(3.0, 0.0, sqrt(diff.x + diff.y + diff.z)), PWR ); } void main() { vec3 C = TEX( 0, 0); vec3 L = TEX(-1, 0); vec3 R = TEX( 1, 0); vec3 U = TEX( 0,-1); vec3 D = TEX( 0, 1); float tag = 0.0; if(MODE > 0.5){ tag = ((L == R) && (C != L)) ? 1.0 : 0.0; } else{ tag = dotfix(normalize(C-L), normalize(C-R)) * eq(L,R); } tag = ((L == R) && (U == D) && (L == U)) ? 0.0 : tag; FragColor = vec4(C, tag); } #endif