diff --git a/.gitignore b/.gitignore index f7362e9..a9c73a2 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ mini mini_debug +mini_san diff --git a/data/crt.glsl b/data/crt.glsl new file mode 100644 index 0000000..32fed98 --- /dev/null +++ b/data/crt.glsl @@ -0,0 +1,64 @@ +varying vec2 tex_coord; +varying vec2 pix_coord; + +#if defined(VERTEX) + +void main() +{ + pix_coord = vec2(gl_MultiTexCoord0.x, 1.0-gl_MultiTexCoord0.y)*1.0001; + tex_coord = vec2((gl_Vertex.x+1.0)*0.5, (-gl_Vertex.y+1.0)*0.5); + vec4 pos = vec4(gl_Vertex.x * 2.0, gl_Vertex.y * 2.0, gl_Vertex.z, gl_Vertex.w); + gl_Position = gl_Vertex; +} + +#elif defined(FRAGMENT) + +uniform sampler2D Texture; +const vec2 screenRes = vec2(640.0, 480.0); + +void main() +{ + vec2 uv = tex_coord; + + // Curvatura suau de pantalla + vec2 cc = uv - 0.5; + float dist = dot(cc, cc); + uv += cc * dist * 0.05; + + float x = sign(pix_coord.x)*floor(abs(pix_coord.x)+0.5); + float column = mod(x,4.0); + float y = sign(pix_coord.y)*floor(abs(pix_coord.y)+0.5); + float row = mod(y,4.0); + + // El que queda fora de la curvatura, es pinta de negre i a aprendre pel cul + if (uv.x < 0.0 || uv.x > 1.0 || uv.y < 0.0 || uv.y > 1.0) { + gl_FragColor = vec4(0.0, 0.0, 0.0, 1.0); + return; + } + vec4 color = texture2D(Texture, uv); + + // Scanlines + float scanline = sin(uv.y * screenRes.y * 3.14159265) * 0.15; + color.rgb -= scanline; + + // Máscara de subpixels RGB sutil + float pixelX = mod(uv.x * screenRes.x, 3.0); + vec3 mask = vec3(1.0); + if (pixelX < 1.0) { + mask = vec3(1.0, 0.85, 0.85); + } else if (pixelX < 2.0) { + mask = vec3(0.85, 1.0, 0.85); + } else { + mask = vec3(0.85, 0.85, 1.0); + } + color.rgb *= mask; + + // Vignetting per a donar profunditat de tubo CRT + float vignette = uv.x * uv.y * (1.0 - uv.x) * (1.0 - uv.y); + vignette = clamp(pow(16.0 * vignette, 0.25), 0.0, 1.0); + color.rgb *= vignette; + + gl_FragColor = color; +} + +#endif diff --git a/data/lynx.glsl b/data/lynx.glsl index d9ba9d0..1a80577 100644 --- a/data/lynx.glsl +++ b/data/lynx.glsl @@ -8,7 +8,7 @@ void main() pix_coord = vec2(gl_MultiTexCoord0.x, 1.0-gl_MultiTexCoord0.y)*1.0001; tex_coord = vec2((gl_Vertex.x+1.0)*0.5, (-gl_Vertex.y+1.0)*0.5); vec4 pos = vec4(gl_Vertex.x * 2.0, gl_Vertex.y * 2.0, gl_Vertex.z, gl_Vertex.w); - gl_Position = gl_Vertex; //(gl_Vertex*2)-vec3(1.0, 1.0, 1.0);//gl_ModelViewProjectionMatrix * gl_Vertex; + gl_Position = gl_Vertex; } #elif defined(FRAGMENT) @@ -23,27 +23,20 @@ void main() float row = mod(y,4.0); vec4 color = texture2D(Texture, tex_coord); - float xfade = abs((tex_coord.s * 2.0) - 1.0); - xfade = xfade * xfade * xfade * xfade * xfade; - float yfade = abs((tex_coord.t * 2.0) - 1.0); - yfade = yfade * yfade * yfade * yfade * yfade; - color = color + vec4(0.7, 0.7, 0.7, 0.0) * (1.0-tex_coord.t) * (1.0-xfade) * (1.0-yfade); vec4 newcolor; if (column == 0.0) { - newcolor = color * vec4(1.0, 0.4, 0.6, 1.0); - } else if (column == 1.0) { - newcolor = color * vec4(0.4, 1.0, 0.4, 1.0); - } else if (column == 2.0) { - newcolor = color * vec4(0.6, 0.4, 1.0, 1.0); + newcolor = color * vec4(0.95, 0.95, 0.95, 1.0); } else { - newcolor = color * vec4(0.2, 0.2, 0.2, 1.0); + newcolor = color; } if (row == 0.0) { newcolor = newcolor * vec4(0.5, 0.5, 0.5, 1.0); } else if (row == 1.0) { newcolor = newcolor * vec4(0.8, 0.8, 0.8, 1.0); + } else if (row == 3.0) { + newcolor = newcolor * vec4(0.8, 0.8, 0.8, 1.0); } else { newcolor = newcolor; }