mirror of
https://github.com/WinampDesktop/winamp.git
synced 2025-06-17 16:25:46 -04:00
Add crt-hyllian-sinc.fx, crt-geo-zfast.fx and update others (#3252)
* Add crt-hyllian-sinc.fx, crt-geo-zfast.fx and update others - Add crt-hyllian-sinc.fx; - Add crt-geo-zfast.fx; - Updated bicubic.fx and lanczos3.fx to allow prescaling; - Add include folder and mask.fxh and geom.fxh; * Update psx.jpg - No logos anymore.
This commit is contained in:
225
data/resources/shaders/reshade/Shaders/misc/include/geom.fxh
Normal file
225
data/resources/shaders/reshade/Shaders/misc/include/geom.fxh
Normal file
@ -0,0 +1,225 @@
|
||||
#ifndef GEOM_PARAMS_H
|
||||
#define GEOM_PARAMS_H
|
||||
|
||||
/*
|
||||
Geom Shader - a modified CRT-Geom without CRT features made to be appended/integrated
|
||||
into any other shaders and provide curvature/warping/oversampling features.
|
||||
|
||||
Adapted by Hyllian (2024).
|
||||
*/
|
||||
|
||||
|
||||
/*
|
||||
CRT-interlaced
|
||||
|
||||
Copyright (C) 2010-2012 cgwg, Themaister and DOLLS
|
||||
|
||||
This program is free software; you can redistribute it and/or modify it
|
||||
under the terms of the GNU General Public License as published by the Free
|
||||
Software Foundation; either version 2 of the License, or (at your option)
|
||||
any later version.
|
||||
|
||||
(cgwg gave their consent to have the original version of this shader
|
||||
distributed under the GPL in this message:
|
||||
|
||||
http://board.byuu.org/viewtopic.php?p=26075#p26075
|
||||
|
||||
"Feel free to distribute my shaders under the GPL. After all, the
|
||||
barrel distortion code was taken from the Curvature shader, which is
|
||||
under the GPL."
|
||||
)
|
||||
This shader variant is pre-configured with screen curvature
|
||||
*/
|
||||
|
||||
|
||||
|
||||
uniform bool geom_curvature <
|
||||
ui_type = "radio";
|
||||
ui_category = "Geom Curvature";
|
||||
ui_label = "Geom Curvature Toggle";
|
||||
> = 1.0;
|
||||
|
||||
uniform float geom_R <
|
||||
ui_type = "drag";
|
||||
ui_min = 0.1;
|
||||
ui_max = 10.0;
|
||||
ui_step = 0.1;
|
||||
ui_category = "Geom Curvature";
|
||||
ui_label = "Geom Curvature Radius";
|
||||
> = 2.0;
|
||||
|
||||
uniform float geom_d <
|
||||
ui_type = "drag";
|
||||
ui_min = 0.1;
|
||||
ui_max = 3.0;
|
||||
ui_step = 0.1;
|
||||
ui_category = "Geom Curvature";
|
||||
ui_label = "Geom Distance";
|
||||
> = 1.5;
|
||||
|
||||
uniform bool geom_invert_aspect <
|
||||
ui_type = "radio";
|
||||
ui_category = "Geom Curvature";
|
||||
ui_label = "Geom Curvature Aspect Inversion";
|
||||
> = 0.0;
|
||||
|
||||
uniform float geom_cornersize <
|
||||
ui_type = "drag";
|
||||
ui_min = 0.001;
|
||||
ui_max = 1.0;
|
||||
ui_step = 0.005;
|
||||
ui_category = "Geom Curvature";
|
||||
ui_label = "Geom Corner Size";
|
||||
> = 0.03;
|
||||
|
||||
uniform float geom_cornersmooth <
|
||||
ui_type = "drag";
|
||||
ui_min = 80.0;
|
||||
ui_max = 2000.0;
|
||||
ui_step = 100.0;
|
||||
ui_category = "Geom Curvature";
|
||||
ui_label = "Geom Corner Smoothness";
|
||||
> = 1000.0;
|
||||
|
||||
uniform float geom_x_tilt <
|
||||
ui_type = "drag";
|
||||
ui_min = -1.0;
|
||||
ui_max = 1.0;
|
||||
ui_step = 0.05;
|
||||
ui_category = "Geom Curvature";
|
||||
ui_label = "Geom Horizontal Tilt";
|
||||
> = 0.0;
|
||||
|
||||
uniform float geom_y_tilt <
|
||||
ui_type = "drag";
|
||||
ui_min = -1.0;
|
||||
ui_max = 1.0;
|
||||
ui_step = 0.05;
|
||||
ui_category = "Geom Curvature";
|
||||
ui_label = "Geom Vertical Tilt";
|
||||
> = 0.0;
|
||||
|
||||
uniform float geom_overscan_x <
|
||||
ui_type = "drag";
|
||||
ui_min = -125.0;
|
||||
ui_max = 125.0;
|
||||
ui_step = 0.5;
|
||||
ui_category = "Geom Curvature";
|
||||
ui_label = "Geom Horiz. Overscan %";
|
||||
> = 100.0;
|
||||
|
||||
uniform float geom_overscan_y <
|
||||
ui_type = "drag";
|
||||
ui_min = -125.0;
|
||||
ui_max = 125.0;
|
||||
ui_step = 0.5;
|
||||
ui_category = "Geom Curvature";
|
||||
ui_label = "Geom Vert. Overscan %";
|
||||
> = 100.0;
|
||||
|
||||
uniform float centerx <
|
||||
ui_type = "drag";
|
||||
ui_min = -100.0;
|
||||
ui_max = 100.0;
|
||||
ui_step = 0.1;
|
||||
ui_category = "Geom Curvature";
|
||||
ui_label = "Image Center X";
|
||||
> = 0.00;
|
||||
|
||||
uniform float centery <
|
||||
ui_type = "drag";
|
||||
ui_min = -100.0;
|
||||
ui_max = 100.0;
|
||||
ui_step = 0.1;
|
||||
ui_category = "Geom Curvature";
|
||||
ui_label = "Image Center Y";
|
||||
> = 0.00;
|
||||
|
||||
|
||||
|
||||
// Macros.
|
||||
#define FIX(c) max(abs(c), 1e-5);
|
||||
|
||||
// aspect ratio
|
||||
#define aspect (geom_invert_aspect==true?float2(ViewportHeight/ViewportWidth,1.0):float2(1.0,ViewportHeight/ViewportWidth))
|
||||
|
||||
|
||||
float intersect(float2 xy, float2 sinangle, float2 cosangle)
|
||||
{
|
||||
float A = dot(xy,xy) + geom_d*geom_d;
|
||||
float B, C;
|
||||
|
||||
B = 2.0*(geom_R*(dot(xy,sinangle) - geom_d*cosangle.x*cosangle.y) - geom_d*geom_d);
|
||||
C = geom_d*geom_d + 2.0*geom_R*geom_d*cosangle.x*cosangle.y;
|
||||
|
||||
return (-B-sqrt(B*B - 4.0*A*C))/(2.0*A);
|
||||
}
|
||||
|
||||
float2 bkwtrans(float2 xy, float2 sinangle, float2 cosangle)
|
||||
{
|
||||
float c = intersect(xy, sinangle, cosangle);
|
||||
float2 point = (c.xx*xy + geom_R.xx*sinangle) / geom_R.xx;
|
||||
float2 poc = point/cosangle;
|
||||
float2 tang = sinangle/cosangle;
|
||||
|
||||
float A = dot(tang, tang) + 1.0;
|
||||
float B = -2.0*dot(poc, tang);
|
||||
float C = dot(poc, poc) - 1.0;
|
||||
|
||||
float a = (-B + sqrt(B*B - 4.0*A*C)) / (2.0*A);
|
||||
float2 uv = (point - a*sinangle) / cosangle;
|
||||
float r = FIX(geom_R*acos(a));
|
||||
|
||||
return uv*r/sin(r/geom_R);
|
||||
}
|
||||
|
||||
float2 fwtrans(float2 uv, float2 sinangle, float2 cosangle)
|
||||
{
|
||||
float r = FIX(sqrt(dot(uv, uv)));
|
||||
uv *= sin(r/geom_R)/r;
|
||||
float x = 1.0 - cos(r/geom_R);
|
||||
float D;
|
||||
|
||||
D = geom_d/geom_R + x*cosangle.x*cosangle.y + dot(uv,sinangle);
|
||||
|
||||
return geom_d*(uv*cosangle - x*sinangle)/D;
|
||||
}
|
||||
|
||||
float3 maxscale(float2 sinangle, float2 cosangle)
|
||||
{
|
||||
float2 c = bkwtrans(-geom_R * sinangle / (1.0 + geom_R/geom_d*cosangle.x*cosangle.y), sinangle, cosangle);
|
||||
float2 a = 0.5.xx*aspect;
|
||||
|
||||
float2 lo = float2(fwtrans(float2(-a.x, c.y), sinangle, cosangle).x,
|
||||
fwtrans(float2( c.x, -a.y), sinangle, cosangle).y)/aspect;
|
||||
float2 hi = float2(fwtrans(float2(+a.x, c.y), sinangle, cosangle).x,
|
||||
fwtrans(float2( c.x, +a.y), sinangle, cosangle).y)/aspect;
|
||||
|
||||
return float3((hi+lo)*aspect*0.5,max(hi.x-lo.x, hi.y-lo.y));
|
||||
}
|
||||
|
||||
float2 transform(float2 coord, float2 sinangle, float2 cosangle, float3 stretch)
|
||||
{
|
||||
coord = (coord - 0.5.xx)*aspect*stretch.z + stretch.xy;
|
||||
|
||||
return (bkwtrans(coord, sinangle, cosangle) /
|
||||
float2(geom_overscan_x / 100.0, geom_overscan_y / 100.0)/aspect + 0.5.xx);
|
||||
}
|
||||
|
||||
|
||||
float corner(float2 coord)
|
||||
{
|
||||
coord = min(coord, 1.0.xx - coord) * aspect;
|
||||
float2 cdist = geom_cornersize.xx;
|
||||
coord = (cdist - min(coord, cdist));
|
||||
float dist = sqrt(dot(coord, coord));
|
||||
|
||||
return clamp((cdist.x - dist)*geom_cornersmooth, 0.0, 1.0);
|
||||
}
|
||||
|
||||
float fwidth(float value)
|
||||
{
|
||||
return abs(ddx(value)) + abs(ddy(value));
|
||||
}
|
||||
|
||||
#endif // GEOM_PARAMS_H
|
242
data/resources/shaders/reshade/Shaders/misc/include/mask.fxh
Normal file
242
data/resources/shaders/reshade/Shaders/misc/include/mask.fxh
Normal file
@ -0,0 +1,242 @@
|
||||
#ifndef MASK_PARAMS_H
|
||||
#define MASK_PARAMS_H
|
||||
|
||||
uniform float MASK_DARK_STRENGTH <
|
||||
ui_type = "drag";
|
||||
ui_min = 0.0;
|
||||
ui_max = 1.0;
|
||||
ui_step = 0.01;
|
||||
ui_category = "CRT Mask";
|
||||
ui_label = "MASK DARK SUBPIXEL STRENGTH";
|
||||
> = 0.5;
|
||||
|
||||
uniform float MASK_LIGHT_STRENGTH <
|
||||
ui_type = "drag";
|
||||
ui_min = 0.0;
|
||||
ui_max = 6.0;
|
||||
ui_step = 0.01;
|
||||
ui_category = "CRT Mask";
|
||||
ui_label = "MASK LIGHT SUBPIXEL STRENGTH";
|
||||
> = 0.5;
|
||||
|
||||
/* Mask code pasted from subpixel_masks.h. Masks 3 and 4 added. */
|
||||
float3 mask_weights(float2 coord, int phosphor_layout, float monitor_subpixels, float mask_light_str, float mask_dark_str){
|
||||
float3 weights = float3(1.,1.,1.);
|
||||
float on = 1.+mask_light_str;
|
||||
// float on = 1.;
|
||||
float off = 1.-mask_dark_str;
|
||||
float3 red = monitor_subpixels==1.0 ? float3(on, off, off) : float3(off, off, on );
|
||||
float3 green = float3(off, on, off);
|
||||
float3 blue = monitor_subpixels==1.0 ? float3(off, off, on ) : float3(on, off, off);
|
||||
float3 magenta = float3(on, off, on );
|
||||
float3 yellow = monitor_subpixels==1.0 ? float3(on, on, off) : float3(off, on, on );
|
||||
float3 cyan = monitor_subpixels==1.0 ? float3(off, on, on ) : float3(on, on, off);
|
||||
float3 black = float3(off, off, off);
|
||||
float3 white = float3(on, on, on );
|
||||
int w, z = 0;
|
||||
|
||||
// This pattern is used by a few layouts, so we'll define it here
|
||||
float3 aperture_weights = lerp(magenta, green, floor(coord.x % 2.0));
|
||||
|
||||
if(phosphor_layout == 0) return weights;
|
||||
|
||||
else if(phosphor_layout == 1){
|
||||
// classic aperture for RGB panels; good for 1080p, too small for 4K+
|
||||
// aka aperture_1_2_bgr
|
||||
weights = aperture_weights;
|
||||
return weights;
|
||||
}
|
||||
|
||||
else if(phosphor_layout == 2){
|
||||
// Classic RGB layout; good for 1080p and lower
|
||||
float3 bw3[3] = {red, green, blue};
|
||||
// float3 bw3[3] = float3[](black, yellow, blue);
|
||||
|
||||
z = int(floor(coord.x % 3.0));
|
||||
|
||||
weights = bw3[z];
|
||||
return weights;
|
||||
}
|
||||
|
||||
else if(phosphor_layout == 3){
|
||||
// black and white aperture; good for weird subpixel layouts and low brightness; good for 1080p and lower
|
||||
float3 bw3[3] = {black, white, black};
|
||||
|
||||
z = int(floor(coord.x % 3.0));
|
||||
|
||||
weights = bw3[z];
|
||||
return weights;
|
||||
}
|
||||
|
||||
else if(phosphor_layout == 4){
|
||||
// reduced TVL aperture for RGB panels. Good for 4k.
|
||||
// aperture_2_4_rgb
|
||||
|
||||
float3 big_ap_rgb[4] = {red, yellow, cyan, blue};
|
||||
|
||||
w = int(floor(coord.x % 4.0));
|
||||
|
||||
weights = big_ap_rgb[w];
|
||||
return weights;
|
||||
}
|
||||
|
||||
else if(phosphor_layout == 5){
|
||||
// black and white aperture; good for weird subpixel layouts and low brightness; good for 4k
|
||||
float3 bw4[4] = {black, black, white, white};
|
||||
|
||||
z = int(floor(coord.x % 4.0));
|
||||
|
||||
weights = bw4[z];
|
||||
return weights;
|
||||
}
|
||||
|
||||
else if(phosphor_layout == 6){
|
||||
// aperture_1_4_rgb; good for simulating lower
|
||||
float3 ap4[4] = {red, green, blue, black};
|
||||
|
||||
z = int(floor(coord.x % 4.0));
|
||||
|
||||
weights = ap4[z];
|
||||
return weights;
|
||||
}
|
||||
|
||||
else if(phosphor_layout == 7){
|
||||
// 2x2 shadow mask for RGB panels; good for 1080p, too small for 4K+
|
||||
// aka delta_1_2x1_bgr
|
||||
float3 inverse_aperture = lerp(green, magenta, floor(coord.x % 2.0));
|
||||
weights = lerp(aperture_weights, inverse_aperture, floor(coord.y % 2.0));
|
||||
return weights;
|
||||
}
|
||||
|
||||
else if(phosphor_layout == 8){
|
||||
// delta_2_4x1_rgb
|
||||
float3 delta[8] = {
|
||||
red, yellow, cyan, blue,
|
||||
cyan, blue, red, yellow
|
||||
};
|
||||
|
||||
w = int(floor(coord.y % 2.0));
|
||||
z = int(floor(coord.x % 4.0));
|
||||
|
||||
weights = delta[4*w+z];
|
||||
return weights;
|
||||
}
|
||||
|
||||
else if(phosphor_layout == 9){
|
||||
// delta_1_4x1_rgb; dunno why this is called 4x1 when it's obviously 4x2 /shrug
|
||||
float3 delta1[8] = {
|
||||
red, green, blue, black,
|
||||
blue, black, red, green
|
||||
};
|
||||
|
||||
w = int(floor(coord.y % 2.0));
|
||||
z = int(floor(coord.x % 4.0));
|
||||
|
||||
weights = delta1[4*w+z];
|
||||
return weights;
|
||||
}
|
||||
|
||||
else if(phosphor_layout == 10){
|
||||
// delta_2_4x2_rgb
|
||||
float3 delta[16] = {
|
||||
red, yellow, cyan, blue,
|
||||
red, yellow, cyan, blue,
|
||||
cyan, blue, red, yellow,
|
||||
cyan, blue, red, yellow
|
||||
};
|
||||
|
||||
w = int(floor(coord.y % 4.0));
|
||||
z = int(floor(coord.x % 4.0));
|
||||
|
||||
weights = delta[4*w+z];
|
||||
return weights;
|
||||
}
|
||||
|
||||
else if(phosphor_layout == 11){
|
||||
// slot mask for RGB panels; looks okay at 1080p, looks better at 4K
|
||||
float3 slotmask[24] = {
|
||||
red, green, blue, red, green, blue,
|
||||
red, green, blue, black, black, black,
|
||||
red, green, blue, red, green, blue,
|
||||
black, black, black, red, green, blue,
|
||||
};
|
||||
|
||||
w = int(floor(coord.y % 4.0));
|
||||
z = int(floor(coord.x % 6.0));
|
||||
|
||||
// use the indexes to find which color to apply to the current pixel
|
||||
weights = slotmask[6*w+z];
|
||||
return weights;
|
||||
}
|
||||
|
||||
else if(phosphor_layout == 12){
|
||||
// slot mask for RGB panels; looks okay at 1080p, looks better at 4K
|
||||
float3 slotmask[24] = {
|
||||
black, white, black, black, white, black,
|
||||
black, white, black, black, black, black,
|
||||
black, white, black, black, white, black,
|
||||
black, black, black, black, white, black
|
||||
};
|
||||
|
||||
w = int(floor(coord.y % 4.0));
|
||||
z = int(floor(coord.x % 6.0));
|
||||
|
||||
// use the indexes to find which color to apply to the current pixel
|
||||
weights = slotmask[6*w+z];
|
||||
return weights;
|
||||
}
|
||||
|
||||
else if(phosphor_layout == 13){
|
||||
// based on MajorPainInTheCactus' HDR slot mask
|
||||
float3 slot[32] = {
|
||||
red, green, blue, black, red, green, blue, black,
|
||||
red, green, blue, black, black, black, black, black,
|
||||
red, green, blue, black, red, green, blue, black,
|
||||
black, black, black, black, red, green, blue, black
|
||||
};
|
||||
|
||||
w = int(floor(coord.y % 4.0));
|
||||
z = int(floor(coord.x % 8.0));
|
||||
|
||||
weights = slot[8*w+z];
|
||||
return weights;
|
||||
}
|
||||
|
||||
else if(phosphor_layout == 14){
|
||||
// same as above but for RGB panels
|
||||
float3 slot2[40] = {
|
||||
red, yellow, green, blue, blue, red, yellow, green, blue, blue ,
|
||||
black, green, green, blue, blue, red, red, black, black, black,
|
||||
red, yellow, green, blue, blue, red, yellow, green, blue, blue ,
|
||||
red, red, black, black, black, black, green, green, blue, blue
|
||||
};
|
||||
|
||||
w = int(floor(coord.y % 4.0));
|
||||
z = int(floor(coord.x % 10.0));
|
||||
|
||||
weights = slot2[10*w+z];
|
||||
return weights;
|
||||
}
|
||||
|
||||
else if(phosphor_layout == 15){
|
||||
// slot_3_7x6_rgb
|
||||
float3 slot[84] = {
|
||||
red, red, yellow, green, cyan, blue, blue, red, red, yellow, green, cyan, blue, blue,
|
||||
red, red, yellow, green, cyan, blue, blue, red, red, yellow, green, cyan, blue, blue,
|
||||
red, red, yellow, green, cyan, blue, blue, black, black, black, black, black, black, black,
|
||||
red, red, yellow, green, cyan, blue, blue, red, red, yellow, green, cyan, blue, blue,
|
||||
red, red, yellow, green, cyan, blue, blue, red, red, yellow, green, cyan, blue, blue,
|
||||
black, black, black, black, black, black, black, black, red, red, yellow, green, cyan, blue
|
||||
};
|
||||
|
||||
w = int(floor(coord.y % 6.0));
|
||||
z = int(floor(coord.x % 14.0));
|
||||
|
||||
weights = slot[14*w+z];
|
||||
return weights;
|
||||
}
|
||||
|
||||
else return weights;
|
||||
}
|
||||
|
||||
#endif // MASK_PARAMS_H
|
Reference in New Issue
Block a user