-
Notifications
You must be signed in to change notification settings - Fork 28
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Credits ghogan42: https://forums.libretro.com/t/crt-scanline-shader-for-snes-classic-mini/12664/71 Recommended by BionicLuke
- Loading branch information
Showing
12 changed files
with
1,050 additions
and
0 deletions.
There are no files selected for viewing
120 changes: 120 additions & 0 deletions
120
RetroArch/.retroarch/shaders/shaders_glsl/crt-lcd 720p/sharp_quilez_gamma.glsl
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,120 @@ | ||
// GLSL shader autogenerated by cg2glsl.py. | ||
#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_VARYING float _frame_rotation; | ||
COMPAT_VARYING vec4 _color1; | ||
struct output_dummy { | ||
vec4 _color1; | ||
}; | ||
struct input_dummy { | ||
vec2 _video_size; | ||
vec2 _texture_size; | ||
vec2 _output_dummy_size; | ||
float _frame_count; | ||
float _frame_direction; | ||
float _frame_rotation; | ||
}; | ||
vec4 _oPosition1; | ||
vec4 _r0005; | ||
COMPAT_ATTRIBUTE vec4 VertexCoord; | ||
COMPAT_ATTRIBUTE vec4 COLOR; | ||
COMPAT_ATTRIBUTE vec4 TexCoord; | ||
COMPAT_VARYING vec4 COL0; | ||
COMPAT_VARYING vec4 TEX0; | ||
|
||
uniform mat4 MVPMatrix; | ||
uniform int FrameDirection; | ||
uniform int FrameCount; | ||
uniform COMPAT_PRECISION vec2 OutputSize; | ||
uniform COMPAT_PRECISION vec2 TextureSize; | ||
uniform COMPAT_PRECISION vec2 InputSize; | ||
void main() | ||
{ | ||
vec4 _oColor; | ||
vec2 _otexCoord; | ||
_r0005 = VertexCoord.x*MVPMatrix[0]; | ||
_r0005 = _r0005 + VertexCoord.y*MVPMatrix[1]; | ||
_r0005 = _r0005 + VertexCoord.z*MVPMatrix[2]; | ||
_r0005 = _r0005 + VertexCoord.w*MVPMatrix[3]; | ||
_oPosition1 = _r0005; | ||
_oColor = COLOR; | ||
_otexCoord = TexCoord.xy; | ||
gl_Position = _r0005; | ||
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 | ||
COMPAT_VARYING float _frame_rotation; | ||
COMPAT_VARYING vec4 _color; | ||
struct output_dummy { | ||
vec4 _color; | ||
}; | ||
struct input_dummy { | ||
vec2 _video_size; | ||
vec2 _texture_size; | ||
vec2 _output_dummy_size; | ||
float _frame_count; | ||
float _frame_direction; | ||
float _frame_rotation; | ||
}; | ||
input_dummy _IN1; | ||
uniform sampler2D Texture; | ||
COMPAT_VARYING vec4 TEX0; | ||
|
||
uniform int FrameDirection; | ||
uniform int FrameCount; | ||
uniform COMPAT_PRECISION vec2 OutputSize; | ||
uniform COMPAT_PRECISION vec2 TextureSize; | ||
uniform COMPAT_PRECISION vec2 InputSize; | ||
void main() | ||
{ | ||
vec2 p; | ||
vec2 i; | ||
vec2 f; | ||
output_dummy _OUT; | ||
p = TEX0.xy*TextureSize; | ||
i = floor(p); | ||
f = p - i - 0.5; | ||
p = (i + f*f*f*f*f*16.0 + 0.5)/TextureSize; | ||
_OUT._color = COMPAT_TEXTURE(Texture, p); | ||
_OUT._color.rgb *= (0.84+0.16*_OUT._color.rgb); | ||
FragColor = _OUT._color; | ||
return; | ||
} | ||
#endif |
8 changes: 8 additions & 0 deletions
8
RetroArch/.retroarch/shaders/shaders_glsl/crt-lcd 720p/sharp_quilez_gamma.glslp
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,8 @@ | ||
shaders = "1" | ||
shader0 = "sharp_quilez_gamma.glsl" | ||
filter_linear0 = "true" | ||
wrap_mode0 = "clamp_to_border" | ||
mipmap_input0 = "false" | ||
alias0 = "" | ||
float_framebuffer0 = "false" | ||
srgb_framebuffer0 = "false" |
184 changes: 184 additions & 0 deletions
184
RetroArch/.retroarch/shaders/shaders_glsl/crt-lcd 720p/zfast_crt_720p_PI3.glsl
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,184 @@ | ||
/* | ||
zfast_crt_720p - A very simple CRT shader (Integer Scaling Only version). | ||
Copyright (C) 2017 Greg Hogan (SoltanGris42) | ||
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. | ||
Notes: This shader does high quality scaling along the x-axis using a sharper | ||
variation of the algorithm here: | ||
http://www.iquilezles.org/www/articles/texture/texture.htm. | ||
Designed for the 720p output of the snes classic edition, it assumes that | ||
the game is scaled vertically by an integer factor of 3 and applies a | ||
simple scanline effect. For a more full featured and adjustable CRT shader | ||
at 1080p reolutions or above you should use the ZFAST_CRT shader instead. | ||
*/ | ||
|
||
//For testing compilation | ||
//#define FRAGMENT | ||
//#define VERTEX | ||
#define BLACK_OUT_BORDER | ||
|
||
// Compatibility #ifdefs needed for parameters | ||
#ifdef GL_ES | ||
#define COMPAT_PRECISION mediump | ||
#else | ||
#define COMPAT_PRECISION | ||
#endif | ||
|
||
// Parameter lines go here: | ||
#pragma parameter BLURSCALEX "Blur Amount X-Axis" 0.4 0.0 1.0 0.05 | ||
#pragma parameter SCANMULT "Scanline Multiplier(Low)" 2.6 0.0 10.0 0.2 | ||
#pragma parameter HIGHSCANAMOUNT "Scanline Amount (High)" 0.20 0.0 1.0 0.05 | ||
#pragma parameter MASK_DARK "Mask Effect Amount" 0.15 0.0 1.0 0.05 | ||
#pragma parameter MASK_FADE "Mask/Scanline Fade" 0.8 0.0 1.0 0.05 | ||
#pragma parameter FAKEGAMMA "Fake CRT Gamma Correction" 0.0 0.0 1.0 0.05 | ||
|
||
#ifdef PARAMETER_UNIFORM | ||
// All parameter floats need to have COMPAT_PRECISION in front of them | ||
uniform COMPAT_PRECISION float BLURSCALEX; | ||
uniform COMPAT_PRECISION float SCANMULT; | ||
uniform COMPAT_PRECISION float HIGHSCANAMOUNT; | ||
uniform COMPAT_PRECISION float MASK_DARK; | ||
uniform COMPAT_PRECISION float MASK_FADE; | ||
uniform COMPAT_PRECISION float FAKEGAMMA; | ||
#else | ||
#define BLURSCALEX 0.40 | ||
#define SCANMULT 2.6 | ||
#define HIGHSCANAMOUNT 0.20 | ||
#define MASK_DARK 0.20 | ||
#define MASK_FADE 0.8 | ||
#define FAKEGAMMA 0.0 | ||
#endif | ||
|
||
#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; | ||
// out variables go here as COMPAT_VARYING whatever | ||
COMPAT_VARYING vec2 gammaConst; | ||
COMPAT_VARYING float maskFade; | ||
COMPAT_VARYING vec2 invDims; | ||
|
||
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; | ||
|
||
//Terrible adjustment to texture coordinates. | ||
//Trying to integer scale and center image... | ||
|
||
COMPAT_PRECISION float intScale = floor(OutSize.y/InputSize.y); | ||
COMPAT_PRECISION float adjustTexCoord = OutSize.y/InputSize.y/intScale; | ||
COMPAT_PRECISION vec2 pixelsToMove = vec2(0.5*(OutSize.y-intScale*InputSize.y)*OutSize.x/OutSize.y,0.5*(OutSize.y-intScale*InputSize.y)); | ||
TEX0.xy = (TexCoord.xy)*adjustTexCoord - (pixelsToMove/TextureSize.xy)/intScale; | ||
maskFade = 0.3333*MASK_FADE; | ||
gammaConst = vec2(1.0-0.3*FAKEGAMMA,0.3*FAKEGAMMA); | ||
invDims = 1.0/TextureSize.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; | ||
// in variables go here as COMPAT_VARYING whatever | ||
COMPAT_VARYING vec2 gammaConst; | ||
COMPAT_VARYING float maskFade; | ||
COMPAT_VARYING vec2 invDims; | ||
|
||
// compatibility #defines | ||
#define Source Texture | ||
#define vTexCoord TEX0.xy | ||
#define texture(c, d) COMPAT_TEXTURE(c, d) | ||
#define SourceSize vec4(TextureSize, 1.0 / TextureSize) //either TextureSize or InputSize | ||
#define OutSize vec4(OutputSize, 1.0 / OutputSize) | ||
|
||
void main() | ||
{ | ||
|
||
//This is just like "Quilez Scaling" but sharper | ||
COMPAT_PRECISION vec2 p = vTexCoord * TextureSize; | ||
COMPAT_PRECISION vec2 c = floor(p) + 0.5; | ||
COMPAT_PRECISION vec2 f = p - c; | ||
p = (c + 4.0*f*f*f)*invDims; | ||
p.x = mix( p.x , vTexCoord.x, BLURSCALEX); | ||
|
||
COMPAT_PRECISION vec3 colour = texture(Source, p).rgb; | ||
COMPAT_PRECISION float scanLine = fract(gl_FragCoord.y * 0.333333); | ||
scanLine = (HIGHSCANAMOUNT)*float( scanLine > 0.5); | ||
|
||
COMPAT_PRECISION float whichmask = fract( gl_FragCoord.x*-0.4999); | ||
COMPAT_PRECISION float mask = 1.0 + float(whichmask < 0.5) * -MASK_DARK; | ||
|
||
colour.rgb *= mix( mask*(1.0-scanLine*SCANMULT), 1.0-scanLine, dot(colour.rgb,vec3(maskFade))); | ||
|
||
#if defined(BLACK_OUT_BORDER) | ||
colour.rgb*=float(vTexCoord.x > 0.0)*float(vTexCoord.y > 0.0); //why doesn't the driver do the right thing? | ||
#endif | ||
|
||
FragColor.rgb = colour.rgb; | ||
|
||
} | ||
#endif |
8 changes: 8 additions & 0 deletions
8
RetroArch/.retroarch/shaders/shaders_glsl/crt-lcd 720p/zfast_crt_720p_PI3.glslp
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,8 @@ | ||
shaders = "1" | ||
shader0 = "zfast_crt_720p_PI3.glsl" | ||
filter_linear0 = "true" | ||
wrap_mode0 = "clamp_to_border" | ||
mipmap_input0 = "false" | ||
alias0 = "" | ||
float_framebuffer0 = "false" | ||
srgb_framebuffer0 = "false" |
Oops, something went wrong.