mirror of
https://gitlab.com/skysthelimit.dev/selenite.git
synced 2025-06-17 19:12:07 -05:00
161 lines
4.0 KiB
GLSL
161 lines
4.0 KiB
GLSL
//##############################################################//
|
|
// //
|
|
// AA Shader 4.o shader - coded by guest(r) //
|
|
// part of code by ShadX //
|
|
//##############################################################//
|
|
// Ported by Hyllian and hunterk - 2015
|
|
|
|
#pragma parameter INTERNAL_RES "Internal Resolution" 1.0 1.0 8.0 1.0
|
|
|
|
// compatibility #defines
|
|
#define Source Texture
|
|
#define vTexCoord TEX0.xy
|
|
|
|
|
|
#if defined(VERTEX)
|
|
|
|
#if __VERSION__ >= 130
|
|
#define COMPAT_VARYING out
|
|
#define COMPAT_ATTRIBUTE in
|
|
#else
|
|
#define COMPAT_VARYING varying
|
|
#define COMPAT_ATTRIBUTE attribute
|
|
#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;
|
|
|
|
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;
|
|
|
|
void main()
|
|
{
|
|
gl_Position = MVPMatrix * VertexCoord;
|
|
COL0 = COLOR;
|
|
TEX0.xy = TexCoord.xy;
|
|
}
|
|
|
|
#elif defined(FRAGMENT)
|
|
|
|
#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
|
|
|
|
#if __VERSION__ >= 130
|
|
#define COMPAT_VARYING in
|
|
#define COMPAT_TEXTURE texture
|
|
out vec4 FragColor;
|
|
#else
|
|
#define COMPAT_VARYING varying
|
|
#define COMPAT_TEXTURE texture2D
|
|
#define FragColor gl_FragColor
|
|
#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;
|
|
|
|
// compatibility #defines
|
|
#define SourceSize vec4(TextureSize, 1.0 / TextureSize) //either TextureSize or InputSize
|
|
#define outsize vec4(OutputSize, 1.0 / OutputSize)
|
|
|
|
#ifdef PARAMETER_UNIFORM
|
|
uniform COMPAT_PRECISION float INTERNAL_RES;
|
|
#else
|
|
#define INTERNAL_RES 1.0
|
|
#endif
|
|
|
|
vec3 dt = vec3(1.0,1.0,1.0);
|
|
|
|
COMPAT_PRECISION vec3 texture2d (sampler2D tex, vec2 coord, vec4 yx) {
|
|
|
|
vec3 s00 = COMPAT_TEXTURE(tex, coord + yx.zw).xyz;
|
|
vec3 s20 = COMPAT_TEXTURE(tex, coord + yx.xw).xyz;
|
|
vec3 s22 = COMPAT_TEXTURE(tex, coord + yx.xy).xyz;
|
|
vec3 s02 = COMPAT_TEXTURE(tex, coord + yx.zy).xyz;
|
|
|
|
float m1=dot(abs(s00-s22),dt)+0.001;
|
|
float m2=dot(abs(s02-s20),dt)+0.001;
|
|
|
|
return 0.5*(m2*(s00+s22)+m1*(s02+s20))/(m1+m2);
|
|
}
|
|
|
|
void main()
|
|
{
|
|
// Calculating texel coordinates
|
|
vec2 size = 4.0 * SourceSize.xy / INTERNAL_RES;
|
|
// vec2 size = X * (outsize.xy * SourceSize.zw) * SourceSize.xy;
|
|
vec2 inv_size = 1.0 / size;
|
|
|
|
vec4 yx = vec4(inv_size, -inv_size);
|
|
|
|
vec2 OGL2Pos = vTexCoord * size;
|
|
|
|
vec2 fp = fract(OGL2Pos);
|
|
vec2 dx = vec2(inv_size.x,0.0);
|
|
vec2 dy = vec2(0.0, inv_size.y);
|
|
vec2 g1 = vec2(inv_size.x,inv_size.y);
|
|
vec2 g2 = vec2(-inv_size.x,inv_size.y);
|
|
|
|
vec2 pC4 = floor(OGL2Pos) * inv_size;
|
|
|
|
// Reading the texels
|
|
vec3 C0 = texture2d(Source, pC4 - g1, yx);
|
|
vec3 C1 = texture2d(Source, pC4 - dy, yx);
|
|
vec3 C2 = texture2d(Source, pC4 - g2, yx);
|
|
vec3 C3 = texture2d(Source, pC4 - dx, yx);
|
|
vec3 C4 = texture2d(Source, pC4 , yx);
|
|
vec3 C5 = texture2d(Source, pC4 + dx, yx);
|
|
vec3 C6 = texture2d(Source, pC4 + g2, yx);
|
|
vec3 C7 = texture2d(Source, pC4 + dy, yx);
|
|
vec3 C8 = texture2d(Source, pC4 + g1, yx);
|
|
|
|
vec3 ul, ur, dl, dr;
|
|
float m1, m2;
|
|
|
|
m1 = dot(abs(C0-C4),dt)+0.001;
|
|
m2 = dot(abs(C1-C3),dt)+0.001;
|
|
ul = (m2*(C0+C4)+m1*(C1+C3))/(m1+m2);
|
|
|
|
m1 = dot(abs(C1-C5),dt)+0.001;
|
|
m2 = dot(abs(C2-C4),dt)+0.001;
|
|
ur = (m2*(C1+C5)+m1*(C2+C4))/(m1+m2);
|
|
|
|
m1 = dot(abs(C3-C7),dt)+0.001;
|
|
m2 = dot(abs(C6-C4),dt)+0.001;
|
|
dl = (m2*(C3+C7)+m1*(C6+C4))/(m1+m2);
|
|
|
|
m1 = dot(abs(C4-C8),dt)+0.001;
|
|
m2 = dot(abs(C5-C7),dt)+0.001;
|
|
dr = (m2*(C4+C8)+m1*(C5+C7))/(m1+m2);
|
|
|
|
vec3 c11 = 0.5*((dr*fp.x+dl*(1.0-fp.x))*fp.y+(ur*fp.x+ul*(1.0-fp.x))*(1.0-fp.y) );
|
|
|
|
FragColor = vec4(c11, 1.0);
|
|
}
|
|
#endif
|