Untitled

Anonymous
plain_text
02/19/2026 12:52 AM
4.0 KB
14
Indexable
#version 120

#define GAMMA_IN(color)     pow(color, vec4(InputGamma))
#define GAMMA_OUT(color)    pow(color, vec4(1.0 / OutputGamma))

#define texCoord v_texCoord

#if defined(VERTEX)

#if __VERSION__ >= 130
#define OUT out
#define IN  in
#define tex2D texture
#else
#define OUT varying
#define IN attribute
#define tex2D texture2D
#endif

IN  vec4 a_position;
IN  vec4 Color;
IN  vec2 TexCoord;
OUT vec4 color;
OUT vec2 texCoord;

uniform vec2 rubyOutputSize;
uniform vec2 rubyTextureSize;
uniform vec2 rubyInputSize;

void main()
{
    gl_Position = a_position;
    v_texCoord = vec2(a_position.x + 1.0, 1.0 - a_position.y) * 0.5
               * rubyInputSize / rubyTextureSize;
}

#elif defined(FRAGMENT)

#if __VERSION__ >= 130
#define IN in
out vec4 FragColor;
#else
#define IN varying
#define FragColor gl_FragColor
#endif

#ifdef GL_ES
precision mediump float;
#endif

uniform vec2 rubyOutputSize;
uniform vec2 rubyTextureSize;
uniform vec2 rubyInputSize;
uniform sampler2D s_p;
IN vec2 texCoord;

#define BEAM_PROFILE 0.0
#define BEAM_MIN_WIDTH 0.86
#define BEAM_MAX_WIDTH 1.0
#define SCANLINES_STRENGTH 0.58
#define COLOR_BOOST 1.25
#define HFILTER_SHARPNESS 1.0
#define PHOSPHOR_LAYOUT 4.0
#define MASK_INTENSITY 0.5
#define CRT_ANTI_RINGING 1.0
#define InputGamma 2.4
#define OutputGamma 2.2
#define VSCANLINES 0.0

float B = 1.0 - HFILTER_SHARPNESS;
float C = HFILTER_SHARPNESS * 0.5;

mat4 invX = mat4(
    (-B - 6.0*C)/6.0,   (12.0 - 9.0*B - 6.0*C)/6.0,  -(12.0 - 9.0*B - 6.0*C)/6.0,   (B + 6.0*C)/6.0,
    (3.0*B + 12.0*C)/6.0, (-18.0 + 12.0*B + 6.0*C)/6.0, (18.0 - 15.0*B - 12.0*C)/6.0, -C,
    (-3.0*B - 6.0*C)/6.0, 0.0, (3.0*B + 6.0*C)/6.0, 0.0,
    B/6.0, (6.0 - 2.0*B)/6.0, B/6.0, 0.0
);

void main()
{
    vec2 dx = vec2(1.0 / rubyTextureSize.x, 0.0);
    vec2 dy = vec2(0.0, 1.0 / rubyTextureSize.y);

    vec2 pix = texCoord * rubyTextureSize - vec2(0.5);
    vec2 tc  = (floor(pix) + vec2(0.5)) / rubyTextureSize;
    vec2 fp  = fract(pix);

    vec4 c00 = GAMMA_IN(tex2D(s_p, tc - dx - dy));
    vec4 c01 = GAMMA_IN(tex2D(s_p, tc      - dy));
    vec4 c02 = GAMMA_IN(tex2D(s_p, tc + dx - dy));
    vec4 c03 = GAMMA_IN(tex2D(s_p, tc + 2.0*dx - dy));
    vec4 c10 = GAMMA_IN(tex2D(s_p, tc - dx));
    vec4 c11 = GAMMA_IN(tex2D(s_p, tc));
    vec4 c12 = GAMMA_IN(tex2D(s_p, tc + dx));
    vec4 c13 = GAMMA_IN(tex2D(s_p, tc + 2.0*dx));

    mat4 m0 = mat4(c00, c01, c02, c03);
    mat4 m1 = mat4(c10, c11, c12, c13);

    vec4 lobes = vec4(fp.x*fp.x*fp.x, fp.x*fp.x, fp.x, 1.0);
    vec4 col0 = m0 * (invX * lobes);
    vec4 col1 = m1 * (invX * lobes);

    float d0 = exp(-pow(fp.y * SCANLINES_STRENGTH, 2.0));
    float d1 = exp(-pow((1.0 - fp.y) * SCANLINES_STRENGTH, 2.0));

    vec4 color = COLOR_BOOST * (col0 * d0 + col1 * d1);

    // ===== IBM 5151 GREEN PHOSPHOR (MONOCHROME) =====
    float lum = dot(color.rgb, vec3(0.299, 0.587, 0.114));
    vec3 green = vec3(0.0, lum * 1.15, 0.0);

    FragColor = GAMMA_OUT(vec4(green, 1.0));
}

#endif
Editor is loading...
Leave a Comment