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

Verified

This commit was created on GitHub.com and signed with GitHub’s verified signature.
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.