mirror of
https://github.com/1dot13/gamedir.git
synced 2026-07-22 13:40:25 +02:00
update to cnc-ddraw 7.0
This commit is contained in:
@@ -0,0 +1,324 @@
|
|||||||
|
/*
|
||||||
|
FSR - [EASU] EDGE ADAPTIVE SPATIAL UPSAMPLING
|
||||||
|
Ported from https://www.shadertoy.com/view/stXSWB, MIT license
|
||||||
|
*/
|
||||||
|
|
||||||
|
#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;
|
||||||
|
|
||||||
|
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)
|
||||||
|
|
||||||
|
#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;
|
||||||
|
|
||||||
|
// 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)
|
||||||
|
|
||||||
|
vec3 FsrEasuCF(vec2 p) {
|
||||||
|
return COMPAT_TEXTURE(Source,p).rgb;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**** EASU ****/
|
||||||
|
void FsrEasuCon(
|
||||||
|
out vec4 con0,
|
||||||
|
out vec4 con1,
|
||||||
|
out vec4 con2,
|
||||||
|
out vec4 con3,
|
||||||
|
// This the rendered image resolution being upscaled
|
||||||
|
vec2 inputViewportInPixels,
|
||||||
|
// This is the resolution of the resource containing the input image (useful for dynamic resolution)
|
||||||
|
vec2 inputSizeInPixels,
|
||||||
|
// This is the display resolution which the input image gets upscaled to
|
||||||
|
vec2 outputSizeInPixels
|
||||||
|
)
|
||||||
|
{
|
||||||
|
// Output integer position to a pixel position in viewport.
|
||||||
|
con0 = vec4(
|
||||||
|
inputViewportInPixels.x/outputSizeInPixels.x,
|
||||||
|
inputViewportInPixels.y/outputSizeInPixels.y,
|
||||||
|
.5*inputViewportInPixels.x/outputSizeInPixels.x-.5,
|
||||||
|
.5*inputViewportInPixels.y/outputSizeInPixels.y-.5
|
||||||
|
);
|
||||||
|
// Viewport pixel position to normalized image space.
|
||||||
|
// This is used to get upper-left of 'F' tap.
|
||||||
|
con1 = vec4(1,1,1,-1)/inputSizeInPixels.xyxy;
|
||||||
|
// Centers of gather4, first offset from upper-left of 'F'.
|
||||||
|
// +---+---+
|
||||||
|
// | | |
|
||||||
|
// +--(0)--+
|
||||||
|
// | b | c |
|
||||||
|
// +---F---+---+---+
|
||||||
|
// | e | f | g | h |
|
||||||
|
// +--(1)--+--(2)--+
|
||||||
|
// | i | j | k | l |
|
||||||
|
// +---+---+---+---+
|
||||||
|
// | n | o |
|
||||||
|
// +--(3)--+
|
||||||
|
// | | |
|
||||||
|
// +---+---+
|
||||||
|
// These are from (0) instead of 'F'.
|
||||||
|
con2 = vec4(-1,2,1,2)/inputSizeInPixels.xyxy;
|
||||||
|
con3 = vec4(0,4,0,0)/inputSizeInPixels.xyxy;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Filtering for a given tap for the scalar.
|
||||||
|
void FsrEasuTapF(
|
||||||
|
inout vec3 aC, // Accumulated color, with negative lobe.
|
||||||
|
inout float aW, // Accumulated weight.
|
||||||
|
vec2 off, // Pixel offset from resolve position to tap.
|
||||||
|
vec2 dir, // Gradient direction.
|
||||||
|
vec2 len, // Length.
|
||||||
|
float lob, // Negative lobe strength.
|
||||||
|
float clp, // Clipping point.
|
||||||
|
vec3 c
|
||||||
|
)
|
||||||
|
{
|
||||||
|
// Tap color.
|
||||||
|
// Rotate offset by direction.
|
||||||
|
vec2 v = vec2(dot(off, dir), dot(off,vec2(-dir.y,dir.x)));
|
||||||
|
// Anisotropy.
|
||||||
|
v *= len;
|
||||||
|
// Compute distance^2.
|
||||||
|
float d2 = min(dot(v,v),clp);
|
||||||
|
// Limit to the window as at corner, 2 taps can easily be outside.
|
||||||
|
// Approximation of lancos2 without sin() or rcp(), or sqrt() to get x.
|
||||||
|
// (25/16 * (2/5 * x^2 - 1)^2 - (25/16 - 1)) * (1/4 * x^2 - 1)^2
|
||||||
|
// |_______________________________________| |_______________|
|
||||||
|
// base window
|
||||||
|
// The general form of the 'base' is,
|
||||||
|
// (a*(b*x^2-1)^2-(a-1))
|
||||||
|
// Where 'a=1/(2*b-b^2)' and 'b' moves around the negative lobe.
|
||||||
|
float wB = .4 * d2 - 1.;
|
||||||
|
float wA = lob * d2 -1.;
|
||||||
|
wB *= wB;
|
||||||
|
wA *= wA;
|
||||||
|
wB = 1.5625*wB-.5625;
|
||||||
|
float w= wB * wA;
|
||||||
|
// Do weighted average.
|
||||||
|
aC += c*w;
|
||||||
|
aW += w;
|
||||||
|
}
|
||||||
|
|
||||||
|
//------------------------------------------------------------------------------------------------------------------------------
|
||||||
|
// Accumulate direction and length.
|
||||||
|
void FsrEasuSetF(
|
||||||
|
inout vec2 dir,
|
||||||
|
inout float len,
|
||||||
|
float w,
|
||||||
|
float lA,float lB,float lC,float lD,float lE
|
||||||
|
)
|
||||||
|
{
|
||||||
|
// Direction is the '+' diff.
|
||||||
|
// a
|
||||||
|
// b c d
|
||||||
|
// e
|
||||||
|
// Then takes magnitude from abs average of both sides of 'c'.
|
||||||
|
// Length converts gradient reversal to 0, smoothly to non-reversal at 1, shaped, then adding horz and vert terms.
|
||||||
|
float lenX = max(abs(lD - lC), abs(lC - lB));
|
||||||
|
float dirX = lD - lB;
|
||||||
|
dir.x += dirX * w;
|
||||||
|
lenX = clamp(abs(dirX)/lenX,0.,1.);
|
||||||
|
lenX *= lenX;
|
||||||
|
len += lenX * w;
|
||||||
|
// Repeat for the y axis.
|
||||||
|
float lenY = max(abs(lE - lC), abs(lC - lA));
|
||||||
|
float dirY = lE - lA;
|
||||||
|
dir.y += dirY * w;
|
||||||
|
lenY = clamp(abs(dirY) / lenY,0.,1.);
|
||||||
|
lenY *= lenY;
|
||||||
|
len += lenY * w;
|
||||||
|
}
|
||||||
|
|
||||||
|
//------------------------------------------------------------------------------------------------------------------------------
|
||||||
|
void FsrEasuF(
|
||||||
|
out vec3 pix,
|
||||||
|
vec2 ip, // Integer pixel position in output.
|
||||||
|
// Constants generated by FsrEasuCon().
|
||||||
|
vec4 con0, // xy = output to input scale, zw = first pixel offset correction
|
||||||
|
vec4 con1,
|
||||||
|
vec4 con2,
|
||||||
|
vec4 con3
|
||||||
|
)
|
||||||
|
{
|
||||||
|
//------------------------------------------------------------------------------------------------------------------------------
|
||||||
|
// Get position of 'f'.
|
||||||
|
vec2 pp = ip * con0.xy + con0.zw; // Corresponding input pixel/subpixel
|
||||||
|
vec2 fp = floor(pp);// fp = source nearest pixel
|
||||||
|
pp -= fp; // pp = source subpixel
|
||||||
|
|
||||||
|
//------------------------------------------------------------------------------------------------------------------------------
|
||||||
|
// 12-tap kernel.
|
||||||
|
// b c
|
||||||
|
// e f g h
|
||||||
|
// i j k l
|
||||||
|
// n o
|
||||||
|
// Gather 4 ordering.
|
||||||
|
// a b
|
||||||
|
// r g
|
||||||
|
vec2 p0 = fp * con1.xy + con1.zw;
|
||||||
|
|
||||||
|
// These are from p0 to avoid pulling two constants on pre-Navi hardware.
|
||||||
|
vec2 p1 = p0 + con2.xy;
|
||||||
|
vec2 p2 = p0 + con2.zw;
|
||||||
|
vec2 p3 = p0 + con3.xy;
|
||||||
|
|
||||||
|
// TextureGather is not available on WebGL2
|
||||||
|
vec4 off = vec4(-.5,.5,-.5,.5)*con1.xxyy;
|
||||||
|
// textureGather to texture offsets
|
||||||
|
// x=west y=east z=north w=south
|
||||||
|
vec3 bC = FsrEasuCF(p0 + off.xw); float bL = bC.g + 0.5 *(bC.r + bC.b);
|
||||||
|
vec3 cC = FsrEasuCF(p0 + off.yw); float cL = cC.g + 0.5 *(cC.r + cC.b);
|
||||||
|
vec3 iC = FsrEasuCF(p1 + off.xw); float iL = iC.g + 0.5 *(iC.r + iC.b);
|
||||||
|
vec3 jC = FsrEasuCF(p1 + off.yw); float jL = jC.g + 0.5 *(jC.r + jC.b);
|
||||||
|
vec3 fC = FsrEasuCF(p1 + off.yz); float fL = fC.g + 0.5 *(fC.r + fC.b);
|
||||||
|
vec3 eC = FsrEasuCF(p1 + off.xz); float eL = eC.g + 0.5 *(eC.r + eC.b);
|
||||||
|
vec3 kC = FsrEasuCF(p2 + off.xw); float kL = kC.g + 0.5 *(kC.r + kC.b);
|
||||||
|
vec3 lC = FsrEasuCF(p2 + off.yw); float lL = lC.g + 0.5 *(lC.r + lC.b);
|
||||||
|
vec3 hC = FsrEasuCF(p2 + off.yz); float hL = hC.g + 0.5 *(hC.r + hC.b);
|
||||||
|
vec3 gC = FsrEasuCF(p2 + off.xz); float gL = gC.g + 0.5 *(gC.r + gC.b);
|
||||||
|
vec3 oC = FsrEasuCF(p3 + off.yz); float oL = oC.g + 0.5 *(oC.r + oC.b);
|
||||||
|
vec3 nC = FsrEasuCF(p3 + off.xz); float nL = nC.g + 0.5 *(nC.r + nC.b);
|
||||||
|
|
||||||
|
//------------------------------------------------------------------------------------------------------------------------------
|
||||||
|
// Simplest multi-channel approximate luma possible (luma times 2, in 2 FMA/MAD).
|
||||||
|
// Accumulate for bilinear interpolation.
|
||||||
|
vec2 dir = vec2(0);
|
||||||
|
float len = 0.;
|
||||||
|
|
||||||
|
FsrEasuSetF(dir, len, (1.-pp.x)*(1.-pp.y), bL, eL, fL, gL, jL);
|
||||||
|
FsrEasuSetF(dir, len, pp.x *(1.-pp.y), cL, fL, gL, hL, kL);
|
||||||
|
FsrEasuSetF(dir, len, (1.-pp.x)* pp.y , fL, iL, jL, kL, nL);
|
||||||
|
FsrEasuSetF(dir, len, pp.x * pp.y , gL, jL, kL, lL, oL);
|
||||||
|
|
||||||
|
//------------------------------------------------------------------------------------------------------------------------------
|
||||||
|
// Normalize with approximation, and cleanup close to zero.
|
||||||
|
vec2 dir2 = dir * dir;
|
||||||
|
float dirR = dir2.x + dir2.y;
|
||||||
|
bool zro = dirR < (1.0/32768.0);
|
||||||
|
dirR = inversesqrt(dirR);
|
||||||
|
dirR = zro ? 1.0 : dirR;
|
||||||
|
dir.x = zro ? 1.0 : dir.x;
|
||||||
|
dir *= vec2(dirR);
|
||||||
|
// Transform from {0 to 2} to {0 to 1} range, and shape with square.
|
||||||
|
len = len * 0.5;
|
||||||
|
len *= len;
|
||||||
|
// Stretch kernel {1.0 vert|horz, to sqrt(2.0) on diagonal}.
|
||||||
|
float stretch = dot(dir,dir) / (max(abs(dir.x), abs(dir.y)));
|
||||||
|
// Anisotropic length after rotation,
|
||||||
|
// x := 1.0 lerp to 'stretch' on edges
|
||||||
|
// y := 1.0 lerp to 2x on edges
|
||||||
|
vec2 len2 = vec2(1. +(stretch-1.0)*len, 1. -.5 * len);
|
||||||
|
// Based on the amount of 'edge',
|
||||||
|
// the window shifts from +/-{sqrt(2.0) to slightly beyond 2.0}.
|
||||||
|
float lob = .5 - .29 * len;
|
||||||
|
// Set distance^2 clipping point to the end of the adjustable window.
|
||||||
|
float clp = 1./lob;
|
||||||
|
|
||||||
|
//------------------------------------------------------------------------------------------------------------------------------
|
||||||
|
// Accumulation mixed with min/max of 4 nearest.
|
||||||
|
// b c
|
||||||
|
// e f g h
|
||||||
|
// i j k l
|
||||||
|
// n o
|
||||||
|
vec3 min4 = min(min(fC,gC),min(jC,kC));
|
||||||
|
vec3 max4 = max(max(fC,gC),max(jC,kC));
|
||||||
|
// Accumulation.
|
||||||
|
vec3 aC = vec3(0);
|
||||||
|
float aW = 0.;
|
||||||
|
FsrEasuTapF(aC, aW, vec2( 0,-1)-pp, dir, len2, lob, clp, bC);
|
||||||
|
FsrEasuTapF(aC, aW, vec2( 1,-1)-pp, dir, len2, lob, clp, cC);
|
||||||
|
FsrEasuTapF(aC, aW, vec2(-1, 1)-pp, dir, len2, lob, clp, iC);
|
||||||
|
FsrEasuTapF(aC, aW, vec2( 0, 1)-pp, dir, len2, lob, clp, jC);
|
||||||
|
FsrEasuTapF(aC, aW, vec2( 0, 0)-pp, dir, len2, lob, clp, fC);
|
||||||
|
FsrEasuTapF(aC, aW, vec2(-1, 0)-pp, dir, len2, lob, clp, eC);
|
||||||
|
FsrEasuTapF(aC, aW, vec2( 1, 1)-pp, dir, len2, lob, clp, kC);
|
||||||
|
FsrEasuTapF(aC, aW, vec2( 2, 1)-pp, dir, len2, lob, clp, lC);
|
||||||
|
FsrEasuTapF(aC, aW, vec2( 2, 0)-pp, dir, len2, lob, clp, hC);
|
||||||
|
FsrEasuTapF(aC, aW, vec2( 1, 0)-pp, dir, len2, lob, clp, gC);
|
||||||
|
FsrEasuTapF(aC, aW, vec2( 1, 2)-pp, dir, len2, lob, clp, oC);
|
||||||
|
FsrEasuTapF(aC, aW, vec2( 0, 2)-pp, dir, len2, lob, clp, nC);
|
||||||
|
//------------------------------------------------------------------------------------------------------------------------------
|
||||||
|
// Normalize and dering.
|
||||||
|
pix=min(max4,max(min4,aC/aW));
|
||||||
|
}
|
||||||
|
|
||||||
|
void main()
|
||||||
|
{
|
||||||
|
vec3 c;
|
||||||
|
vec4 con0,con1,con2,con3;
|
||||||
|
|
||||||
|
vec2 fragCoord = vTexCoord.xy * OutputSize.xy;
|
||||||
|
|
||||||
|
FsrEasuCon(
|
||||||
|
con0, con1, con2, con3, SourceSize.xy, SourceSize.xy, OutputSize.xy
|
||||||
|
);
|
||||||
|
FsrEasuF(c, fragCoord, con0, con1, con2, con3);
|
||||||
|
FragColor = vec4(c.xyz, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -0,0 +1,178 @@
|
|||||||
|
/*
|
||||||
|
FSR - [RCAS] ROBUST CONTRAST ADAPTIVE SHARPENING
|
||||||
|
Ported from https://www.shadertoy.com/view/stXSWB, MIT license
|
||||||
|
*/
|
||||||
|
|
||||||
|
#pragma parameter FSR_SHARPENING "FSR RCAS Sharpening Amount (Lower = Sharper)" 0.6 0.0 2.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;
|
||||||
|
|
||||||
|
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)
|
||||||
|
|
||||||
|
#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;
|
||||||
|
|
||||||
|
// 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
|
||||||
|
uniform COMPAT_PRECISION float FSR_SHARPENING;
|
||||||
|
#else
|
||||||
|
#define FSR_SHARPENING 0.6
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define FSR_RCAS_LIMIT (0.25-(1.0/16.0))
|
||||||
|
//#define FSR_RCAS_DENOISE
|
||||||
|
|
||||||
|
// Input callback prototypes that need to be implemented by calling shader
|
||||||
|
vec4 FsrRcasLoadF(vec2 p);
|
||||||
|
//------------------------------------------------------------------------------------------------------------------------------
|
||||||
|
void FsrRcasCon(
|
||||||
|
out float con,
|
||||||
|
// The scale is {0.0 := maximum, to N>0, where N is the number of stops (halving) of the reduction of sharpness}.
|
||||||
|
float sharpness
|
||||||
|
){
|
||||||
|
// Transform from stops to linear value.
|
||||||
|
con = exp2(-sharpness);
|
||||||
|
}
|
||||||
|
|
||||||
|
vec3 FsrRcasF(
|
||||||
|
vec2 ip, // Integer pixel position in output.
|
||||||
|
float con
|
||||||
|
)
|
||||||
|
{
|
||||||
|
// Constant generated by RcasSetup().
|
||||||
|
// Algorithm uses minimal 3x3 pixel neighborhood.
|
||||||
|
// b
|
||||||
|
// d e f
|
||||||
|
// h
|
||||||
|
vec2 sp = vec2(ip);
|
||||||
|
vec3 b = FsrRcasLoadF(sp + vec2( 0,-1)).rgb;
|
||||||
|
vec3 d = FsrRcasLoadF(sp + vec2(-1, 0)).rgb;
|
||||||
|
vec3 e = FsrRcasLoadF(sp).rgb;
|
||||||
|
vec3 f = FsrRcasLoadF(sp+vec2( 1, 0)).rgb;
|
||||||
|
vec3 h = FsrRcasLoadF(sp+vec2( 0, 1)).rgb;
|
||||||
|
// Luma times 2.
|
||||||
|
float bL = b.g + .5 * (b.b + b.r);
|
||||||
|
float dL = d.g + .5 * (d.b + d.r);
|
||||||
|
float eL = e.g + .5 * (e.b + e.r);
|
||||||
|
float fL = f.g + .5 * (f.b + f.r);
|
||||||
|
float hL = h.g + .5 * (h.b + h.r);
|
||||||
|
// Noise detection.
|
||||||
|
float nz = .25 * (bL + dL + fL + hL) - eL;
|
||||||
|
nz=clamp(
|
||||||
|
abs(nz)
|
||||||
|
/(
|
||||||
|
max(max(bL,dL),max(eL,max(fL,hL)))
|
||||||
|
-min(min(bL,dL),min(eL,min(fL,hL)))
|
||||||
|
),
|
||||||
|
0., 1.
|
||||||
|
);
|
||||||
|
nz=1.-.5*nz;
|
||||||
|
// Min and max of ring.
|
||||||
|
vec3 mn4 = min(b, min(f, h));
|
||||||
|
vec3 mx4 = max(b, max(f, h));
|
||||||
|
// Immediate constants for peak range.
|
||||||
|
vec2 peakC = vec2(1., -4.);
|
||||||
|
// Limiters, these need to be high precision RCPs.
|
||||||
|
vec3 hitMin = mn4 / (4. * mx4);
|
||||||
|
vec3 hitMax = (peakC.x - mx4) / (4.* mn4 + peakC.y);
|
||||||
|
vec3 lobeRGB = max(-hitMin, hitMax);
|
||||||
|
float lobe = max(
|
||||||
|
-FSR_RCAS_LIMIT,
|
||||||
|
min(max(lobeRGB.r, max(lobeRGB.g, lobeRGB.b)), 0.)
|
||||||
|
)*con;
|
||||||
|
// Apply noise removal.
|
||||||
|
#ifdef FSR_RCAS_DENOISE
|
||||||
|
lobe *= nz;
|
||||||
|
#endif
|
||||||
|
// Resolve, which needs the medium precision rcp approximation to avoid visible tonality changes.
|
||||||
|
return (lobe * (b + d + h + f) + e) / (4. * lobe + 1.);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
vec4 FsrRcasLoadF(vec2 p) {
|
||||||
|
return COMPAT_TEXTURE(Source,p/OutputSize.xy);
|
||||||
|
}
|
||||||
|
|
||||||
|
void main()
|
||||||
|
{
|
||||||
|
vec2 fragCoord = vTexCoord.xy * OutputSize.xy;
|
||||||
|
|
||||||
|
// Set up constants
|
||||||
|
float con;
|
||||||
|
FsrRcasCon(con, FSR_SHARPENING);
|
||||||
|
|
||||||
|
// Perform RCAS pass
|
||||||
|
vec3 col = FsrRcasF(fragCoord, con);
|
||||||
|
|
||||||
|
FragColor = vec4(col,1);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -0,0 +1,202 @@
|
|||||||
|
/*
|
||||||
|
Hyllian's jinc windowed-jinc 2-lobe sharper with anti-ringing Shader
|
||||||
|
|
||||||
|
Copyright (C) 2011-2016 Hyllian/Jararaca - sergiogdb@gmail.com
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in
|
||||||
|
all copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
THE SOFTWARE.
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define JINC2_WINDOW_SINC 0.405
|
||||||
|
#define JINC2_SINC 0.79
|
||||||
|
#define JINC2_AR_STRENGTH 0.8
|
||||||
|
|
||||||
|
#define texCoord TEX0
|
||||||
|
|
||||||
|
#if defined(VERTEX)
|
||||||
|
|
||||||
|
#if __VERSION__ >= 130
|
||||||
|
#define OUT out
|
||||||
|
#define IN in
|
||||||
|
#define tex2D texture
|
||||||
|
#else
|
||||||
|
#define OUT varying
|
||||||
|
#define IN attribute
|
||||||
|
#define tex2D texture2D
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef GL_ES
|
||||||
|
#define COMPAT_PRECISION mediump
|
||||||
|
#else
|
||||||
|
#define COMPAT_PRECISION
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
IN vec4 VertexCoord;
|
||||||
|
IN vec4 Color;
|
||||||
|
IN vec2 TexCoord;
|
||||||
|
OUT vec4 color;
|
||||||
|
OUT vec2 texCoord;
|
||||||
|
|
||||||
|
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;
|
||||||
|
color = Color;
|
||||||
|
texCoord = TexCoord * 1.0001;
|
||||||
|
}
|
||||||
|
|
||||||
|
#elif defined(FRAGMENT)
|
||||||
|
|
||||||
|
#if __VERSION__ >= 130
|
||||||
|
#define IN in
|
||||||
|
#define tex2D texture
|
||||||
|
out vec4 FragColor;
|
||||||
|
#else
|
||||||
|
#define IN varying
|
||||||
|
#define FragColor gl_FragColor
|
||||||
|
#define tex2D 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 s_p;
|
||||||
|
IN vec2 texCoord;
|
||||||
|
|
||||||
|
const float halfpi = 1.5707963267948966192313216916398;
|
||||||
|
const float pi = 3.1415926535897932384626433832795;
|
||||||
|
const float wa = JINC2_WINDOW_SINC*pi;
|
||||||
|
const float wb = JINC2_SINC*pi;
|
||||||
|
|
||||||
|
// Calculates the distance between two points
|
||||||
|
float d(vec2 pt1, vec2 pt2)
|
||||||
|
{
|
||||||
|
vec2 v = pt2 - pt1;
|
||||||
|
return sqrt(dot(v,v));
|
||||||
|
}
|
||||||
|
|
||||||
|
vec3 min4(vec3 a, vec3 b, vec3 c, vec3 d)
|
||||||
|
{
|
||||||
|
return min(a, min(b, min(c, d)));
|
||||||
|
}
|
||||||
|
|
||||||
|
vec3 max4(vec3 a, vec3 b, vec3 c, vec3 d)
|
||||||
|
{
|
||||||
|
return max(a, max(b, max(c, d)));
|
||||||
|
}
|
||||||
|
|
||||||
|
vec4 resampler(vec4 x)
|
||||||
|
{
|
||||||
|
vec4 res;
|
||||||
|
|
||||||
|
res = (x==vec4(0.0, 0.0, 0.0, 0.0)) ? vec4(wa*wb) : sin(x*wa)*sin(x*wb)/(x*x);
|
||||||
|
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
void main()
|
||||||
|
{
|
||||||
|
|
||||||
|
vec3 color;
|
||||||
|
vec4 weights[4];
|
||||||
|
|
||||||
|
vec2 dx = vec2(1.0, 0.0);
|
||||||
|
vec2 dy = vec2(0.0, 1.0);
|
||||||
|
|
||||||
|
vec2 pc = texCoord*TextureSize;
|
||||||
|
|
||||||
|
vec2 tc = (floor(pc-vec2(0.5,0.5))+vec2(0.5,0.5));
|
||||||
|
|
||||||
|
weights[0] = resampler(vec4(d(pc, tc -dx -dy), d(pc, tc -dy), d(pc, tc +dx -dy), d(pc, tc+2.0*dx -dy)));
|
||||||
|
weights[1] = resampler(vec4(d(pc, tc -dx ), d(pc, tc ), d(pc, tc +dx ), d(pc, tc+2.0*dx )));
|
||||||
|
weights[2] = resampler(vec4(d(pc, tc -dx +dy), d(pc, tc +dy), d(pc, tc +dx +dy), d(pc, tc+2.0*dx +dy)));
|
||||||
|
weights[3] = resampler(vec4(d(pc, tc -dx+2.0*dy), d(pc, tc +2.0*dy), d(pc, tc +dx+2.0*dy), d(pc, tc+2.0*dx+2.0*dy)));
|
||||||
|
|
||||||
|
dx = dx/TextureSize;
|
||||||
|
dy = dy/TextureSize;
|
||||||
|
tc = tc/TextureSize;
|
||||||
|
|
||||||
|
vec3 c00 = tex2D(s_p, tc -dx -dy).xyz;
|
||||||
|
vec3 c10 = tex2D(s_p, tc -dy).xyz;
|
||||||
|
vec3 c20 = tex2D(s_p, tc +dx -dy).xyz;
|
||||||
|
vec3 c30 = tex2D(s_p, tc+2.0*dx -dy).xyz;
|
||||||
|
vec3 c01 = tex2D(s_p, tc -dx ).xyz;
|
||||||
|
vec3 c11 = tex2D(s_p, tc ).xyz;
|
||||||
|
vec3 c21 = tex2D(s_p, tc +dx ).xyz;
|
||||||
|
vec3 c31 = tex2D(s_p, tc+2.0*dx ).xyz;
|
||||||
|
vec3 c02 = tex2D(s_p, tc -dx +dy).xyz;
|
||||||
|
vec3 c12 = tex2D(s_p, tc +dy).xyz;
|
||||||
|
vec3 c22 = tex2D(s_p, tc +dx +dy).xyz;
|
||||||
|
vec3 c32 = tex2D(s_p, tc+2.0*dx +dy).xyz;
|
||||||
|
vec3 c03 = tex2D(s_p, tc -dx+2.0*dy).xyz;
|
||||||
|
vec3 c13 = tex2D(s_p, tc +2.0*dy).xyz;
|
||||||
|
vec3 c23 = tex2D(s_p, tc +dx+2.0*dy).xyz;
|
||||||
|
vec3 c33 = tex2D(s_p, tc+2.0*dx+2.0*dy).xyz;
|
||||||
|
|
||||||
|
color = tex2D(s_p, texCoord).xyz;
|
||||||
|
|
||||||
|
// Get min/max samples
|
||||||
|
vec3 min_sample = min4(c11, c21, c12, c22);
|
||||||
|
vec3 max_sample = max4(c11, c21, c12, c22);
|
||||||
|
/*
|
||||||
|
color = mat4x3(c00, c10, c20, c30) * weights[0];
|
||||||
|
color+= mat4x3(c01, c11, c21, c31) * weights[1];
|
||||||
|
color+= mat4x3(c02, c12, c22, c32) * weights[2];
|
||||||
|
color+= mat4x3(c03, c13, c23, c33) * weights[3];
|
||||||
|
mat4 wgts = mat4(weights[0], weights[1], weights[2], weights[3]);
|
||||||
|
vec4 wsum = wgts * vec4(1.0,1.0,1.0,1.0);
|
||||||
|
color = color/(dot(wsum, vec4(1.0,1.0,1.0,1.0)));
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
color = vec3(dot(weights[0], vec4(c00.x, c10.x, c20.x, c30.x)), dot(weights[0], vec4(c00.y, c10.y, c20.y, c30.y)), dot(weights[0], vec4(c00.z, c10.z, c20.z, c30.z)));
|
||||||
|
color+= vec3(dot(weights[1], vec4(c01.x, c11.x, c21.x, c31.x)), dot(weights[1], vec4(c01.y, c11.y, c21.y, c31.y)), dot(weights[1], vec4(c01.z, c11.z, c21.z, c31.z)));
|
||||||
|
color+= vec3(dot(weights[2], vec4(c02.x, c12.x, c22.x, c32.x)), dot(weights[2], vec4(c02.y, c12.y, c22.y, c32.y)), dot(weights[2], vec4(c02.z, c12.z, c22.z, c32.z)));
|
||||||
|
color+= vec3(dot(weights[3], vec4(c03.x, c13.x, c23.x, c33.x)), dot(weights[3], vec4(c03.y, c13.y, c23.y, c33.y)), dot(weights[3], vec4(c03.z, c13.z, c23.z, c33.z)));
|
||||||
|
color = color/(dot(weights[0], vec4(1,1,1,1)) + dot(weights[1], vec4(1,1,1,1)) + dot(weights[2], vec4(1,1,1,1)) + dot(weights[3], vec4(1,1,1,1)));
|
||||||
|
|
||||||
|
// Anti-ringing
|
||||||
|
vec3 aux = color;
|
||||||
|
color = clamp(color, min_sample, max_sample);
|
||||||
|
color = mix(aux, color, JINC2_AR_STRENGTH);
|
||||||
|
|
||||||
|
// final sum and weight normalization
|
||||||
|
FragColor.xyz = color;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
@@ -5,3 +5,6 @@ https://github.com/libretro/glsl-shaders
|
|||||||
|
|
||||||
|
|
||||||
Note: Filename must end with "bilinear.glsl" to enable bilinear hardware filtering (GL_LINEAR)
|
Note: Filename must end with "bilinear.glsl" to enable bilinear hardware filtering (GL_LINEAR)
|
||||||
|
|
||||||
|
|
||||||
|
Extract shader-package.zip to unlock 100+ additional shaders
|
||||||
|
|||||||
Binary file not shown.
@@ -1,148 +0,0 @@
|
|||||||
/*
|
|
||||||
Fast Sharpen Shader
|
|
||||||
|
|
||||||
Copyright (C) 2005 - 2019 guest(r) - guest.r@gmail.com
|
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or
|
|
||||||
modify it under the terms of the GNU General Public License
|
|
||||||
as published by the Free Software Foundation; either version 2
|
|
||||||
of the License, or (at your option) any later version.
|
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
GNU General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with this program; if not, write to the Free Software
|
|
||||||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#pragma parameter SHARPEN "Sharpen strength" 1.00 0.0 2.00 0.05
|
|
||||||
#pragma parameter CONTR "Ammount of sharpening" 0.07 0.0 0.25 0.01
|
|
||||||
#pragma parameter DETAILS "Details sharpened " 1.00 0.0 1.00 0.05
|
|
||||||
|
|
||||||
#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 TexCoord;
|
|
||||||
COMPAT_VARYING vec4 TEX0;
|
|
||||||
|
|
||||||
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;
|
|
||||||
COMPAT_VARYING vec2 g10;
|
|
||||||
COMPAT_VARYING vec2 g01;
|
|
||||||
COMPAT_VARYING vec2 g12;
|
|
||||||
COMPAT_VARYING vec2 g21;
|
|
||||||
|
|
||||||
// compatibility #defines
|
|
||||||
#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;
|
|
||||||
TEX0.xy = TexCoord.xy * 1.00001;
|
|
||||||
g10 = vec2( 0.3333,-1.0)*SourceSize.zw;
|
|
||||||
g01 = vec2(-1.0,-0.3333)*SourceSize.zw;
|
|
||||||
g12 = vec2(-0.3333, 1.0)*SourceSize.zw;
|
|
||||||
g21 = vec2( 1.0, 0.3333)*SourceSize.zw;
|
|
||||||
}
|
|
||||||
|
|
||||||
#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 COMPAT_PRECISION vec4 FragColor;
|
|
||||||
#else
|
|
||||||
#define COMPAT_VARYING varying
|
|
||||||
#define FragColor gl_FragColor
|
|
||||||
#define COMPAT_TEXTURE texture2D
|
|
||||||
#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 g10;
|
|
||||||
COMPAT_VARYING vec2 g01;
|
|
||||||
COMPAT_VARYING vec2 g12;
|
|
||||||
COMPAT_VARYING vec2 g21;
|
|
||||||
|
|
||||||
// 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
|
|
||||||
uniform COMPAT_PRECISION float SHARPEN;
|
|
||||||
uniform COMPAT_PRECISION float CONTR;
|
|
||||||
uniform COMPAT_PRECISION float DETAILS;
|
|
||||||
#else
|
|
||||||
#define SHARPEN 1.2
|
|
||||||
#define CONTR 0.08
|
|
||||||
#define DETAILS 1.0
|
|
||||||
#endif
|
|
||||||
|
|
||||||
void main()
|
|
||||||
{
|
|
||||||
vec3 c10 = COMPAT_TEXTURE(Source, vTexCoord + g10).rgb;
|
|
||||||
vec3 c01 = COMPAT_TEXTURE(Source, vTexCoord + g01).rgb;
|
|
||||||
vec3 c21 = COMPAT_TEXTURE(Source, vTexCoord + g21).rgb;
|
|
||||||
vec3 c12 = COMPAT_TEXTURE(Source, vTexCoord + g12).rgb;
|
|
||||||
vec3 c11 = COMPAT_TEXTURE(Source, vTexCoord ).rgb;
|
|
||||||
vec3 b11 = (c10+c01+c12+c21)*0.25;
|
|
||||||
|
|
||||||
float contrast = max(max(c11.r,c11.g),c11.b);
|
|
||||||
contrast = mix(2.0*CONTR, CONTR, contrast);
|
|
||||||
|
|
||||||
vec3 mn1 = min(min(c10,c01),min(c12,c21)); mn1 = min(mn1,c11*(1.0-contrast));
|
|
||||||
vec3 mx1 = max(max(c10,c01),max(c12,c21)); mx1 = max(mx1,c11*(1.0+contrast));
|
|
||||||
|
|
||||||
vec3 dif = pow(mx1-mn1+0.0001, vec3(0.75,0.75,0.75));
|
|
||||||
vec3 sharpen = mix(vec3(SHARPEN*DETAILS), vec3(SHARPEN), dif);
|
|
||||||
|
|
||||||
c11 = clamp(mix(c11,b11,-sharpen), mn1,mx1);
|
|
||||||
|
|
||||||
FragColor = vec4(c11,1.0);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
@@ -0,0 +1,178 @@
|
|||||||
|
/*
|
||||||
|
FSR - [RCAS] ROBUST CONTRAST ADAPTIVE SHARPENING
|
||||||
|
Ported from https://www.shadertoy.com/view/stXSWB, MIT license
|
||||||
|
*/
|
||||||
|
|
||||||
|
#pragma parameter FSR_SHARPENING "FSR RCAS Sharpening Amount (Lower = Sharper)" 0.6 0.0 2.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;
|
||||||
|
|
||||||
|
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)
|
||||||
|
|
||||||
|
#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;
|
||||||
|
|
||||||
|
// 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
|
||||||
|
uniform COMPAT_PRECISION float FSR_SHARPENING;
|
||||||
|
#else
|
||||||
|
#define FSR_SHARPENING 0.6
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define FSR_RCAS_LIMIT (0.25-(1.0/16.0))
|
||||||
|
//#define FSR_RCAS_DENOISE
|
||||||
|
|
||||||
|
// Input callback prototypes that need to be implemented by calling shader
|
||||||
|
vec4 FsrRcasLoadF(vec2 p);
|
||||||
|
//------------------------------------------------------------------------------------------------------------------------------
|
||||||
|
void FsrRcasCon(
|
||||||
|
out float con,
|
||||||
|
// The scale is {0.0 := maximum, to N>0, where N is the number of stops (halving) of the reduction of sharpness}.
|
||||||
|
float sharpness
|
||||||
|
){
|
||||||
|
// Transform from stops to linear value.
|
||||||
|
con = exp2(-sharpness);
|
||||||
|
}
|
||||||
|
|
||||||
|
vec3 FsrRcasF(
|
||||||
|
vec2 ip, // Integer pixel position in output.
|
||||||
|
float con
|
||||||
|
)
|
||||||
|
{
|
||||||
|
// Constant generated by RcasSetup().
|
||||||
|
// Algorithm uses minimal 3x3 pixel neighborhood.
|
||||||
|
// b
|
||||||
|
// d e f
|
||||||
|
// h
|
||||||
|
vec2 sp = vec2(ip);
|
||||||
|
vec3 b = FsrRcasLoadF(sp + vec2( 0,-1)).rgb;
|
||||||
|
vec3 d = FsrRcasLoadF(sp + vec2(-1, 0)).rgb;
|
||||||
|
vec3 e = FsrRcasLoadF(sp).rgb;
|
||||||
|
vec3 f = FsrRcasLoadF(sp+vec2( 1, 0)).rgb;
|
||||||
|
vec3 h = FsrRcasLoadF(sp+vec2( 0, 1)).rgb;
|
||||||
|
// Luma times 2.
|
||||||
|
float bL = b.g + .5 * (b.b + b.r);
|
||||||
|
float dL = d.g + .5 * (d.b + d.r);
|
||||||
|
float eL = e.g + .5 * (e.b + e.r);
|
||||||
|
float fL = f.g + .5 * (f.b + f.r);
|
||||||
|
float hL = h.g + .5 * (h.b + h.r);
|
||||||
|
// Noise detection.
|
||||||
|
float nz = .25 * (bL + dL + fL + hL) - eL;
|
||||||
|
nz=clamp(
|
||||||
|
abs(nz)
|
||||||
|
/(
|
||||||
|
max(max(bL,dL),max(eL,max(fL,hL)))
|
||||||
|
-min(min(bL,dL),min(eL,min(fL,hL)))
|
||||||
|
),
|
||||||
|
0., 1.
|
||||||
|
);
|
||||||
|
nz=1.-.5*nz;
|
||||||
|
// Min and max of ring.
|
||||||
|
vec3 mn4 = min(b, min(f, h));
|
||||||
|
vec3 mx4 = max(b, max(f, h));
|
||||||
|
// Immediate constants for peak range.
|
||||||
|
vec2 peakC = vec2(1., -4.);
|
||||||
|
// Limiters, these need to be high precision RCPs.
|
||||||
|
vec3 hitMin = mn4 / (4. * mx4);
|
||||||
|
vec3 hitMax = (peakC.x - mx4) / (4.* mn4 + peakC.y);
|
||||||
|
vec3 lobeRGB = max(-hitMin, hitMax);
|
||||||
|
float lobe = max(
|
||||||
|
-FSR_RCAS_LIMIT,
|
||||||
|
min(max(lobeRGB.r, max(lobeRGB.g, lobeRGB.b)), 0.)
|
||||||
|
)*con;
|
||||||
|
// Apply noise removal.
|
||||||
|
#ifdef FSR_RCAS_DENOISE
|
||||||
|
lobe *= nz;
|
||||||
|
#endif
|
||||||
|
// Resolve, which needs the medium precision rcp approximation to avoid visible tonality changes.
|
||||||
|
return (lobe * (b + d + h + f) + e) / (4. * lobe + 1.);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
vec4 FsrRcasLoadF(vec2 p) {
|
||||||
|
return COMPAT_TEXTURE(Source,p/OutputSize.xy);
|
||||||
|
}
|
||||||
|
|
||||||
|
void main()
|
||||||
|
{
|
||||||
|
vec2 fragCoord = vTexCoord.xy * OutputSize.xy;
|
||||||
|
|
||||||
|
// Set up constants
|
||||||
|
float con;
|
||||||
|
FsrRcasCon(con, FSR_SHARPENING);
|
||||||
|
|
||||||
|
// Perform RCAS pass
|
||||||
|
vec3 col = FsrRcasF(fragCoord, con);
|
||||||
|
|
||||||
|
FragColor = vec4(col,1);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -78,12 +78,6 @@ uniform COMPAT_PRECISION vec2 InputSize;
|
|||||||
#define SourceSize vec4(TextureSize, 1.0 / TextureSize) //either TextureSize or InputSize
|
#define SourceSize vec4(TextureSize, 1.0 / TextureSize) //either TextureSize or InputSize
|
||||||
#define OutSize vec4(OutputSize, 1.0 / OutputSize)
|
#define OutSize vec4(OutputSize, 1.0 / OutputSize)
|
||||||
|
|
||||||
#ifdef PARAMETER_UNIFORM
|
|
||||||
uniform COMPAT_PRECISION float WHATEVER;
|
|
||||||
#else
|
|
||||||
#define WHATEVER 0.0
|
|
||||||
#endif
|
|
||||||
|
|
||||||
void main()
|
void main()
|
||||||
{
|
{
|
||||||
gl_Position = MVPMatrix * VertexCoord;
|
gl_Position = MVPMatrix * VertexCoord;
|
||||||
@@ -120,6 +114,7 @@ uniform COMPAT_PRECISION vec2 TextureSize;
|
|||||||
uniform COMPAT_PRECISION vec2 InputSize;
|
uniform COMPAT_PRECISION vec2 InputSize;
|
||||||
uniform sampler2D Texture;
|
uniform sampler2D Texture;
|
||||||
COMPAT_VARYING vec4 TEX0;
|
COMPAT_VARYING vec4 TEX0;
|
||||||
|
// in variables go here as COMPAT_VARYING whatever
|
||||||
|
|
||||||
// compatibility #defines
|
// compatibility #defines
|
||||||
#define Source Texture
|
#define Source Texture
|
||||||
@@ -181,7 +176,6 @@ void main()
|
|||||||
// x|G|H|I|x
|
// x|G|H|I|x
|
||||||
// -|x|x|x|-
|
// -|x|x|x|-
|
||||||
|
|
||||||
vec2 scale = OutputSize.xy * SourceSize.zw;
|
|
||||||
vec2 pos = fract(vTexCoord * SourceSize.xy) - vec2(0.5, 0.5);
|
vec2 pos = fract(vTexCoord * SourceSize.xy) - vec2(0.5, 0.5);
|
||||||
vec2 coord = vTexCoord - pos * SourceSize.zw;
|
vec2 coord = vTexCoord - pos * SourceSize.zw;
|
||||||
|
|
||||||
@@ -207,8 +201,8 @@ void main()
|
|||||||
// -|-|x|x|-
|
// -|-|x|x|-
|
||||||
if (!((eq(E,F) && eq(H,I)) || (eq(E,H) && eq(F,I))))
|
if (!((eq(E,F) && eq(H,I)) || (eq(E,H) && eq(F,I))))
|
||||||
{
|
{
|
||||||
float dist_H_F = DistYCbCr(G, E) + DistYCbCr(E, C) + DistYCbCr(P(0,2), I) + DistYCbCr(I, P(2.,0.)) + (4.0 * DistYCbCr(H, F));
|
float dist_H_F = DistYCbCr(G, E) + DistYCbCr(E, C) + DistYCbCr(P(0.,2.), I) + DistYCbCr(I, P(2.,0.)) + (4.0 * DistYCbCr(H, F));
|
||||||
float dist_E_I = DistYCbCr(D, H) + DistYCbCr(H, P(1,2)) + DistYCbCr(B, F) + DistYCbCr(F, P(2.,1.)) + (4.0 * DistYCbCr(E, I));
|
float dist_E_I = DistYCbCr(D, H) + DistYCbCr(H, P(1.,2.)) + DistYCbCr(B, F) + DistYCbCr(F, P(2.,1.)) + (4.0 * DistYCbCr(E, I));
|
||||||
bool dominantGradient = (DOMINANT_DIRECTION_THRESHOLD * dist_H_F) < dist_E_I;
|
bool dominantGradient = (DOMINANT_DIRECTION_THRESHOLD * dist_H_F) < dist_E_I;
|
||||||
blendResult.z = ((dist_H_F < dist_E_I) && neq(E,F) && neq(E,H)) ? ((dominantGradient) ? BLEND_DOMINANT : BLEND_NORMAL) : BLEND_NONE;
|
blendResult.z = ((dist_H_F < dist_E_I) && neq(E,F) && neq(E,H)) ? ((dominantGradient) ? BLEND_DOMINANT : BLEND_NORMAL) : BLEND_NONE;
|
||||||
}
|
}
|
||||||
@@ -234,7 +228,7 @@ void main()
|
|||||||
// -|-|-|-|-
|
// -|-|-|-|-
|
||||||
if (!((eq(B,C) && eq(E,F)) || (eq(B,E) && eq(C,F))))
|
if (!((eq(B,C) && eq(E,F)) || (eq(B,E) && eq(C,F))))
|
||||||
{
|
{
|
||||||
float dist_E_C = DistYCbCr(D, B) + DistYCbCr(B, P(1.,-2.)) + DistYCbCr(H, F) + DistYCbCr(F, P(2.,-1.)) + (4.0 * DistYCbCr(E, C));
|
float dist_E_C = DistYCbCr(D, B) + DistYCbCr(B, P(1,-2)) + DistYCbCr(H, F) + DistYCbCr(F, P(2.,-1.)) + (4.0 * DistYCbCr(E, C));
|
||||||
float dist_B_F = DistYCbCr(A, E) + DistYCbCr(E, I) + DistYCbCr(P(0.,-2.), C) + DistYCbCr(C, P(2.,0.)) + (4.0 * DistYCbCr(B, F));
|
float dist_B_F = DistYCbCr(A, E) + DistYCbCr(E, I) + DistYCbCr(P(0.,-2.), C) + DistYCbCr(C, P(2.,0.)) + (4.0 * DistYCbCr(B, F));
|
||||||
bool dominantGradient = (DOMINANT_DIRECTION_THRESHOLD * dist_B_F) < dist_E_C;
|
bool dominantGradient = (DOMINANT_DIRECTION_THRESHOLD * dist_B_F) < dist_E_C;
|
||||||
blendResult.y = ((dist_E_C > dist_B_F) && neq(E,B) && neq(E,F)) ? ((dominantGradient) ? BLEND_DOMINANT : BLEND_NORMAL) : BLEND_NONE;
|
blendResult.y = ((dist_E_C > dist_B_F) && neq(E,B) && neq(E,F)) ? ((dominantGradient) ? BLEND_DOMINANT : BLEND_NORMAL) : BLEND_NONE;
|
||||||
@@ -253,34 +247,27 @@ void main()
|
|||||||
blendResult.x = ((dist_D_B < dist_A_E) && neq(E,D) && neq(E,B)) ? ((dominantGradient) ? BLEND_DOMINANT : BLEND_NORMAL) : BLEND_NONE;
|
blendResult.x = ((dist_D_B < dist_A_E) && neq(E,D) && neq(E,B)) ? ((dominantGradient) ? BLEND_DOMINANT : BLEND_NORMAL) : BLEND_NONE;
|
||||||
}
|
}
|
||||||
|
|
||||||
vec3 res = E;
|
FragColor = vec4(blendResult);
|
||||||
|
|
||||||
// Pixel Tap Mapping: -|-|-|-|-
|
// Pixel Tap Mapping: -|-|-|-|-
|
||||||
// -|-|B|C|-
|
// -|-|B|C|-
|
||||||
// -|D|E|F|x
|
// -|D|E|F|x
|
||||||
// -|G|H|I|x
|
// -|G|H|I|x
|
||||||
// -|-|x|x|-
|
// -|-|x|x|-
|
||||||
if(blendResult.z != BLEND_NONE)
|
if(blendResult.z == BLEND_DOMINANT || (blendResult.z == BLEND_NORMAL &&
|
||||||
|
!((blendResult.y != BLEND_NONE && !IsPixEqual(E, G)) || (blendResult.w != BLEND_NONE && !IsPixEqual(E, C)) ||
|
||||||
|
(IsPixEqual(G, H) && IsPixEqual(H, I) && IsPixEqual(I, F) && IsPixEqual(F, C) && !IsPixEqual(E, I)))))
|
||||||
{
|
{
|
||||||
|
FragColor.z += 4.0;
|
||||||
|
|
||||||
float dist_F_G = DistYCbCr(F, G);
|
float dist_F_G = DistYCbCr(F, G);
|
||||||
float dist_H_C = DistYCbCr(H, C);
|
float dist_H_C = DistYCbCr(H, C);
|
||||||
bool doLineBlend = (blendResult.z == BLEND_DOMINANT ||
|
|
||||||
!((blendResult.y != BLEND_NONE && !IsPixEqual(E, G)) || (blendResult.w != BLEND_NONE && !IsPixEqual(E, C)) ||
|
|
||||||
(IsPixEqual(G, H) && IsPixEqual(H, I) && IsPixEqual(I, F) && IsPixEqual(F, C) && !IsPixEqual(E, I))));
|
|
||||||
|
|
||||||
vec2 origin = vec2(0.0, 1.0 / sqrt(2.0));
|
if((STEEP_DIRECTION_THRESHOLD * dist_F_G <= dist_H_C) && neq(E,G) && neq(D,G))
|
||||||
vec2 direction = vec2(1.0, -1.0);
|
FragColor.z += 16.0;
|
||||||
if(doLineBlend)
|
|
||||||
{
|
|
||||||
bool haveShallowLine = (STEEP_DIRECTION_THRESHOLD * dist_F_G <= dist_H_C) && neq(E,G) && neq(D,G);
|
|
||||||
bool haveSteepLine = (STEEP_DIRECTION_THRESHOLD * dist_H_C <= dist_F_G) && neq(E,C) && neq(B,C);
|
|
||||||
origin = haveShallowLine? vec2(0.0, 0.25) : vec2(0.0, 0.5);
|
|
||||||
direction.x += haveShallowLine? 1.0: 0.0;
|
|
||||||
direction.y -= haveSteepLine? 1.0: 0.0;
|
|
||||||
}
|
|
||||||
|
|
||||||
vec3 blendPix = mix(H,F, step(DistYCbCr(E, F), DistYCbCr(E, H)));
|
if((STEEP_DIRECTION_THRESHOLD * dist_H_C <= dist_F_G) && neq(E,C) && neq(B,C))
|
||||||
res = mix(res, blendPix, get_left_ratio(pos, origin, direction, scale));
|
FragColor.z += 64.0;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Pixel Tap Mapping: -|-|-|-|-
|
// Pixel Tap Mapping: -|-|-|-|-
|
||||||
@@ -288,29 +275,20 @@ void main()
|
|||||||
// x|D|E|F|-
|
// x|D|E|F|-
|
||||||
// x|G|H|I|-
|
// x|G|H|I|-
|
||||||
// -|x|x|-|-
|
// -|x|x|-|-
|
||||||
if(blendResult.w != BLEND_NONE)
|
if(blendResult.w == BLEND_DOMINANT || (blendResult.w == BLEND_NORMAL &&
|
||||||
|
!((blendResult.z != BLEND_NONE && !IsPixEqual(E, A)) || (blendResult.x != BLEND_NONE && !IsPixEqual(E, I)) ||
|
||||||
|
(IsPixEqual(A, D) && IsPixEqual(D, G) && IsPixEqual(G, H) && IsPixEqual(H, I) && !IsPixEqual(E, G)))))
|
||||||
{
|
{
|
||||||
|
FragColor.w += 4.0;
|
||||||
|
|
||||||
float dist_H_A = DistYCbCr(H, A);
|
float dist_H_A = DistYCbCr(H, A);
|
||||||
float dist_D_I = DistYCbCr(D, I);
|
float dist_D_I = DistYCbCr(D, I);
|
||||||
bool doLineBlend = (blendResult.w == BLEND_DOMINANT ||
|
|
||||||
!((blendResult.z != BLEND_NONE && !IsPixEqual(E, A)) || (blendResult.x != BLEND_NONE && !IsPixEqual(E, I)) ||
|
|
||||||
(IsPixEqual(A, D) && IsPixEqual(D, G) && IsPixEqual(G, H) && IsPixEqual(H, I) && !IsPixEqual(E, G))));
|
|
||||||
|
|
||||||
vec2 origin = vec2(-1.0 / sqrt(2.0), 0.0);
|
if((STEEP_DIRECTION_THRESHOLD * dist_H_A <= dist_D_I) && neq(E,A) && neq(B,A))
|
||||||
vec2 direction = vec2(1.0, 1.0);
|
FragColor.w += 16.0;
|
||||||
if(doLineBlend)
|
|
||||||
{
|
|
||||||
bool haveShallowLine = (STEEP_DIRECTION_THRESHOLD * dist_H_A <= dist_D_I) && neq(E,A) && neq(B,A);
|
|
||||||
bool haveSteepLine = (STEEP_DIRECTION_THRESHOLD * dist_D_I <= dist_H_A) && neq(E,I) && neq(F,I);
|
|
||||||
origin = haveShallowLine? vec2(-0.25, 0.0) : vec2(-0.5, 0.0);
|
|
||||||
direction.y += haveShallowLine? 1.0: 0.0;
|
|
||||||
direction.x += haveSteepLine? 1.0: 0.0;
|
|
||||||
}
|
|
||||||
origin = origin;
|
|
||||||
direction = direction;
|
|
||||||
|
|
||||||
vec3 blendPix = mix(H,D, step(DistYCbCr(E, D), DistYCbCr(E, H)));
|
if((STEEP_DIRECTION_THRESHOLD * dist_D_I <= dist_H_A) && neq(E,I) && neq(F,I))
|
||||||
res = mix(res, blendPix, get_left_ratio(pos, origin, direction, scale));
|
FragColor.w += 64.0;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Pixel Tap Mapping: -|-|x|x|-
|
// Pixel Tap Mapping: -|-|x|x|-
|
||||||
@@ -318,28 +296,20 @@ void main()
|
|||||||
// -|D|E|F|x
|
// -|D|E|F|x
|
||||||
// -|-|H|I|-
|
// -|-|H|I|-
|
||||||
// -|-|-|-|-
|
// -|-|-|-|-
|
||||||
if(blendResult.y != BLEND_NONE)
|
if(blendResult.y == BLEND_DOMINANT || (blendResult.y == BLEND_NORMAL &&
|
||||||
|
!((blendResult.x != BLEND_NONE && !IsPixEqual(E, I)) || (blendResult.z != BLEND_NONE && !IsPixEqual(E, A)) ||
|
||||||
|
(IsPixEqual(I, F) && IsPixEqual(F, C) && IsPixEqual(C, B) && IsPixEqual(B, A) && !IsPixEqual(E, C)))))
|
||||||
{
|
{
|
||||||
|
FragColor.y += 4.0;
|
||||||
|
|
||||||
float dist_B_I = DistYCbCr(B, I);
|
float dist_B_I = DistYCbCr(B, I);
|
||||||
float dist_F_A = DistYCbCr(F, A);
|
float dist_F_A = DistYCbCr(F, A);
|
||||||
bool doLineBlend = (blendResult.y == BLEND_DOMINANT ||
|
|
||||||
!((blendResult.x != BLEND_NONE && !IsPixEqual(E, I)) || (blendResult.z != BLEND_NONE && !IsPixEqual(E, A)) ||
|
|
||||||
(IsPixEqual(I, F) && IsPixEqual(F, C) && IsPixEqual(C, B) && IsPixEqual(B, A) && !IsPixEqual(E, C))));
|
|
||||||
|
|
||||||
vec2 origin = vec2(1.0 / sqrt(2.0), 0.0);
|
if((STEEP_DIRECTION_THRESHOLD * dist_B_I <= dist_F_A) && neq(E,I) && neq(H,I))
|
||||||
vec2 direction = vec2(-1.0, -1.0);
|
FragColor.y += 16.0;
|
||||||
|
|
||||||
if(doLineBlend)
|
if((STEEP_DIRECTION_THRESHOLD * dist_F_A <= dist_B_I) && neq(E,A) && neq(D,A))
|
||||||
{
|
FragColor.y += 64.0;
|
||||||
bool haveShallowLine = (STEEP_DIRECTION_THRESHOLD * dist_B_I <= dist_F_A) && neq(E,I) && neq(H,I);
|
|
||||||
bool haveSteepLine = (STEEP_DIRECTION_THRESHOLD * dist_F_A <= dist_B_I) && neq(E,A) && neq(D,A);
|
|
||||||
origin = haveShallowLine? vec2(0.25, 0.0) : vec2(0.5, 0.0);
|
|
||||||
direction.y -= haveShallowLine? 1.0: 0.0;
|
|
||||||
direction.x -= haveSteepLine? 1.0: 0.0;
|
|
||||||
}
|
|
||||||
|
|
||||||
vec3 blendPix = mix(F,B, step(DistYCbCr(E, B), DistYCbCr(E, F)));
|
|
||||||
res = mix(res, blendPix, get_left_ratio(pos, origin, direction, scale));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Pixel Tap Mapping: -|x|x|-|-
|
// Pixel Tap Mapping: -|x|x|-|-
|
||||||
@@ -347,29 +317,21 @@ void main()
|
|||||||
// x|D|E|F|-
|
// x|D|E|F|-
|
||||||
// -|G|H|-|-
|
// -|G|H|-|-
|
||||||
// -|-|-|-|-
|
// -|-|-|-|-
|
||||||
if(blendResult.x != BLEND_NONE)
|
if(blendResult.x == BLEND_DOMINANT || (blendResult.x == BLEND_NORMAL &&
|
||||||
|
!((blendResult.w != BLEND_NONE && !IsPixEqual(E, C)) || (blendResult.y != BLEND_NONE && !IsPixEqual(E, G)) ||
|
||||||
|
(IsPixEqual(C, B) && IsPixEqual(B, A) && IsPixEqual(A, D) && IsPixEqual(D, G) && !IsPixEqual(E, A)))))
|
||||||
{
|
{
|
||||||
|
FragColor.x += 4.0;
|
||||||
|
|
||||||
float dist_D_C = DistYCbCr(D, C);
|
float dist_D_C = DistYCbCr(D, C);
|
||||||
float dist_B_G = DistYCbCr(B, G);
|
float dist_B_G = DistYCbCr(B, G);
|
||||||
bool doLineBlend = (blendResult.x == BLEND_DOMINANT ||
|
|
||||||
!((blendResult.w != BLEND_NONE && !IsPixEqual(E, C)) || (blendResult.y != BLEND_NONE && !IsPixEqual(E, G)) ||
|
|
||||||
(IsPixEqual(C, B) && IsPixEqual(B, A) && IsPixEqual(A, D) && IsPixEqual(D, G) && !IsPixEqual(E, A))));
|
|
||||||
|
|
||||||
vec2 origin = vec2(0.0, -1.0 / sqrt(2.0));
|
if((STEEP_DIRECTION_THRESHOLD * dist_D_C <= dist_B_G) && neq(E,C) && neq(F,C))
|
||||||
vec2 direction = vec2(-1.0, 1.0);
|
FragColor.x += 16.0;
|
||||||
if(doLineBlend)
|
|
||||||
{
|
if((STEEP_DIRECTION_THRESHOLD * dist_B_G <= dist_D_C) && neq(E,G) && neq(H,G))
|
||||||
bool haveShallowLine = (STEEP_DIRECTION_THRESHOLD * dist_D_C <= dist_B_G) && neq(E,C) && neq(F,C);
|
FragColor.x += 64.0;
|
||||||
bool haveSteepLine = (STEEP_DIRECTION_THRESHOLD * dist_B_G <= dist_D_C) && neq(E,G) && neq(H,G);
|
|
||||||
origin = haveShallowLine? vec2(0.0, -0.25) : vec2(0.0, -0.5);
|
|
||||||
direction.x -= haveShallowLine? 1.0: 0.0;
|
|
||||||
direction.y += haveSteepLine? 1.0: 0.0;
|
|
||||||
}
|
}
|
||||||
|
FragColor /= 255.0;
|
||||||
vec3 blendPix = mix(D,B, step(DistYCbCr(E, B), DistYCbCr(E, D)));
|
|
||||||
res = mix(res, blendPix, get_left_ratio(pos, origin, direction, scale));
|
|
||||||
}
|
|
||||||
|
|
||||||
FragColor = vec4(res, 1.0);
|
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@@ -0,0 +1,277 @@
|
|||||||
|
/*
|
||||||
|
Hyllian's xBR-vertex code and texel mapping
|
||||||
|
|
||||||
|
Copyright (C) 2011/2016 Hyllian - sergiogdb@gmail.com
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in
|
||||||
|
all copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
THE SOFTWARE.
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
// This shader also uses code and/or concepts from xBRZ as it appears
|
||||||
|
// in the Desmume source code. The license for which is as follows:
|
||||||
|
|
||||||
|
// ****************************************************************************
|
||||||
|
// * This file is part of the HqMAME project. It is distributed under *
|
||||||
|
// * GNU General Public License: http://www.gnu.org/licenses/gpl-3.0 *
|
||||||
|
// * Copyright (C) Zenju (zenju AT gmx DOT de) - All Rights Reserved *
|
||||||
|
// * *
|
||||||
|
// * Additionally and as a special exception, the author gives permission *
|
||||||
|
// * to link the code of this program with the MAME library (or with modified *
|
||||||
|
// * versions of MAME that use the same license as MAME), and distribute *
|
||||||
|
// * linked combinations including the two. You must obey the GNU General *
|
||||||
|
// * Public License in all respects for all of the code used other than MAME. *
|
||||||
|
// * If you modify this file, you may extend this exception to your version *
|
||||||
|
// * of the file, but you are not obligated to do so. If you do not wish to *
|
||||||
|
// * do so, delete this exception statement from your version. *
|
||||||
|
// ****************************************************************************
|
||||||
|
|
||||||
|
#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;
|
||||||
|
|
||||||
|
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;
|
||||||
|
|
||||||
|
// compatibility #defines
|
||||||
|
#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;
|
||||||
|
TEX0.xy = TexCoord.xy * 1.0001;
|
||||||
|
}
|
||||||
|
|
||||||
|
#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 COMPAT_PRECISION vec4 FragColor;
|
||||||
|
#else
|
||||||
|
#define COMPAT_VARYING varying
|
||||||
|
#define FragColor gl_FragColor
|
||||||
|
#define COMPAT_TEXTURE texture2D
|
||||||
|
#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;
|
||||||
|
uniform sampler2D PassPrev2Texture;
|
||||||
|
uniform COMPAT_PRECISION vec2 PassPrev2TextureSize;
|
||||||
|
COMPAT_VARYING vec4 TEX0;
|
||||||
|
|
||||||
|
// 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)
|
||||||
|
#define OriginalSize vec4(PassPrev2TextureSize, 1.0 / PassPrev2TextureSize)
|
||||||
|
|
||||||
|
#define BLEND_NONE 0.
|
||||||
|
#define BLEND_NORMAL 1.
|
||||||
|
#define BLEND_DOMINANT 2.
|
||||||
|
#define LUMINANCE_WEIGHT 1.0
|
||||||
|
#define EQUAL_COLOR_TOLERANCE 30.0/255.0
|
||||||
|
#define STEEP_DIRECTION_THRESHOLD 2.2
|
||||||
|
#define DOMINANT_DIRECTION_THRESHOLD 3.6
|
||||||
|
|
||||||
|
float DistYCbCr(vec3 pixA, vec3 pixB)
|
||||||
|
{
|
||||||
|
const vec3 w = vec3(0.2627, 0.6780, 0.0593);
|
||||||
|
const float scaleB = 0.5 / (1.0 - w.b);
|
||||||
|
const float scaleR = 0.5 / (1.0 - w.r);
|
||||||
|
vec3 diff = pixA - pixB;
|
||||||
|
float Y = dot(diff.rgb, w);
|
||||||
|
float Cb = scaleB * (diff.b - Y);
|
||||||
|
float Cr = scaleR * (diff.r - Y);
|
||||||
|
|
||||||
|
return sqrt(((LUMINANCE_WEIGHT * Y) * (LUMINANCE_WEIGHT * Y)) + (Cb * Cb) + (Cr * Cr));
|
||||||
|
}
|
||||||
|
|
||||||
|
bool IsPixEqual(const vec3 pixA, const vec3 pixB)
|
||||||
|
{
|
||||||
|
return (DistYCbCr(pixA, pixB) < EQUAL_COLOR_TOLERANCE);
|
||||||
|
}
|
||||||
|
|
||||||
|
float get_left_ratio(vec2 center, vec2 origin, vec2 direction, vec2 scale)
|
||||||
|
{
|
||||||
|
vec2 P0 = center - origin;
|
||||||
|
vec2 proj = direction * (dot(P0, direction) / dot(direction, direction));
|
||||||
|
vec2 distv = P0 - proj;
|
||||||
|
vec2 orth = vec2(-direction.y, direction.x);
|
||||||
|
float side = sign(dot(P0, orth));
|
||||||
|
float v = side * length(distv * scale);
|
||||||
|
|
||||||
|
// return step(0, v);
|
||||||
|
return smoothstep(-sqrt(2.0)/2.0, sqrt(2.0)/2.0, v);
|
||||||
|
}
|
||||||
|
|
||||||
|
#define eq(a,b) (a == b)
|
||||||
|
#define neq(a,b) (a != b)
|
||||||
|
|
||||||
|
#define P(x,y) COMPAT_TEXTURE(PassPrev2Texture, coord + OriginalSize.zw * vec2(x, y)).rgb
|
||||||
|
|
||||||
|
void main()
|
||||||
|
{
|
||||||
|
//---------------------------------------
|
||||||
|
// Input Pixel Mapping: -|B|-
|
||||||
|
// D|E|F
|
||||||
|
// -|H|-
|
||||||
|
|
||||||
|
vec2 scale = OutputSize.xy * OriginalSize.zw;
|
||||||
|
vec2 pos = fract(vTexCoord * OriginalSize.xy) - vec2(0.5, 0.5);
|
||||||
|
vec2 coord = vTexCoord - pos * OriginalSize.zw;
|
||||||
|
|
||||||
|
vec3 B = P( 0.,-1.);
|
||||||
|
vec3 D = P(-1., 0.);
|
||||||
|
vec3 E = P( 0., 0.);
|
||||||
|
vec3 F = P( 1., 0.);
|
||||||
|
vec3 H = P( 0., 1.);
|
||||||
|
|
||||||
|
vec4 info = floor(COMPAT_TEXTURE(Source, coord) * 255.0 + 0.5);
|
||||||
|
|
||||||
|
// info Mapping: x|y|
|
||||||
|
// w|z|
|
||||||
|
|
||||||
|
vec4 blendResult = floor(mod(info, 4.0));
|
||||||
|
vec4 doLineBlend = floor(mod(info / 4.0, 4.0));
|
||||||
|
vec4 haveShallowLine = floor(mod(info / 16.0, 4.0));
|
||||||
|
vec4 haveSteepLine = floor(mod(info / 64.0, 4.0));
|
||||||
|
|
||||||
|
vec3 res = E;
|
||||||
|
|
||||||
|
// Pixel Tap Mapping: -|-|-
|
||||||
|
// -|E|F
|
||||||
|
// -|H|-
|
||||||
|
|
||||||
|
if(blendResult.z > BLEND_NONE)
|
||||||
|
{
|
||||||
|
vec2 origin = vec2(0.0, 1.0 / sqrt(2.0));
|
||||||
|
vec2 direction = vec2(1.0, -1.0);
|
||||||
|
if(doLineBlend.z > 0.0)
|
||||||
|
{
|
||||||
|
origin = haveShallowLine.z > 0.0? vec2(0.0, 0.25) : vec2(0.0, 0.5);
|
||||||
|
direction.x += haveShallowLine.z;
|
||||||
|
direction.y -= haveSteepLine.z;
|
||||||
|
}
|
||||||
|
|
||||||
|
vec3 blendPix = mix(H,F, step(DistYCbCr(E, F), DistYCbCr(E, H)));
|
||||||
|
res = mix(res, blendPix, get_left_ratio(pos, origin, direction, scale));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Pixel Tap Mapping: -|-|-
|
||||||
|
// D|E|-
|
||||||
|
// -|H|-
|
||||||
|
if(blendResult.w > BLEND_NONE)
|
||||||
|
{
|
||||||
|
vec2 origin = vec2(-1.0 / sqrt(2.0), 0.0);
|
||||||
|
vec2 direction = vec2(1.0, 1.0);
|
||||||
|
if(doLineBlend.w > 0.0)
|
||||||
|
{
|
||||||
|
origin = haveShallowLine.w > 0.0? vec2(-0.25, 0.0) : vec2(-0.5, 0.0);
|
||||||
|
direction.y += haveShallowLine.w;
|
||||||
|
direction.x += haveSteepLine.w;
|
||||||
|
}
|
||||||
|
|
||||||
|
vec3 blendPix = mix(H,D, step(DistYCbCr(E, D), DistYCbCr(E, H)));
|
||||||
|
res = mix(res, blendPix, get_left_ratio(pos, origin, direction, scale));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Pixel Tap Mapping: -|B|-
|
||||||
|
// -|E|F
|
||||||
|
// -|-|-
|
||||||
|
if(blendResult.y > BLEND_NONE)
|
||||||
|
{
|
||||||
|
vec2 origin = vec2(1.0 / sqrt(2.0), 0.0);
|
||||||
|
vec2 direction = vec2(-1.0, -1.0);
|
||||||
|
|
||||||
|
if(doLineBlend.y > 0.0)
|
||||||
|
{
|
||||||
|
origin = haveShallowLine.y > 0.0? vec2(0.25, 0.0) : vec2(0.5, 0.0);
|
||||||
|
direction.y -= haveShallowLine.y;
|
||||||
|
direction.x -= haveSteepLine.y;
|
||||||
|
}
|
||||||
|
|
||||||
|
vec3 blendPix = mix(F,B, step(DistYCbCr(E, B), DistYCbCr(E, F)));
|
||||||
|
res = mix(res, blendPix, get_left_ratio(pos, origin, direction, scale));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Pixel Tap Mapping: -|B|-
|
||||||
|
// D|E|-
|
||||||
|
// -|-|-
|
||||||
|
if(blendResult.x > BLEND_NONE)
|
||||||
|
{
|
||||||
|
vec2 origin = vec2(0.0, -1.0 / sqrt(2.0));
|
||||||
|
vec2 direction = vec2(-1.0, 1.0);
|
||||||
|
if(doLineBlend.x > 0.0)
|
||||||
|
{
|
||||||
|
origin = haveShallowLine.x > 0.0? vec2(0.0, -0.25) : vec2(0.0, -0.5);
|
||||||
|
direction.x -= haveShallowLine.x;
|
||||||
|
direction.y += haveSteepLine.x;
|
||||||
|
}
|
||||||
|
|
||||||
|
vec3 blendPix = mix(D,B, step(DistYCbCr(E, B), DistYCbCr(E, D)));
|
||||||
|
res = mix(res, blendPix, get_left_ratio(pos, origin, direction, scale));
|
||||||
|
}
|
||||||
|
|
||||||
|
FragColor = vec4(res, 1.0);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
Binary file not shown.
Reference in New Issue
Block a user