Shaders: Add new pack of shaders (reshade) (#3232)
- Add crt-geom, super-xbr, geom, multi-LUT, deblur-luma, bicubic and lanczos3. All .fx shaders; - Added some LUTs.
This commit is contained in:
151
data/resources/shaders/reshade/Shaders/misc/deblur-luma.fx
Normal file
151
data/resources/shaders/reshade/Shaders/misc/deblur-luma.fx
Normal file
@@ -0,0 +1,151 @@
|
||||
#include "ReShade.fxh"
|
||||
|
||||
/*
|
||||
Deblur-Luma Shader
|
||||
|
||||
Copyright (C) 2005 - 2024 guest(r) - guest.r@gmail.com
|
||||
|
||||
Luma adaptation by Hyllian
|
||||
|
||||
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.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
*/
|
||||
|
||||
uniform float OFFSET <
|
||||
ui_type = "drag";
|
||||
ui_min = 0.25;
|
||||
ui_max = 4.0;
|
||||
ui_step = 0.25;
|
||||
ui_label = "Deblur offset";
|
||||
> = 2.0;
|
||||
|
||||
uniform float DEBLUR <
|
||||
ui_type = "drag";
|
||||
ui_min = 1.0;
|
||||
ui_max = 7.0;
|
||||
ui_step = 0.25;
|
||||
ui_label = "Deblur str.";
|
||||
> = 1.75;
|
||||
|
||||
uniform float SMART <
|
||||
ui_type = "drag";
|
||||
ui_min = 0.0;
|
||||
ui_max = 1.0;
|
||||
ui_step = 0.05;
|
||||
ui_label = "Smart deblur";
|
||||
> = 1.0;
|
||||
|
||||
uniform float2 ViewportSize < source = "viewportsize"; >;
|
||||
|
||||
|
||||
static const float3 luma = float3(0.299,0.587,0.114);
|
||||
static const float4 res = float4(0.0001, 0.0001, 0.0001, 0.0001);
|
||||
static const float4 uno = float4(1.,1.,1.,1.);
|
||||
|
||||
|
||||
float min8(float4 a4, float4 b4)
|
||||
{
|
||||
float4 ab4 = min(a4, b4); float2 ab2 = min(ab4.xy, ab4.zw); return min(ab2.x, ab2.y);
|
||||
}
|
||||
|
||||
float max8(float4 a4, float4 b4)
|
||||
{
|
||||
float4 ab4 = max(a4, b4); float2 ab2 = max(ab4.xy, ab4.zw); return max(ab2.x, ab2.y);
|
||||
}
|
||||
|
||||
|
||||
struct ST_VertexOut
|
||||
{
|
||||
float4 t1 : TEXCOORD1;
|
||||
float4 t2 : TEXCOORD2;
|
||||
float4 t3 : TEXCOORD3;
|
||||
};
|
||||
|
||||
|
||||
// Vertex shader generating a triangle covering the entire screen
|
||||
void VS_Deblur_Luma(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);
|
||||
|
||||
float dx = OFFSET/ViewportSize.x;
|
||||
float dy = OFFSET/ViewportSize.y;
|
||||
|
||||
vVARS.t1 = texcoord.xxxy + float4( -dx, 0.0, dx, -dy); // c00 c10 c20
|
||||
vVARS.t2 = texcoord.xxxy + float4( -dx, 0.0, dx, 0.0); // c01 c11 c21
|
||||
vVARS.t3 = texcoord.xxxy + float4( -dx, 0.0, dx, dy); // c02 c12 c22
|
||||
}
|
||||
|
||||
|
||||
float4 PS_Deblur_Luma(float4 vpos: SV_Position, float2 vTexCoord : TEXCOORD, in ST_VertexOut vVARS) : SV_Target
|
||||
{
|
||||
|
||||
float3 c11 = tex2D(ReShade::BackBuffer, vVARS.t2.yw).xyz;
|
||||
float3 c00 = tex2D(ReShade::BackBuffer, vVARS.t1.xw).xyz;
|
||||
float3 c20 = tex2D(ReShade::BackBuffer, vVARS.t1.zw).xyz;
|
||||
float3 c22 = tex2D(ReShade::BackBuffer, vVARS.t3.zw).xyz;
|
||||
float3 c02 = tex2D(ReShade::BackBuffer, vVARS.t3.xw).xyz;
|
||||
float3 c10 = tex2D(ReShade::BackBuffer, vVARS.t1.yw).xyz;
|
||||
float3 c21 = tex2D(ReShade::BackBuffer, vVARS.t2.zw).xyz;
|
||||
float3 c12 = tex2D(ReShade::BackBuffer, vVARS.t3.yw).xyz;
|
||||
float3 c01 = tex2D(ReShade::BackBuffer, vVARS.t2.xw).xyz;
|
||||
|
||||
float4x3 chv = float4x3(c10, c01, c21, c12);
|
||||
float4x3 cdi = float4x3(c00, c02, c20, c22);
|
||||
|
||||
float4 CHV = mul(chv, luma);
|
||||
float4 CDI = mul(cdi, luma);
|
||||
float C11 = dot(c11, luma);
|
||||
|
||||
float mn1 = min8(CHV, CDI);
|
||||
float mx1 = max8(CHV, CDI);
|
||||
|
||||
float2 mnmx = float2(min(C11, mn1), max(C11, mx1));
|
||||
|
||||
float2 dif = abs(float2(C11, C11) - mnmx) + res.xy;
|
||||
|
||||
dif = pow(dif, float2(DEBLUR, DEBLUR));
|
||||
|
||||
float D11 = dot(dif, mnmx.yx)/(dif.x + dif.y);
|
||||
|
||||
float k11 = 1.0/(abs(C11 - D11) + res.x);
|
||||
|
||||
float4 khv = float4(1.0/(abs(CHV-float4(D11, D11, D11, D11)) + res));
|
||||
float4 kdi = float4(1.0/(abs(CDI-float4(D11, D11, D11, D11)) + res));
|
||||
|
||||
float avg = (dot(khv + kdi, uno) + k11)/10.0;
|
||||
|
||||
khv = max(khv-float4(avg, avg, avg, avg), float4(0.0, 0.0, 0.0, 0.0));
|
||||
kdi = max(kdi-float4(avg, avg, avg, avg), float4(0.0, 0.0, 0.0, 0.0));
|
||||
k11 = max(k11-avg, 0.0);
|
||||
|
||||
float3 d11 = (mul(khv, chv) + mul(kdi, cdi) + (k11 + res.x)*c11) / (dot(khv + kdi, uno) + k11 + res.x);
|
||||
|
||||
float contrast = mnmx.y - mnmx.x;
|
||||
c11 = lerp(c11, d11, clamp(1.75*contrast-0.125, 0.0, 1.0));
|
||||
c11 = lerp(d11, c11, SMART);
|
||||
|
||||
return float4(c11, 1.0);
|
||||
}
|
||||
|
||||
|
||||
technique Deblur_Luma
|
||||
{
|
||||
pass
|
||||
{
|
||||
VertexShader = VS_Deblur_Luma;
|
||||
PixelShader = PS_Deblur_Luma;
|
||||
}
|
||||
}
|
||||
367
data/resources/shaders/reshade/Shaders/misc/geom.fx
Normal file
367
data/resources/shaders/reshade/Shaders/misc/geom.fx
Normal file
@@ -0,0 +1,367 @@
|
||||
#include "ReShade.fxh"
|
||||
|
||||
/*
|
||||
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 float geom_curvature <
|
||||
ui_type = "drag";
|
||||
ui_min = 0.0;
|
||||
ui_max = 1.0;
|
||||
ui_step = 1.0;
|
||||
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_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_label = "Geom Distance";
|
||||
> = 1.5;
|
||||
|
||||
uniform float geom_invert_aspect <
|
||||
ui_type = "drag";
|
||||
ui_min = 0.0;
|
||||
ui_max = 1.0;
|
||||
ui_step = 1.0;
|
||||
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_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_label = "Geom Corner Smoothness";
|
||||
> = 1000.0;
|
||||
|
||||
uniform float geom_x_tilt <
|
||||
ui_type = "drag";
|
||||
ui_min = -0.5;
|
||||
ui_max = 0.5;
|
||||
ui_step = 0.05;
|
||||
ui_label = "Geom Horizontal Tilt";
|
||||
> = 0.0;
|
||||
|
||||
uniform float geom_y_tilt <
|
||||
ui_type = "drag";
|
||||
ui_min = -0.5;
|
||||
ui_max = 0.5;
|
||||
ui_step = 0.05;
|
||||
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_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_label = "Geom Vert. Overscan %";
|
||||
> = 100.0;
|
||||
|
||||
uniform float geom_lum <
|
||||
ui_type = "drag";
|
||||
ui_min = 0.5;
|
||||
ui_max = 2.0;
|
||||
ui_step = 0.01;
|
||||
ui_label = "Geom Luminance";
|
||||
> = 1.0;
|
||||
|
||||
uniform float geom_target_gamma <
|
||||
ui_type = "drag";
|
||||
ui_min = 0.1;
|
||||
ui_max = 5.0;
|
||||
ui_step = 0.1;
|
||||
ui_label = "Geom Target Gamma";
|
||||
> = 2.4;
|
||||
|
||||
uniform float geom_monitor_gamma <
|
||||
ui_type = "drag";
|
||||
ui_min = 0.1;
|
||||
ui_max = 5.0;
|
||||
ui_step = 0.1;
|
||||
ui_label = "Geom Monitor Gamma";
|
||||
> = 2.2;
|
||||
|
||||
|
||||
uniform float2 BufferViewportRatio < source = "buffer_to_viewport_ratio"; >;
|
||||
uniform float2 NormalizedNativePixelSize < source = "normalized_native_pixel_size"; >;
|
||||
uniform float2 ViewportSize < source = "viewportsize"; >;
|
||||
|
||||
// Comment the next line to disable interpolation in linear gamma (and
|
||||
// gain speed).
|
||||
#define LINEAR_PROCESSING
|
||||
|
||||
// Enable 3x oversampling of the beam profile; improves moire effect caused by scanlines+curvature
|
||||
#define OVERSAMPLE
|
||||
|
||||
// Use the older, purely gaussian beam profile; uncomment for speed
|
||||
//#define USEGAUSSIAN
|
||||
|
||||
// Macros.
|
||||
#define FIX(c) max(abs(c), 1e-5);
|
||||
#define PI 3.141592653589
|
||||
|
||||
#ifdef LINEAR_PROCESSING
|
||||
# define TEX2D(c) pow(tex2D(ReShade::BackBuffer, (c)), float4(geom_target_gamma,geom_target_gamma,geom_target_gamma,geom_target_gamma))
|
||||
#else
|
||||
# define TEX2D(c) tex2D(ReShade::BackBuffer, (c))
|
||||
#endif
|
||||
|
||||
// aspect ratio
|
||||
#define aspect (geom_invert_aspect>0.5?float2(0.75,1.0):float2(1.0,0.75))
|
||||
#define overscan (float2(1.01,1.01));
|
||||
|
||||
|
||||
struct ST_VertexOut
|
||||
{
|
||||
float2 sinangle : TEXCOORD1;
|
||||
float2 cosangle : TEXCOORD2;
|
||||
float3 stretch : TEXCOORD3;
|
||||
float2 TextureSize : TEXCOORD4;
|
||||
};
|
||||
|
||||
|
||||
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));
|
||||
}
|
||||
|
||||
|
||||
|
||||
// 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);
|
||||
|
||||
// float2 SourceSize = 1.0/NormalizedNativePixelSize;
|
||||
float2 SourceSize = ViewportSize*BufferViewportRatio;
|
||||
|
||||
// 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;
|
||||
|
||||
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);
|
||||
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 = float2(0.5, 0.5)*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 - float2(0.5, 0.5))*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));
|
||||
}
|
||||
|
||||
float corner(float2 coord)
|
||||
{
|
||||
coord = (coord - float2(0.5, 0.5)) * float2(geom_overscan_x / 100.0, geom_overscan_y / 100.0) + float2(0.5, 0.5);
|
||||
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));
|
||||
|
||||
return clamp((cdist.x - dist)*geom_cornersmooth, 0.0, 1.0);
|
||||
}
|
||||
|
||||
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;
|
||||
|
||||
if (geom_curvature > 0.5)
|
||||
xy = transform(vTexCoord, vVARS.sinangle, vVARS.cosangle, vVARS.stretch);
|
||||
else
|
||||
xy = vTexCoord;
|
||||
|
||||
float cval = corner(xy);
|
||||
|
||||
float2 uv_ratio = frac((xy * vVARS.TextureSize - float2(0.5, 0.5)) / 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));
|
||||
#endif
|
||||
|
||||
col.rgb *= (geom_lum * step(0.0, uv_ratio.y));
|
||||
|
||||
float3 mul_res = col.rgb * float3(cval, cval, cval);
|
||||
|
||||
// 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));
|
||||
|
||||
return float4(mul_res, 1.0);
|
||||
}
|
||||
|
||||
|
||||
technique CRT_Geom
|
||||
{
|
||||
pass
|
||||
{
|
||||
VertexShader = VS_CRT_Geom;
|
||||
PixelShader = PS_CRT_Geom;
|
||||
}
|
||||
}
|
||||
75
data/resources/shaders/reshade/Shaders/misc/multi-LUT.fx
Normal file
75
data/resources/shaders/reshade/Shaders/misc/multi-LUT.fx
Normal file
@@ -0,0 +1,75 @@
|
||||
#include "ReShade.fxh"
|
||||
|
||||
|
||||
// Multi-LUT Shader
|
||||
|
||||
// A simple shader that can load 2 LUTs.
|
||||
// Can turn LUT off too.
|
||||
|
||||
|
||||
|
||||
uniform int LUT_selector <
|
||||
ui_type = "combo";
|
||||
ui_items = "Off\0Grade-RGB\0Grade-Composite\0";
|
||||
ui_label = "LUT selector";
|
||||
ui_tooltip = "Off: nothing. Grade-RGB: rgb trinitron colors. Grade-Composite: composite trinitron colors.";
|
||||
> = 1;
|
||||
|
||||
|
||||
texture tLUT1<source="../Textures/multi-LUT/grade-rgb.png";>{Width=1024;Height=32;};
|
||||
sampler SamplerLUT1{Texture=tLUT1;};
|
||||
|
||||
texture tLUT2<source="../Textures/multi-LUT/grade-composite.png";>{Width=1024;Height=32;};
|
||||
sampler SamplerLUT2{Texture=tLUT2;};
|
||||
|
||||
// This shouldn't be necessary but it seems some undefined values can
|
||||
// creep in and each GPU vendor handles that differently. This keeps
|
||||
// all values within a safe range
|
||||
float4 mixfix(float4 a, float4 b, float c)
|
||||
{
|
||||
return (a.z < 1.0) ? lerp(a, b, c) : a;
|
||||
}
|
||||
|
||||
float4 multiLUT(float4 vpos: SV_Position, float2 vTexCoord : TEXCOORD0) : SV_Target
|
||||
{
|
||||
float4 imgColor = tex2D(ReShade::BackBuffer, vTexCoord.xy);
|
||||
|
||||
if (LUT_selector > 0)
|
||||
{
|
||||
//float LUT_Size = lerp(textureSize(SamplerLUT1, 0).y, textureSize(SamplerLUT2, 0).y, LUT_selector_param - 1.0);
|
||||
float LUT_Size = 32.0;
|
||||
float4 color1, color2 = float4(0.,0.,0.,0.);
|
||||
float red, green, blue1, blue2, mixer = 0.0;
|
||||
|
||||
red = ( imgColor.r * (LUT_Size - 1.0) + 0.4999 ) / (LUT_Size * LUT_Size);
|
||||
green = ( imgColor.g * (LUT_Size - 1.0) + 0.4999 ) / LUT_Size;
|
||||
blue1 = (floor( imgColor.b * (LUT_Size - 1.0) ) / LUT_Size) + red;
|
||||
blue2 = (ceil( imgColor.b * (LUT_Size - 1.0) ) / LUT_Size) + red;
|
||||
mixer = clamp(max((imgColor.b - blue1) / (blue2 - blue1), 0.0), 0.0, 32.0);
|
||||
|
||||
if(LUT_selector == 1)
|
||||
{
|
||||
color1 = tex2D(SamplerLUT1, float2( blue1, green ));
|
||||
color2 = tex2D(SamplerLUT1, float2( blue2, green ));
|
||||
}
|
||||
else
|
||||
{
|
||||
color1 = tex2D(SamplerLUT2, float2( blue1, green ));
|
||||
color2 = tex2D(SamplerLUT2, float2( blue2, green ));
|
||||
}
|
||||
imgColor = mixfix(color1, color2, mixer);
|
||||
}
|
||||
|
||||
return imgColor;
|
||||
}
|
||||
|
||||
|
||||
|
||||
technique multiLUT
|
||||
{
|
||||
pass PS_multiLUT
|
||||
{
|
||||
VertexShader = PostProcessVS;
|
||||
PixelShader = multiLUT;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user