Skip to content

Commit

Permalink
Added CRT filter post-processing effect.
Browse files Browse the repository at this point in the history
Rinnegatamante committed Aug 17, 2023
1 parent ec0c55f commit ea36933
Showing 5 changed files with 87 additions and 0 deletions.
1 change: 1 addition & 0 deletions Data/DaedalusX64/Shaders/CRT/desc.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Advanced CRT filter.
66 changes: 66 additions & 0 deletions Data/DaedalusX64/Shaders/CRT/frag.cg
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
/*
Source: https://www.shadertoy.com/view/Ms23DR
*/

float2 curve(float2 uv)
{
uv = (uv - 0.5) * 2.0;
uv *= 1.1;
uv.x *= 1.0 + pow((abs(uv.y) / 5.0), 2.0);
uv.y *= 1.0 + pow((abs(uv.x) / 4.0), 2.0);
uv = (uv / 2.0) + 0.5;
uv = uv *0.92 + 0.04;
return uv;
}

varying out float4 fragColor : COLOR;
varying in float2 fragCoord : WPOS;
varying in float2 v_uv : TEXCOORD0;
static float2 iResolution = float2(960.0f, 544.0f);
uniform float iTime;
uniform sampler2D s0;

void main( )
{
float2 q = fragCoord.xy / iResolution.xy;
float2 uv = q;
uv = curve( uv );
// float3 oricol = tex2D( s0, float2(q.x,q.y) ).xyz;
float3 col;
float x = sin(0.3*iTime+uv.y*21.0)*sin(0.7*iTime+uv.y*29.0)*sin(0.3+0.33*iTime+uv.y*31.0)*0.0017;

col.r = tex2D(s0,float2(x+uv.x+0.001,uv.y+0.001)).x+0.05;
col.g = tex2D(s0,float2(x+uv.x+0.000,uv.y-0.002)).y+0.05;
col.b = tex2D(s0,float2(x+uv.x-0.002,uv.y+0.000)).z+0.05;
col.r += 0.08*tex2D(s0,0.75*float2(x+0.025, -0.027)+float2(uv.x+0.001,uv.y+0.001)).x;
col.g += 0.05*tex2D(s0,0.75*float2(x+-0.022, -0.02)+float2(uv.x+0.000,uv.y-0.002)).y;
col.b += 0.08*tex2D(s0,0.75*float2(x+-0.02, -0.018)+float2(uv.x-0.002,uv.y+0.000)).z;

col = clamp(col*0.6+0.4*col*col*1.0,0.0,1.0);

float vig = (0.0 + 1.0*16.0*uv.x*uv.y*(1.0-uv.x)*(1.0-uv.y));
col *= float3(pow(vig,0.3));

col *= float3(0.95,1.05,0.95);
col *= 2.8;

float scans = clamp( 0.35+0.35*sin(3.5*iTime+uv.y*iResolution.y*1.5), 0.0, 1.0);

float s = pow(scans,1.7);
col = col*float3( 0.4+0.7*s) ;

col *= 1.0+0.01*sin(110.0*iTime);
if (uv.x < 0.0 || uv.x > 1.0)
col *= 0.0;
if (uv.y < 0.0 || uv.y > 1.0)
col *= 0.0;

col*=1.0-0.65*float3(clamp((fmod(fragCoord.x, 2.0)-1.0)*2.0,0.0,1.0));

// float comp = smoothstep( 0.1, 0.9, sin(iTime) );

// Remove the next line to stop cross-fade between original and postprocess
// col = mix( col, oricol, comp );

fragColor = float4(col,1.0);
}
14 changes: 14 additions & 0 deletions Data/DaedalusX64/Shaders/CRT/vert.cg
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
/*
Source: https://www.shadertoy.com/view/Ms23DR
*/

void main(
float3 position,
float2 texcoord,
uniform float4x4 gl_ModelViewProjectionMatrix,
out float4 vPosition : POSITION,
out float2 vTexcoord : TEXCOORD0
) {
vPosition = mul(gl_ModelViewProjectionMatrix,float4(position, 1.f));
vTexcoord = texcoord;
}
4 changes: 4 additions & 0 deletions Source/SysVita/Graphics/GraphicsContextVita.cpp
Original file line number Diff line number Diff line change
@@ -36,6 +36,7 @@ uint32_t *gColorBufferPtr;
float *gTexCoordBufferPtr;
bool new_frame = true;

extern int time_unif;
extern float gamma_val;

static GLuint emu_fb = 0xDEADBEEF, emu_fb_tex, emu_depth_buf_tex;
@@ -237,6 +238,9 @@ void IGraphicsContext::UpdateFrame(bool wait_for_vbl)
}
i++;
}
if (time_unif != -1) {
glUniform1f(time_unif, (float)sceKernelGetProcessTimeLow() / 1000000.0f);
}

vglVertexAttribPointerMapped(0, vflux_vertices);
vglVertexAttribPointerMapped(1, vflux_texcoords);
2 changes: 2 additions & 0 deletions Source/SysVita/UI/MenuBarScreen.cpp
Original file line number Diff line number Diff line change
@@ -113,6 +113,7 @@ PostProcessingEffect *effects_list = nullptr;
Overlay *overlays_list = nullptr;

Uniform prog_uniforms[8];
int time_unif = -1;

GLuint ff_icon = 0xDEADBEEF;
/*GLuint achievement_icon = 0xDEADBEEF;
@@ -267,6 +268,7 @@ bool setPostProcessingEffect(int idx, PostProcessingEffect *p) {
glLinkProgram(program[shader_idx]);
cur_prog = program[shader_idx];
glUniform1i(glGetUniformLocation(program[shader_idx], "colorMap"), 0);
time_unif = glGetUniformLocation(cur_prog, "iTime");

if (p->customizable) {
sprintf(fpath, "%s%s/unif.txt", DAEDALUS_VITA_PATH_EXT("ux0:", "Shaders/"), p->name);

0 comments on commit ea36933

Please sign in to comment.