Files
OldThink/Resources/Textures/Shaders/White/bettercrt.swsl
Valtos f6b107353a - add: OldNeoInterface (#108)
* ebal

* setup gui

* AAAAAAAAAA EBLAN
2024-03-20 22:54:45 +03:00

84 lines
3.2 KiB
Plaintext
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
uniform sampler2D SCREEN_TEXTURE;
const highp float PI = 3.1415926535;
// ブラウン管のガラスの曲がり具合フラットなやつは0.0でいいかな)
const highp float crt_curve = -0.09;
// 走査線の濃さ
const highp float crt_scan_line_color = 0.348;
// 光量
const highp float aperture_grille_rate = 0.1;
// RFスイッチ的ブラー
const highp float rf_switch_esque_blur = 1.5;
// 白色ノイズ
const highp float white_noise_rate = 0.01;
highp float random( highp vec2 pos )
{
return fract(sin(dot(pos, vec2(12.9898,78.233))) * 43758.5453);
}
void fragment( )
{
// ガラスの曲がり具合
highp vec2 crt_curve_shift = ( vec2( 1.0, 1.0 ) - sin( UV.yx * PI ) ) * crt_curve;
highp vec2 crt_curve_scale = vec2( 1.0, 1.0 ) + crt_curve_shift * 2.0;
highp vec2 texture_fixed_uv = UV * crt_curve_scale - crt_curve_shift;
highp vec2 fixed_uv = UV * crt_curve_scale - crt_curve_shift;
// 範囲外を消す
highp float enable_color = float( 0.0 <= texture_fixed_uv.x && texture_fixed_uv.x <= 1.0 && 0.0 <= texture_fixed_uv.y && texture_fixed_uv.y <= 1.0 );
// ガラスの曲がり具合から元色を取得 + RFスイッチ的ブラー
COLOR.rgb = (
(
texture( SCREEN_TEXTURE, fixed_uv ).rgb
* ( 1.0 - rf_switch_esque_blur * 0.5 )
)
+ (
(
texture( SCREEN_TEXTURE, fixed_uv + vec2( -SCREEN_PIXEL_SIZE.x * 3.1, 0.0 ) ).rgb
+ texture( SCREEN_TEXTURE, fixed_uv + vec2( SCREEN_PIXEL_SIZE.x * 3.1, 0.0 ) ).rgb
)
* ( rf_switch_esque_blur * 0.25 ) // RFイズ0.5 * テクスチャから読んだ2箇所を半分にしたい0.5
)
) * enable_color;
COLOR.a = 1.0;
// ------------------------------------------------
// 以下はアパーチャグリル上の1ピクセルごとの処理
highp vec2 aperture_grille_pixel = vec2( floor( ( fixed_uv.x / SCREEN_PIXEL_SIZE.x ) / 3.0 ) * 3.0, fixed_uv.y );
// 白色ノイズ
highp float white_noise = random( aperture_grille_pixel + vec2( sin( TIME * 0.543254 ), cos( TIME * 0.254323563 ) ) );
COLOR.rgb = mix(
COLOR.rgb
, vec3( white_noise, white_noise, white_noise )
, white_noise_rate * enable_color
);
// アパーチャグリル再現
highp float aperture_grille_point = mod( ( ( UV.x * crt_curve_scale.x ) - crt_curve_shift.x ) / SCREEN_PIXEL_SIZE.x, 3.0 );
highp float aperture_grille_r_rate = clamp( 1.0 - aperture_grille_point, 0.0, 1.0 ) + clamp( aperture_grille_point - 2.0, 0.0, 1.0 );
highp float aperture_grille_g_rate = clamp( 1.0 - abs( 1.0 - aperture_grille_point ), 0.0, 1.0 );
highp float aperture_grille_b_rate = 1.0 - aperture_grille_r_rate - aperture_grille_g_rate;
COLOR = clamp(
COLOR * vec4(
normalize( vec3(
clamp( aperture_grille_r_rate, aperture_grille_rate, 1.0 )
, clamp( aperture_grille_g_rate, aperture_grille_rate, 1.0 )
, clamp( aperture_grille_b_rate, aperture_grille_rate, 1.0 )
) )
, 1.0
)
, vec4( 0.0, 0.0, 0.0, 0.0 )
, vec4( 1.0, 1.0, 1.0, 1.0 )
);
// 走査線
COLOR = mix(
COLOR
, vec4( 0.0, 0.0, 0.0, 1.0 )
, float( 0 == int( fixed_uv.y / SCREEN_PIXEL_SIZE.y ) % 2 ) * crt_scan_line_color
);
}