48 lines
1.6 KiB
GLSL
48 lines
1.6 KiB
GLSL
#version 330
|
|
|
|
in vec2 fragTexCoord;
|
|
in vec4 fragColor;
|
|
|
|
out vec4 finalColor;
|
|
|
|
uniform sampler2D texture0;
|
|
uniform vec4 colDiffuse;
|
|
|
|
// Adjust these values to tweak the aesthetic:
|
|
const float SCANLINE_INTENSITY = 0.25; // Lower value = softer lines (0.08 to 0.20)
|
|
const float BLOOM_AMOUNT = 0.10; // Slight phosphor bleed/glow
|
|
const float CRT_CURVATURE = 0.03; // Subtle screen bulge (0.0 = flat)
|
|
|
|
void main() {
|
|
// 1. Subtle screen curvature distortion
|
|
vec2 uv = fragTexCoord;
|
|
vec2 dc = abs(0.5 - uv);
|
|
uv.x += uv.x * (dc.y * dc.y) * CRT_CURVATURE;
|
|
uv.y += uv.y * (dc.x * dc.x) * CRT_CURVATURE;
|
|
|
|
// Discard pixels outside the curved screen bounds
|
|
if (uv.x < 0.0 || uv.x > 1.0 || uv.y < 0.0 || uv.y > 1.0) {
|
|
finalColor = vec4(0.0, 0.0, 0.0, 1.0);
|
|
return;
|
|
}
|
|
|
|
// 2. Sample pixel with slight horizontal blur (Phosphor bleed)
|
|
vec4 col = texture(texture0, uv);
|
|
vec4 col_left = texture(texture0, uv - vec2(0.0008, 0.0));
|
|
vec4 col_right = texture(texture0, uv + vec2(0.0008, 0.0));
|
|
col.rgb = mix(col.rgb, (col_left.rgb + col_right.rgb) * 0.5, BLOOM_AMOUNT);
|
|
|
|
// 3. Gaussian scanline profile matching 360 vertical lines
|
|
float scanline = sin(uv.y * 360.0 * 3.14159);
|
|
// Smooth power curve prevents harsh pitch-black cutoffs
|
|
float scanline_factor = pow(0.5 + 0.5 * scanline, 1.8);
|
|
|
|
// Apply scanlines smoothly
|
|
col.rgb *= mix(1.0 - SCANLINE_INTENSITY, 1.0, scanline_factor);
|
|
|
|
// 4. Subtle corner vignette
|
|
float vig = (16.0 * uv.x * uv.y * (1.0 - uv.x) * (1.0 - uv.y));
|
|
col.rgb *= pow(vig, 0.05);
|
|
|
|
finalColor = col * colDiffuse * fragColor;
|
|
} |