Overlay glsl defaults
/*
Frame Overlay - Curved Sides with Adaptive Rounded Corners
Author: ChatGPT
License: MIT
*/
#pragma parameter BOGUS_OVERLAY "-----------------FRAME OVERLAY-----------------" 0.0 0.0 0.0 0.0
#pragma parameter OVERLAY_ENABLE "Enable Frame" 1.0 0.0 1.0 1.0
#pragma parameter FRAME_SIZE "Frame Size %" 2.0 0.0 10.0 0.25
#pragma parameter CURVE_AMOUNT "Curve Amount" 0.5 0.0 1.0 0.05
#pragma parameter CORNER_RADIUS "Corner Radius %" 50.0 0.0 25.0 5.0
#pragma parameter FADE_WIDTH "Fade Width %" 40.0 0.0 100.0 5.0
#pragma parameter FADE_CURVE "Fade Curve" 2.0 0.0 15.0 1.0
#if defined(VERTEX)
#if __VERSION__ >= 130
#define COMPAT_VARYING out
#define COMPAT_ATTRIBUTE in
#define COMPAT_TEXTURE texture
#else
#define COMPAT_VARYING varying
#define COMPAT_ATTRIBUTE attribute
#define COMPAT_TEXTURE texture2D
#endif
#ifdef GL_ES
#define COMPAT_PRECISION mediump
#else
#define COMPAT_PRECISION
#endif
COMPAT_ATTRIBUTE vec4 VertexCoord;
COMPAT_ATTRIBUTE vec4 COLOR;
COMPAT_ATTRIBUTE vec4 TexCoord;
COMPAT_VARYING vec4 COL0;
COMPAT_VARYING vec4 TEX0;
uniform mat4 MVPMatrix;
uniform COMPAT_PRECISION int FrameDirection;
uniform COMPAT_PRECISION int FrameCount;
uniform COMPAT_PRECISION vec2 OutputSize;
uniform COMPAT_PRECISION vec2 TextureSize;
uniform COMPAT_PRECISION vec2 InputSize;
void main()
{
gl_Position = MVPMatrix * VertexCoord;
COL0 = COLOR;
TEX0.xy = TexCoord.xy;
}
#elif defined(FRAGMENT)
#if __VERSION__ >= 130
#define COMPAT_VARYING in
#define COMPAT_TEXTURE texture
out vec4 FragColor;
#else
#define COMPAT_VARYING varying
#define FragColor gl_FragColor
#define COMPAT_TEXTURE texture2D
#endif
#ifdef GL_ES
#ifdef GL_FRAGMENT_PRECISION_HIGH
precision highp float;
#else
precision mediump float;
#endif
#define COMPAT_PRECISION mediump
#else
#define COMPAT_PRECISION
#endif
uniform COMPAT_PRECISION int FrameDirection;
uniform COMPAT_PRECISION int FrameCount;
uniform COMPAT_PRECISION vec2 OutputSize;
uniform COMPAT_PRECISION vec2 TextureSize;
uniform COMPAT_PRECISION vec2 InputSize;
uniform sampler2D Texture;
COMPAT_VARYING vec4 TEX0;
#define Source Texture
#define vTexCoord TEX0.xy
#define texture(c, d) COMPAT_TEXTURE(c, d)
#ifdef PARAMETER_UNIFORM
uniform COMPAT_PRECISION float OVERLAY_ENABLE;
uniform COMPAT_PRECISION float FRAME_SIZE;
uniform COMPAT_PRECISION float CURVE_AMOUNT;
uniform COMPAT_PRECISION float CORNER_RADIUS;
uniform COMPAT_PRECISION float FADE_WIDTH;
uniform COMPAT_PRECISION float FADE_CURVE;
#else
#define OVERLAY_ENABLE 1.0
#define FRAME_SIZE 2.0
#define CURVE_AMOUNT 0.5
#define CORNER_RADIUS 50.0
#define FADE_WIDTH 0.0
#define FADE_CURVE 2.0
#endif
// Funzione di curva potenziata
float apply_fade_curve(float t, float curve_power) {
t = clamp(t, 0.0, 1.0);
if (curve_power <= 0.0) {
return t; // Lineare
} else if (curve_power <= 1.0) {
// Da lineare a quadratico
return mix(t, t * t, curve_power);
} else if (curve_power <= 2.0) {
// Da quadratico a cubico
return mix(t * t, t * t * t, curve_power - 1.0);
} else if (curve_power <= 3.0) {
// Da cubico a quartico
float cubic = t * t * t;
float quartic = t * t * t * t;
return mix(cubic, quartic, curve_power - 2.0);
} else {
// Potenza elevata per curve molto pronunciate
float power = 1.0 + (curve_power - 3.0) * 2.0; // Da 1 a 5
return pow(t, power);
}
}
void main()
{
vec4 color = texture(Source, vTexCoord);
if (OVERLAY_ENABLE > 0.5) {
vec2 pixel_pos = gl_FragCoord.xy;
// 1. CALCOLA LA FORMA BASE DELLA CORNICE
// Spessore cornice in pixel
float frame_thickness = (FRAME_SIZE / 100.0) * min(OutputSize.x, OutputSize.y);
// Raggio angoli in pixel
float min_dimension = min(OutputSize.x, OutputSize.y);
float corner_radius = (CORNER_RADIUS / 100.0) * min_dimension * 0.1;
// Limita il raggio massimo
float max_possible_radius = min(OutputSize.x, OutputSize.y) * 0.25;
corner_radius = min(corner_radius, max_possible_radius);
corner_radius = max(corner_radius, 1.0);
// Definisci l'area base dell'immagine (rettangolo interno)
float base_left = frame_thickness;
float base_right = OutputSize.x - frame_thickness;
float base_top = frame_thickness;
float base_bottom = OutputSize.y - frame_thickness;
// 2. CALCOLA LA FORMA CON CURVATURA
// Inizializza i bordi curvi come quelli base
float curved_left = base_left;
float curved_right = base_right;
float curved_top = base_top;
float curved_bottom = base_bottom;
// Applica la curvatura ai lati
if (CURVE_AMOUNT > 0.0) {
float curve_strength = CURVE_AMOUNT * frame_thickness;
// Calcola la posizione normalizzata lungo i bordi
float norm_x = (pixel_pos.x - base_left) / (base_right - base_left);
float norm_y = (pixel_pos.y - base_top) / (base_bottom - base_top);
norm_x = clamp(norm_x, 0.0, 1.0);
norm_y = clamp(norm_y, 0.0, 1.0);
// Curva parabolica (massimo al centro, zero agli estremi)
float curve_x = 4.0 * norm_x * (1.0 - norm_x);
float curve_y = 4.0 * norm_y * (1.0 - norm_y);
// Applica curvatura ai bordi
curved_left = base_left - curve_y * curve_strength;
curved_right = base_right + curve_y * curve_strength;
curved_top = base_top - curve_x * curve_strength;
curved_bottom = base_bottom + curve_x * curve_strength;
}
// 3. DETERMINA LA DISTANZA DAL BORDO
float distance_to_edge = 0.0;
// Prima controlla gli angoli arrotondati
bool in_corner_area = false;
// Angolo alto-sinistra
if (pixel_pos.x < base_left + corner_radius && pixel_pos.y < base_top + corner_radius) {
in_corner_area = true;
vec2 corner_center = vec2(base_left + corner_radius, base_top + corner_radius);
float corner_distance = distance(pixel_pos, corner_center);
distance_to_edge = corner_radius - corner_distance;
}
// Angolo alto-destra
else if (pixel_pos.x > base_right - corner_radius && pixel_pos.y < base_top + corner_radius) {
in_corner_area = true;
vec2 corner_center = vec2(base_right - corner_radius, base_top + corner_radius);
float corner_distance = distance(pixel_pos, corner_center);
distance_to_edge = corner_radius - corner_distance;
}
// Angolo basso-sinistra
else if (pixel_pos.x < base_left + corner_radius && pixel_pos.y > base_bottom - corner_radius) {
in_corner_area = true;
vec2 corner_center = vec2(base_left + corner_radius, base_bottom - corner_radius);
float corner_distance = distance(pixel_pos, corner_center);
distance_to_edge = corner_radius - corner_distance;
}
// Angolo basso-destra
else if (pixel_pos.x > base_right - corner_radius && pixel_pos.y > base_bottom - corner_radius) {
in_corner_area = true;
vec2 corner_center = vec2(base_right - corner_radius, base_bottom - corner_radius);
float corner_distance = distance(pixel_pos, corner_center);
distance_to_edge = corner_radius - corner_distance;
}
// Se non siamo in un angolo, calcola distanza dai lati curvi
if (!in_corner_area) {
float dist_left = pixel_pos.x - curved_left;
float dist_right = curved_right - pixel_pos.x;
float dist_top = pixel_pos.y - curved_top;
float dist_bottom = curved_bottom - pixel_pos.y;
distance_to_edge = min(min(dist_left, dist_right), min(dist_top, dist_bottom));
}
// 4. APPLICA LA SFUMATURA CON CENTRO SPOSTATO VERSO L'INTERNO
if (FADE_WIDTH > 0.0) {
// Calcola la larghezza totale della sfumatura
float total_fade_width = (FADE_WIDTH / 100.0) * frame_thickness;
// Calcola quanto il nero penetra nell'immagine
// Con FADE_WIDTH = 100%, il nero penetra quanto e spessa la cornice
// Con FADE_WIDTH = 200%, il nero penetra il doppio
float black_penetration = total_fade_width * 0.7; // 70% della larghezza e nero che penetra
// La zona di transizione completa (nero che sfuma a immagine)
float full_transition = total_fade_width;
// Se siamo completamente nella cornice (nero pieno)
if (distance_to_edge <= -black_penetration) {
color.rgb = vec3(0.0);
}
// Se siamo nella zona di transizione
else if (distance_to_edge < (full_transition - black_penetration)) {
// Calcola la posizione nella transizione
// 0.0 = inizio transizione (bordo esterno del nero)
// 1.0 = fine transizione (immagine piena)
float transition_pos = 0.0;
// Sposta il centro del fade verso l'interno
float adjusted_distance = distance_to_edge + black_penetration;
if (adjusted_distance < 0.0) {
// Nella parte di nero che penetra
transition_pos = (adjusted_distance + black_penetration) / (black_penetration * 2.0);
} else {
// Nella parte di sfumatura verso l'immagine
transition_pos = 0.5 + (adjusted_distance / (full_transition * 2.0));
}
transition_pos = clamp(transition_pos, 0.0, 1.0);
// APPLICA LA CURVA DEL FADE - ORA MOLTO PIU EVIDENTE!
float curve_value = apply_fade_curve(transition_pos, FADE_CURVE);
// Calcola l'intensita del nero
// Inverti: piu alta la curva, meno nero nell'immagine
float black_intensity = 1.0 - curve_value;
// Aggiusta per un fade piu naturale
black_intensity = clamp(black_intensity, 0.0, 1.0);
// Se siamo nella cornice, assicurati che ci sia almeno un po' di nero
if (distance_to_edge < 0.0) {
black_intensity = max(black_intensity, 0.3);
}
// Applica la sfumatura con effetto piu pronunciato
color.rgb = mix(color.rgb, vec3(0.0), black_intensity);
}
// Altrimenti: siamo completamente nell'immagine
} else {
// Senza sfumatura: transizione netta alla cornice base
if (distance_to_edge < 0.0) {
color.rgb = vec3(0.0);
}
}
}
FragColor = color;
}
#endif
final film_grain.glsl (raising Y will blur hell of a lot)
#version 130
// film noise
// by hunterk
// license: public domain
// Parameter lines go here:
#pragma parameter BOGUS_FILM_NOISE "-------------------CONVERG./FILM NOISE-------------------" 0.0 0.0 0.0 0.0
#pragma parameter x_off_r "Conv. X Offset Red" 0.05 -1.0 1.0 0.01
#pragma parameter y_off_r "Conv. Y Offset Red" 0.0 -1.0 1.0 0.01
#pragma parameter x_off_g "Conv. X Offset Green" -0.0 -1.0 1.0 0.01
#pragma parameter y_off_g "Conv. Y Offset Green" -0.0 -1.0 1.0 0.01
#pragma parameter x_off_b "Conv. X Offset Blue" -0.05 -1.0 1.0 0.01
#pragma parameter y_off_b "Conv. Y Offset Blue" 0.0 -1.0 1.0 0.01
#pragma parameter grain_str "Grain Strength" 2.0 0.0 16.0 0.5
#if defined(VERTEX)
#if __VERSION__ >= 130
#define COMPAT_VARYING out
#define COMPAT_ATTRIBUTE in
#define COMPAT_TEXTURE texture
#else
#define COMPAT_VARYING varying
#define COMPAT_ATTRIBUTE attribute
#define COMPAT_TEXTURE texture2D
#endif
#ifdef GL_ES
#define COMPAT_PRECISION mediump
#else
#define COMPAT_PRECISION
#endif
COMPAT_ATTRIBUTE vec4 VertexCoord;
COMPAT_ATTRIBUTE vec4 COLOR;
COMPAT_ATTRIBUTE vec4 TexCoord;
COMPAT_VARYING vec4 COL0;
COMPAT_VARYING vec4 TEX0;
vec4 _oPosition1;
uniform mat4 MVPMatrix;
uniform COMPAT_PRECISION int FrameDirection;
uniform COMPAT_PRECISION int FrameCount;
uniform COMPAT_PRECISION vec2 OutputSize;
uniform COMPAT_PRECISION vec2 TextureSize;
uniform COMPAT_PRECISION vec2 InputSize;
// compatibility #defines
#define vTexCoord TEX0.xy
#define SourceSize vec4(TextureSize, 1.0 / TextureSize) //either TextureSize or InputSize
#define OutSize vec4(OutputSize, 1.0 / OutputSize)
void main()
{
gl_Position = MVPMatrix * VertexCoord;
TEX0.xy = TexCoord.xy;
}
#elif defined(FRAGMENT)
#ifdef GL_ES
#ifdef GL_FRAGMENT_PRECISION_HIGH
precision highp float;
#else
precision mediump float;
#endif
#define COMPAT_PRECISION mediump
#else
#define COMPAT_PRECISION
#endif
#if __VERSION__ >= 130
#define COMPAT_VARYING in
#define COMPAT_TEXTURE texture
out COMPAT_PRECISION vec4 FragColor;
#else
#define COMPAT_VARYING varying
#define FragColor gl_FragColor
#define COMPAT_TEXTURE texture2D
#endif
uniform COMPAT_PRECISION int FrameDirection;
uniform COMPAT_PRECISION int FrameCount;
uniform COMPAT_PRECISION vec2 OutputSize;
uniform COMPAT_PRECISION vec2 TextureSize;
uniform COMPAT_PRECISION vec2 InputSize;
uniform sampler2D Texture;
COMPAT_VARYING vec4 TEX0;
// compatibility #defines
#define Source Texture
#define vTexCoord TEX0.xy
#define SourceSize vec4(TextureSize, 1.0 / TextureSize) //either TextureSize or InputSize
#define OutSize vec4(OutputSize, 1.0 / OutputSize)
#ifdef PARAMETER_UNIFORM
uniform COMPAT_PRECISION float x_off_r;
uniform COMPAT_PRECISION float y_off_r;
uniform COMPAT_PRECISION float x_off_g;
uniform COMPAT_PRECISION float y_off_g;
uniform COMPAT_PRECISION float x_off_b;
uniform COMPAT_PRECISION float y_off_b;
uniform COMPAT_PRECISION float grain_str;
#else
#define x_off_r 0.05
#define y_off_r 0.05
#define x_off_g -0.05
#define y_off_g -0.05
#define x_off_b -0.05
#define y_off_b 0.05
#define grain_str 12.0
#endif
//https://www.shadertoy.com/view/4sXSWs strength= 16.0
float filmGrain(vec2 uv, float strength, float timer ){
float x = (uv.x + 4.0 ) * (uv.y + 4.0 ) * ((mod(timer, 800.0) + 10.0) * 10.0);
return (mod((mod(x, 13.0) + 1.0) * (mod(x, 123.0) + 1.0), 0.01)-0.005) * strength;
}
float hash( float n ){
return fract(sin(n)*43758.5453123);
}
void main()
{
vec2 red_coord = vTexCoord + 0.01 * vec2(x_off_r, y_off_r);
vec3 red_light = COMPAT_TEXTURE(Source, red_coord).rgb;
vec2 green_coord = vTexCoord + 0.01 * vec2(x_off_g, y_off_g);
vec3 green_light = COMPAT_TEXTURE(Source, green_coord).rgb;
vec2 blue_coord = vTexCoord + 0.01 * vec2(x_off_b, y_off_b);
vec3 blue_light = COMPAT_TEXTURE(Source, blue_coord).rgb;
vec3 film = vec3(red_light.r, green_light.g, blue_light.b);
film += filmGrain(vTexCoord.xy, grain_str, float(FrameCount)); // Film grain
FragColor = vec4(film, 1.0);
}
#endif
final dotmask.glsl with true scanlines and adjustable mask
/*
CRT - Clean Subpixel RGB/BGR Mask with Arcade Scanlines
*/
#pragma parameter BOGUS_DOTMASK "--------- CRT SCANLINES & SUBPIXEL MASK ---------" 0.0 0.0 0.0 0.0
// SCANLINE CONTROLS
#pragma parameter SCAN_LOW "Scanline Intensity (Dark Scenes)" 0.8 0.0 1.0 0.05
#pragma parameter SCAN_HIGH "Scanline Intensity (Bright Scenes)" 0.3 0.0 1.0 0.05
// MASK CONTROLS
#pragma parameter DOTMASK_STRENGTH "Mask Strength" 0.3 0.0 1.0 0.05
#pragma parameter MASK_LIGHT "Mask Light" 1.50 0.0 3.0 0.05
#pragma parameter MASK_DARK "Mask Dark" 0.50 0.0 3.0 0.05
#pragma parameter SUBPIXEL_LAYOUT "Subpixel Layout (0=RGB, 1=BGR)" 0.0 0.0 1.0 1.0
#if defined(VERTEX)
#if __VERSION__ >= 130
#define COMPAT_VARYING out
#define COMPAT_ATTRIBUTE in
#define COMPAT_TEXTURE texture
#else
#define COMPAT_VARYING varying
#define COMPAT_ATTRIBUTE attribute
#define COMPAT_TEXTURE texture2D
#endif
#ifdef GL_ES
#define COMPAT_PRECISION mediump
#else
#define COMPAT_PRECISION
#endif
COMPAT_ATTRIBUTE vec4 VertexCoord;
COMPAT_ATTRIBUTE vec4 COLOR;
COMPAT_ATTRIBUTE vec4 TexCoord;
COMPAT_VARYING vec4 COL0;
COMPAT_VARYING vec4 TEX0;
COMPAT_VARYING vec2 ogl2pos;
uniform mat4 MVPMatrix;
uniform COMPAT_PRECISION int FrameDirection;
uniform COMPAT_PRECISION int FrameCount;
uniform COMPAT_PRECISION vec2 OutputSize;
uniform COMPAT_PRECISION vec2 TextureSize;
uniform COMPAT_PRECISION vec2 InputSize;
void main()
{
gl_Position = MVPMatrix * VertexCoord;
COL0 = COLOR;
TEX0.xy = TexCoord.xy;
ogl2pos = TEX0.xy*TextureSize.xy;
}
#elif defined(FRAGMENT)
#if __VERSION__ >= 130
#define COMPAT_VARYING in
#define COMPAT_TEXTURE texture
out vec4 FragColor;
#else
#define COMPAT_VARYING varying
#define FragColor gl_FragColor
#define COMPAT_TEXTURE texture2D
#endif
#ifdef GL_ES
#ifdef GL_FRAGMENT_PRECISION_HIGH
precision highp float;
#else
precision mediump float;
#endif
#define COMPAT_PRECISION mediump
#else
#define COMPAT_PRECISION
#endif
uniform COMPAT_PRECISION int FrameDirection;
uniform COMPAT_PRECISION int FrameCount;
uniform COMPAT_PRECISION vec2 OutputSize;
uniform COMPAT_PRECISION vec2 TextureSize;
uniform COMPAT_PRECISION vec2 InputSize;
uniform sampler2D Texture;
COMPAT_VARYING vec4 TEX0;
COMPAT_VARYING vec2 ogl2pos;
#define Source Texture
#define vTexCoord TEX0.xy
#define texture(c, d) COMPAT_TEXTURE(c, d)
#define tau 6.283185307179586
#ifdef PARAMETER_UNIFORM
uniform COMPAT_PRECISION float SCAN_LOW;
uniform COMPAT_PRECISION float SCAN_HIGH;
uniform COMPAT_PRECISION float DOTMASK_STRENGTH;
uniform COMPAT_PRECISION float MASK_LIGHT;
uniform COMPAT_PRECISION float MASK_DARK;
uniform COMPAT_PRECISION float SUBPIXEL_LAYOUT;
#else
#define SCAN_LOW 0.8
#define SCAN_HIGH 0.3
#define MASK_LIGHT 1.5
#define MASK_DARK 0.5
#define DOTMASK_STRENGTH 0.3
#define SUBPIXEL_LAYOUT 0.0
#endif
vec3 SimpleSubpixelMask(vec2 fragCoord) {
vec3 mask = vec3(MASK_DARK);
// Cycle every 3 screen pixels horizontally
float pos_x = fract(fragCoord.x * 0.333333333);
if (SUBPIXEL_LAYOUT > 0.5) {
// BGR Layout
if (pos_x < 0.3333) mask.b = MASK_LIGHT;
else if (pos_x < 0.6666) mask.g = MASK_LIGHT;
else mask.r = MASK_LIGHT;
} else {
// RGB Layout
if (pos_x < 0.3333) mask.r = MASK_LIGHT;
else if (pos_x < 0.6666) mask.g = MASK_LIGHT;
else mask.b = MASK_LIGHT;
}
return mask;
}
void main()
{
float near = floor(ogl2pos.y)+0.5;
float f = ogl2pos.y - near;
float y = (near + 4.0*f*f*f)/TextureSize.y;
vec2 pos = vec2(vTexCoord.x, y);
vec3 pixelColor = texture(Source, pos).rgb;
float lum = dot(vec3(0.3),pixelColor);
// --- ARCADE SCANLINE CALCULATION ---
float l = max(max(pixelColor.r, pixelColor.g), pixelColor.b);
float infl = mix(SCAN_LOW, SCAN_HIGH, l);
float scan = infl * sin((vTexCoord.y * TextureSize.y-0.25) * tau);
vec3 scanlineColor = pixelColor + (pixelColor * scan);
// --- CLEAN SUBPIXEL RGB/BGR MASK ---
vec3 maskStructure = SimpleSubpixelMask(gl_FragCoord.xy);
vec3 finalMask = mix(vec3(1.0), maskStructure, mix(DOTMASK_STRENGTH*2.0, DOTMASK_STRENGTH, lum));
// Combine scanlines and mask
vec3 finalColor = scanlineColor * finalMask;
FragColor = vec4(finalColor, 1.0);
}
#endif
final universal.glslp should be in “shaders”
shaders = "5"
shader0 = "shaders_glsl/Universal/shaders/image-adjustment.glsl"
shader1 = "shaders_glsl/Universal/shaders/Candy-Bloom.glsl"
filter_linear1 = "true"
scale_type_x1 = "source"
scale_x1 = "1.000000"
scale_type_y1 = "source"
scale_y1 = "1.000000"
shader2 = "shaders_glsl/Universal/shaders/film_noise.glsl"
filter_linear2 = "true"
scale_type_x2 = "source"
scale_x2 = "1.000000"
scale_type_y2 = "source"
scale_y2 = "1.000000"
shader3 = "shaders_glsl/Universal/shaders/overlay.glsl"
filter_linear3 = "true"
scale_type_x3 = "source"
scale_x3 = "1.000000"
scale_type_y3 = "source"
scale_y3 = "1.000000"
shader4 = "shaders_glsl/Universal/shaders/dotmask.glsl"
filter_linear4 = "true"
end result, still on 27-28% on HD630, less than before (35%)