mirror of
https://github.com/WinampDesktop/winamp.git
synced 2025-06-18 02: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:
@ -170,14 +170,14 @@ sampler2D sBackBuffer{Texture=ReShade::BackBufferTex;AddressU=BORDER;AddressV=BO
|
||||
#define PI 3.141592653589
|
||||
|
||||
#ifdef LINEAR_PROCESSING
|
||||
# define TEX2D(c) pow(tex2D(sBackBuffer, (c)), float4(geom_target_gamma,geom_target_gamma,geom_target_gamma,geom_target_gamma))
|
||||
# define TEX2D(c) pow(tex2D(sBackBuffer, (c)), geom_target_gamma.xxxx)
|
||||
#else
|
||||
# define TEX2D(c) tex2D(sBackBuffer, (c))
|
||||
#endif
|
||||
|
||||
// aspect ratio
|
||||
#define aspect (geom_invert_aspect==true?float2(ViewportHeight/ViewportWidth,1.0):float2(1.0,ViewportHeight/ViewportWidth))
|
||||
#define overscan (float2(1.01,1.01));
|
||||
#define overscan (1.01.xx);
|
||||
|
||||
|
||||
struct ST_VertexOut
|
||||
@ -189,105 +189,21 @@ struct ST_VertexOut
|
||||
};
|
||||
|
||||
|
||||
float vs_intersect(float2 xy, float2 sinangle, float2 cosangle)
|
||||
{
|
||||
float A = dot(xy,xy) + geom_d*geom_d;
|
||||
float B = 2.0*(geom_R*(dot(xy,sinangle)-geom_d*cosangle.x*cosangle.y)-geom_d*geom_d);
|
||||
float 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 vs_bkwtrans(float2 xy, float2 sinangle, float2 cosangle)
|
||||
{
|
||||
float c = vs_intersect(xy, sinangle, cosangle);
|
||||
float2 point = (float2(c, c)*xy - float2(-geom_R, -geom_R)*sinangle) / float2(geom_R, geom_R);
|
||||
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 vs_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 = geom_d/geom_R + x*cosangle.x*cosangle.y+dot(uv,sinangle);
|
||||
|
||||
return geom_d*(uv*cosangle-x*sinangle)/D;
|
||||
}
|
||||
|
||||
float3 vs_maxscale(float2 sinangle, float2 cosangle)
|
||||
{
|
||||
float2 c = vs_bkwtrans(-geom_R * sinangle / (1.0 + geom_R/geom_d*cosangle.x*cosangle.y), sinangle, cosangle);
|
||||
float2 a = float2(0.5,0.5)*aspect;
|
||||
|
||||
float2 lo = float2(vs_fwtrans(float2(-a.x, c.y), sinangle, cosangle).x,
|
||||
vs_fwtrans(float2( c.x, -a.y), sinangle, cosangle).y)/aspect;
|
||||
|
||||
float2 hi = float2(vs_fwtrans(float2(+a.x, c.y), sinangle, cosangle).x,
|
||||
vs_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));
|
||||
}
|
||||
|
||||
// Code snippet borrowed from crt-cyclon. (credits to DariusG)
|
||||
float2 Warp(float2 pos)
|
||||
{
|
||||
pos = pos*2.0 - 1.0;
|
||||
pos *= float2(1.0 + pos.y*pos.y*0, 1.0 + pos.x*pos.x*0);
|
||||
pos = pos*0.5 + 0.5;
|
||||
|
||||
return pos;
|
||||
}
|
||||
|
||||
|
||||
// Vertex shader generating a triangle covering the entire screen
|
||||
void VS_CRT_Geom(in uint id : SV_VertexID, out float4 position : SV_Position, out float2 texcoord : TEXCOORD, out ST_VertexOut vVARS)
|
||||
{
|
||||
texcoord.x = (id == 2) ? 2.0 : 0.0;
|
||||
texcoord.y = (id == 1) ? 2.0 : 0.0;
|
||||
position = float4(texcoord * float2(2.0, -2.0) + float2(-1.0, 1.0), 0.0, 1.0);
|
||||
|
||||
// center screen
|
||||
texcoord = Warp(texcoord - float2(centerx,centery)/100.0);
|
||||
|
||||
float2 SourceSize = 1.0/NormalizedNativePixelSize;
|
||||
|
||||
// Precalculate a bunch of useful values we'll need in the fragment
|
||||
// shader.
|
||||
vVARS.sinangle = sin(float2(geom_x_tilt, geom_y_tilt));
|
||||
vVARS.cosangle = cos(float2(geom_x_tilt, geom_y_tilt));
|
||||
vVARS.stretch = vs_maxscale(vVARS.sinangle, vVARS.cosangle);
|
||||
vVARS.TextureSize = float2(SourceSize.x, SourceSize.y);
|
||||
}
|
||||
|
||||
|
||||
|
||||
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;
|
||||
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 = (float2(c, c)*xy - float2(-geom_R, -geom_R)*sinangle) / float2(geom_R, geom_R);
|
||||
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;
|
||||
|
||||
@ -296,7 +212,7 @@ float2 bkwtrans(float2 xy, float2 sinangle, float2 cosangle)
|
||||
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;
|
||||
float2 uv = (point - a*sinangle) / cosangle;
|
||||
float r = FIX(geom_R*acos(a));
|
||||
|
||||
return uv*r/sin(r/geom_R);
|
||||
@ -309,73 +225,91 @@ float2 fwtrans(float2 uv, float2 sinangle, float2 cosangle)
|
||||
float x = 1.0 - cos(r/geom_R);
|
||||
float D;
|
||||
|
||||
D = geom_d/geom_R + x*cosangle.x*cosangle.y + dot(uv,sinangle);
|
||||
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 = float2(0.5, 0.5)*aspect;
|
||||
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;
|
||||
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));
|
||||
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 - float2(0.5, 0.5))*aspect*stretch.z + stretch.xy;
|
||||
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 + float2(0.5, 0.5));
|
||||
float2(geom_overscan_x / 100.0, geom_overscan_y / 100.0)/aspect + 0.5.xx);
|
||||
}
|
||||
|
||||
|
||||
// Vertex shader generating a triangle covering the entire screen
|
||||
void VS_CRT_Geom(in uint id : SV_VertexID, out float4 position : SV_Position, out float2 texcoord : TEXCOORD, out ST_VertexOut vVARS)
|
||||
{
|
||||
texcoord.x = (id == 2) ? 2.0 : 0.0;
|
||||
texcoord.y = (id == 1) ? 2.0 : 0.0;
|
||||
position = float4(texcoord * float2(2.0, -2.0) + float2(-1.0, 1.0), 0.0, 1.0);
|
||||
|
||||
// Screen centering
|
||||
texcoord = texcoord - float2(centerx,centery)/100.0;
|
||||
|
||||
float2 SourceSize = 1.0/NormalizedNativePixelSize;
|
||||
|
||||
// Precalculate a bunch of useful values we'll need in the fragment
|
||||
// shader.
|
||||
vVARS.sinangle = sin(float2(geom_x_tilt, geom_y_tilt));
|
||||
vVARS.cosangle = cos(float2(geom_x_tilt, geom_y_tilt));
|
||||
vVARS.stretch = maxscale(vVARS.sinangle, vVARS.cosangle);
|
||||
vVARS.TextureSize = float2(SourceSize.x, SourceSize.y);
|
||||
}
|
||||
|
||||
|
||||
float corner(float2 coord)
|
||||
{
|
||||
coord = min(coord, float2(1.0, 1.0) - coord) * aspect;
|
||||
float2 cdist = float2(geom_cornersize, geom_cornersize);
|
||||
coord = (cdist - min(coord, cdist));
|
||||
float dist = sqrt(dot(coord, 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);
|
||||
return clamp((cdist.x - dist)*geom_cornersmooth, 0.0, 1.0);
|
||||
}
|
||||
|
||||
float fwidth(float value){
|
||||
return abs(ddx(value)) + abs(ddy(value));
|
||||
float fwidth(float value)
|
||||
{
|
||||
return abs(ddx(value)) + abs(ddy(value));
|
||||
}
|
||||
|
||||
|
||||
float4 PS_CRT_Geom(float4 vpos: SV_Position, float2 vTexCoord : TEXCOORD, in ST_VertexOut vVARS) : SV_Target
|
||||
{
|
||||
// Texture coordinates of the texel containing the active pixel.
|
||||
float2 xy;
|
||||
float2 xy = (geom_curvature == true) ? transform(vTexCoord, vVARS.sinangle, vVARS.cosangle, vVARS.stretch) : vTexCoord;
|
||||
|
||||
if (geom_curvature == true)
|
||||
xy = transform(vTexCoord, vVARS.sinangle, vVARS.cosangle, vVARS.stretch);
|
||||
else
|
||||
xy = vTexCoord;
|
||||
float cval = corner((xy-0.5.xx) * BufferToViewportRatio + 0.5.xx);
|
||||
|
||||
float cval = corner((xy-float2(0.5,0.5)) * BufferToViewportRatio + float2(0.5,0.5));
|
||||
|
||||
float2 uv_ratio = frac((xy * vVARS.TextureSize - float2(0.5, 0.5)) / vVARS.TextureSize);
|
||||
float2 uv_ratio = frac((xy * vVARS.TextureSize - 0.5.xx) / vVARS.TextureSize);
|
||||
|
||||
float4 col = TEX2D(xy);
|
||||
|
||||
#ifndef LINEAR_PROCESSING
|
||||
col = pow(col , float4(geom_target_gamma, geom_target_gamma, geom_target_gamma, geom_target_gamma));
|
||||
col = pow(col, geom_target_gamma.xxxx);
|
||||
#endif
|
||||
|
||||
col.rgb *= (geom_lum * step(0.0, uv_ratio.y));
|
||||
|
||||
float3 mul_res = col.rgb * float3(cval, cval, cval);
|
||||
float3 mul_res = col.rgb * cval.xxx;
|
||||
|
||||
// Convert the image gamma for display on our output device.
|
||||
mul_res = pow(mul_res, float3(1.0 / geom_monitor_gamma, 1.0 / geom_monitor_gamma, 1.0 / geom_monitor_gamma));
|
||||
mul_res = pow(mul_res, 1.0 / geom_monitor_gamma.xxx);
|
||||
|
||||
return float4(mul_res, 1.0);
|
||||
}
|
||||
|
Reference in New Issue
Block a user