From 9d3f32840464c6dee3022a1628fb17a85a5abad1 Mon Sep 17 00:00:00 2001 From: Michael Prince Sharpe Date: Wed, 24 Apr 2024 16:18:49 +0100 Subject: [PATCH] Adding crt-guest-advanced-HD shader (#3189) * Add CRT-Guest-Advanced-HD * Update CRT-Guest info * Update CRT-Guest info * Update CRT-Guest info * Update CRT-Guest info * reversion for correction * Update thirdparty.html * Update thirdparty.html * Update thirdparty.html * Update thirdparty.html * Add files via upload * Update source.txt --- .../shaders/reshade/Shaders/CRT-Guest-HD.fx | 2157 +++++++++++++++++ .../shaders/reshade/Textures/CRT-LUT-1.png | Bin 0 -> 14866 bytes .../shaders/reshade/Textures/CRT-LUT-2.png | Bin 0 -> 15627 bytes .../shaders/reshade/Textures/CRT-LUT-3.png | Bin 0 -> 15243 bytes .../shaders/reshade/Textures/CRT-LUT-4.png | Bin 0 -> 22140 bytes data/resources/shaders/reshade/source.txt | 1 + data/resources/thirdparty.html | 1 + 7 files changed, 2159 insertions(+) create mode 100644 data/resources/shaders/reshade/Shaders/CRT-Guest-HD.fx create mode 100644 data/resources/shaders/reshade/Textures/CRT-LUT-1.png create mode 100644 data/resources/shaders/reshade/Textures/CRT-LUT-2.png create mode 100644 data/resources/shaders/reshade/Textures/CRT-LUT-3.png create mode 100644 data/resources/shaders/reshade/Textures/CRT-LUT-4.png diff --git a/data/resources/shaders/reshade/Shaders/CRT-Guest-HD.fx b/data/resources/shaders/reshade/Shaders/CRT-Guest-HD.fx new file mode 100644 index 000000000..dad01a946 --- /dev/null +++ b/data/resources/shaders/reshade/Shaders/CRT-Guest-HD.fx @@ -0,0 +1,2157 @@ +/* + + CRT - Guest - HD (Copyright (C) 2018-2024 guest(r) - guest.r@gmail.com) + + Incorporates many good ideas and suggestions from Dr. Venom. + + I would also like give thanks to many Libretro forums members for continuous feedbacks, suggestions and caring about the shader. + + 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 hopes 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 - STE 330, Boston, MA 02111-1307, USA. + + Ported to ReShade by DevilSingh with some help from guest(r) + +*/ + +uniform float internal_res < + ui_type = "drag"; + ui_min = 1.0; + ui_max = 8.0; + ui_step = 0.1; + ui_label = "Internal Resolution"; +> = 1.0; + +uniform float PR < + ui_type = "drag"; + ui_min = 0.0; + ui_max = 0.5; + ui_step = 0.01; + ui_label = "Persistence 'R'"; +> = 0.32; + +uniform float PG < + ui_type = "drag"; + ui_min = 0.0; + ui_max = 0.5; + ui_step = 0.01; + ui_label = "Persistence 'G'"; +> = 0.32; + +uniform float PB < + ui_type = "drag"; + ui_min = 0.0; + ui_max = 0.5; + ui_step = 0.01; + ui_label = "Persistence 'B'"; +> = 0.32; + +uniform float AS < + ui_type = "drag"; + ui_min = 0.0; + ui_max = 0.6; + ui_step = 0.01; + ui_label = "Afterglow Strength"; +> = 0.2; + +uniform float sat < + ui_type = "drag"; + ui_min = 0.0; + ui_max = 1.0; + ui_step = 0.01; + ui_label = "Afterglow Saturation"; +> = 0.5; + +uniform float CS < + ui_type = "drag"; + ui_min = 0.0; + ui_max = 4.0; + ui_step = 1.0; + ui_label = "Display Gamut: sRGB | Modern | DCI | Adobe | Rec. 2020"; +> = 0.0; + +uniform float CP < + ui_type = "drag"; + ui_min = -1.0; + ui_max = 5.0; + ui_step = 1.0; + ui_label = "CRT Profile: EBU | P22 | SMPTE-C | Philips | Trinitron"; +> = 0.0; + +uniform float TNTC < + ui_type = "drag"; + ui_min = 0.0; + ui_max = 4.0; + ui_step = 1.0; + ui_label = "LUT Colors: Trinitron 1 | Trinitron 2 | Nec MultiSync | NTSC"; +> = 0.0; + +uniform float LUTLOW < + ui_type = "drag"; + ui_min = 0.0; + ui_max = 50.0; + ui_step = 1.0; + ui_label = "Fix LUT Dark Range"; +> = 5.0; + +uniform float LUTBR < + ui_type = "drag"; + ui_min = 0.0; + ui_max = 1.0; + ui_step = 0.01; + ui_label = "Fix LUT Brightness"; +> = 1.0; + +uniform float WP < + ui_type = "drag"; + ui_min = -100.0; + ui_max = 100.0; + ui_step = 5.0; + ui_label = "Color Temperature %"; +> = 0.0; + +uniform float wp_saturation < + ui_type = "drag"; + ui_min = 0.0; + ui_max = 2.0; + ui_step = 0.05; + ui_label = "Saturation Adjustment"; +> = 1.0; + +uniform float pre_bb < + ui_type = "drag"; + ui_min = 0.0; + ui_max = 2.0; + ui_step = 0.01; + ui_label = "Brightness Adjustment"; +> = 1.0; + +uniform float contr < + ui_type = "drag"; + ui_min = -2.0; + ui_max = 2.0; + ui_step = 0.05; + ui_label = "Contrast Adjustment"; +> = 0.0; + +uniform float sega_fix < + ui_type = "drag"; + ui_min = 0.0; + ui_max = 1.0; + ui_step = 1.0; + ui_label = "Sega Brightness Fix"; +> = 0.0; + +uniform float BP < + ui_type = "drag"; + ui_min = -100.0; + ui_max = 25.0; + ui_step = 1.0; + ui_label = "Raise Black Level"; +> = 0.0; + +uniform float vigstr < + ui_type = "drag"; + ui_min = 0.0; + ui_max = 2.0; + ui_step = 0.05; + ui_label = "Vignette Strength"; +> = 0.0; + +uniform float vigdef < + ui_type = "drag"; + ui_min = 0.5; + ui_max = 3.0; + ui_step = 0.1; + ui_label = "Vignette Size"; +> = 1.0; + +uniform float gamma_i < + ui_type = "drag"; + ui_min = 1.0; + ui_max = 5.0; + ui_step = 0.05; + ui_label = "Gamma Input"; +> = 1.80; + +uniform float gamma_o < + ui_type = "drag"; + ui_min = 1.0; + ui_max = 5.0; + ui_step = 0.05; + ui_label = "Gamma Out"; +> = 1.75; + +uniform float interr < + ui_type = "drag"; + ui_min = 0.0; + ui_max = 800.0; + ui_step = 25.0; + ui_label = "Interlace Trigger Resolution / VGA Trigger"; +> = 375.0; + +uniform float interm < + ui_type = "drag"; + ui_min = 0.0; + ui_max = 4.0; + ui_step = 1.0; + ui_label = "Interlace Mode: 0:OFF | 1-3:Normal | 4:Interpolation"; +> = 4.0; + +uniform float iscanb < + ui_type = "drag"; + ui_min = 0.0; + ui_max = 1.0; + ui_step = 0.05; + ui_label = "Interlacing Scanlines Effect (Interlaced Brightness)"; +> = 0.2; + +uniform float iscans < + ui_type = "drag"; + ui_min = 0.0; + ui_max = 1.0; + ui_step = 0.05; + ui_label = "Interlacing Scanlines Saturation"; +> = 0.25; + +uniform float vga_mode < + ui_type = "drag"; + ui_min = 0.0; + ui_max = 1.0; + ui_step = 1.0; + ui_label = "VGA Single/Double Scan Mode"; +> = 0.0; + +uniform float hiscan < + ui_type = "drag"; + ui_min = 0.0; + ui_max = 1.0; + ui_step = 1.0; + ui_label = "High Resolution Scanlines (Prepend A Scaler)"; +> = 0.0; + +uniform float intres < + ui_type = "drag"; + ui_min = 0.0; + ui_max = 6.0; + ui_step = 0.5; + ui_label = "Internal Resolution Y: 0.5 | Y-Dowsample"; +> = 0.0; + +uniform float HSHARPNESS < + ui_type = "drag"; + ui_min = 1.0; + ui_max = 8.0; + ui_step = 0.05; + ui_label = "Horizontal Filter Range"; +> = 1.0; + +uniform float SIGMA_HOR < + ui_type = "drag"; + ui_min = 0.1; + ui_max = 7.0; + ui_step = 0.025; + ui_label = "Horizontal Blur Sigma"; +> = 0.5; + +uniform float S_SHARPH < + ui_type = "drag"; + ui_min = 0.0; + ui_max = 2.0; + ui_step = 0.1; + ui_label = "Horizontal Substractive Sharpness"; +> = 1.0; + +uniform float HSHARP < + ui_type = "drag"; + ui_min = 0.0; + ui_max = 2.0; + ui_step = 0.1; + ui_label = "Horizontal Sharpness Definition"; +> = 1.2; + +uniform float HARNG < + ui_type = "drag"; + ui_min = 0.0; + ui_max = 4.0; + ui_step = 0.1; + ui_label = "Horizontal Substractive Sharpness Ringing"; +> = 0.2; + +uniform float VSHARPNESS < + ui_type = "drag"; + ui_min = 1.0; + ui_max = 8.0; + ui_step = 0.05; + ui_label = "Vertical Filter Range"; +> = 1.0; + +uniform float SIGMA_VER < + ui_type = "drag"; + ui_min = 0.1; + ui_max = 7.0; + ui_step = 0.025; + ui_label = "Vertical Blur Sigma"; +> = 0.5; + +uniform float S_SHARPV < + ui_type = "drag"; + ui_min = 0.0; + ui_max = 2.0; + ui_step = 0.1; + ui_label = "Vertical Substractive Sharpness"; +> = 1.0; + +uniform float VSHARP < + ui_type = "drag"; + ui_min = 0.0; + ui_max = 2.0; + ui_step = 0.1; + ui_label = "Vertical Sharpness Definition"; +> = 1.2; + +uniform float VARNG < + ui_type = "drag"; + ui_min = 0.0; + ui_max = 4.0; + ui_step = 0.1; + ui_label = "Vertical Substractive Sharpness Ringing"; +> = 0.2; + +uniform float MAXS < + ui_type = "drag"; + ui_min = 0.0; + ui_max = 0.3; + ui_step = 0.01; + ui_label = "Maximum Sharpness"; +> = 0.15; + +uniform float m_glow < + ui_type = "drag"; + ui_min = 0.0; + ui_max = 2.0; + ui_step = 1.0; + ui_label = "Ordinary Glow | Magic Glow"; +> = 0.0; + +uniform float m_glow_cutoff < + ui_type = "drag"; + ui_min = 0.0; + ui_max = 0.4; + ui_step = 0.01; + ui_label = "Magic Glow Cutoff"; +> = 0.12; + +uniform float m_glow_low < + ui_type = "drag"; + ui_min = 0.0; + ui_max = 7.0; + ui_step = 0.05; + ui_label = "Magic Glow Low Strength"; +> = 0.35; + +uniform float m_glow_high < + ui_type = "drag"; + ui_min = 0.0; + ui_max = 7.0; + ui_step = 0.1; + ui_label = "Magic Glow High Strength"; +> = 5.0; + +uniform float m_glow_dist < + ui_type = "drag"; + ui_min = 0.2; + ui_max = 4.0; + ui_step = 0.05; + ui_label = "Magic Glow Distribution"; +> = 1.0; + +uniform float m_glow_mask < + ui_type = "drag"; + ui_min = 0.0; + ui_max = 2.0; + ui_step = 0.025; + ui_label = "Magic Glow Mask Strength"; +> = 1.0; + +uniform float FINE_GAUSS < + ui_type = "drag"; + ui_min = 1.0; + ui_max = 5.0; + ui_step = 1.0; + ui_label = "Fine (Magic) Glow Sampling"; +> = 1.0; + +uniform float SIZEH < + ui_type = "drag"; + ui_min = 1.0; + ui_max = 50.0; + ui_step = 1.0; + ui_label = "Horizontal Glow Radius"; +> = 6.0; + +uniform float SIGMA_H < + ui_type = "drag"; + ui_min = 0.2; + ui_max = 15.0; + ui_step = 0.05; + ui_label = "Horizontal Glow Sigma"; +> = 1.2; + +uniform float SIZEV < + ui_type = "drag"; + ui_min = 1.0; + ui_max = 50.0; + ui_step = 1.0; + ui_label = "Vertical Glow Radius"; +> = 6.0; + +uniform float SIGMA_V < + ui_type = "drag"; + ui_min = 0.2; + ui_max = 15.0; + ui_step = 0.05; + ui_label = "Vertical Glow Sigma"; +> = 1.2; + +uniform float FINE_BLOOM < + ui_type = "drag"; + ui_min = 1.0; + ui_max = 5.0; + ui_step = 1.0; + ui_label = "Fine Bloom/Halation Sampling"; +> = 1.0; + +uniform float SIZEX < + ui_type = "drag"; + ui_min = 1.0; + ui_max = 50.0; + ui_step = 1.0; + ui_label = "Horizontal Bloom/Halation Radius"; +> = 3.0; + +uniform float SIGMA_X < + ui_type = "drag"; + ui_min = 0.25; + ui_max = 15.0; + ui_step = 0.025; + ui_label = "Horizontal Bloom/Halation Sigma"; +> = 0.75; + +uniform float SIZEY < + ui_type = "drag"; + ui_min = 1.0; + ui_max = 50.0; + ui_step = 1.0; + ui_label = "Vertical Bloom/Halation Radius"; +> = 3.0; + +uniform float SIGMA_Y < + ui_type = "drag"; + ui_min = 0.25; + ui_max = 15.0; + ui_step = 0.025; + ui_label = "Vertical Bloom/Halation Sigma"; +> = 0.60; + +uniform float glow < + ui_type = "drag"; + ui_min = -2.0; + ui_max = 2.0; + ui_step = 0.01; + ui_label = "(Magic) Glow Strength"; +> = 0.08; + +uniform float bloom < + ui_type = "drag"; + ui_min = -2.0; + ui_max = 2.0; + ui_step = 0.05; + ui_label = "Bloom Strength"; +> = 0.0; + +uniform float b_mask < + ui_type = "drag"; + ui_min = -1.0; + ui_max = 1.0; + ui_step = 0.025; + ui_label = "Bloom Mask Strength"; +> = 0.0; + +uniform float mask_bloom < + ui_type = "drag"; + ui_min = -2.0; + ui_max = 2.0; + ui_step = 0.05; + ui_label = "Mask Bloom"; +> = 0.0; + +uniform float bloom_dist < + ui_type = "drag"; + ui_min = -2.0; + ui_max = 3.0; + ui_step = 0.05; + ui_label = "Bloom Distribution"; +> = 0.0; + +uniform float halation < + ui_type = "drag"; + ui_min = -2.0; + ui_max = 2.0; + ui_step = 0.025; + ui_label = "Halation Strength"; +> = 0.0; + +uniform float h_mask < + ui_type = "drag"; + ui_min = -1.0; + ui_max = 1.0; + ui_step = 0.025; + ui_label = "Halation Mask Strength"; +> = 0.5; + +uniform float gamma_c < + ui_type = "drag"; + ui_min = 0.5; + ui_max = 2.0; + ui_step = 0.025; + ui_label = "Gamma Correct"; +> = 1.0; + +uniform float brightboost1 < + ui_type = "drag"; + ui_min = 0.25; + ui_max = 10.0; + ui_step = 0.05; + ui_label = "Bright Boost Dark Pixels"; +> = 1.4; + +uniform float brightboost2 < + ui_type = "drag"; + ui_min = 0.25; + ui_max = 3.0; + ui_step = 0.025; + ui_label = "Bright Boost Bright Pixels"; +> = 1.1; + +uniform float clp < + ui_type = "drag"; + ui_min = -1.0; + ui_max = 1.0; + ui_step = 0.05; + ui_label = "Clip Saturated Color Beams"; +> = 0.0; + +uniform float gsl < + ui_type = "drag"; + ui_min = -1.0; + ui_max = 2.0; + ui_step = 1.0; + ui_label = "Scanlines Type"; +> = 0.0; + +uniform float scanline1 < + ui_type = "drag"; + ui_min = -20.0; + ui_max = 40.0; + ui_step = 0.5; + ui_label = "Scanlines Beam Shape Center"; +> = 6.0; + +uniform float scanline2 < + ui_type = "drag"; + ui_min = 0.0; + ui_max = 70.0; + ui_step = 1.0; + ui_label = "Scanlines Beam Shape Edges"; +> = 8.0; + +uniform float beam_min < + ui_type = "drag"; + ui_min = 0.25; + ui_max = 10.0; + ui_step = 0.05; + ui_label = "Scanlines Shape Dark Pixels"; +> = 1.2; + +uniform float beam_max < + ui_type = "drag"; + ui_min = 0.2; + ui_max = 3.5; + ui_step = 0.025; + ui_label = "Scanlines Shape Bright Pixels"; +> = 1.0; + +uniform float tds < + ui_type = "drag"; + ui_min = 0.0; + ui_max = 1.0; + ui_step = 1.0; + ui_label = "Thinner Dark Scanlines"; +> = 0.0; + +uniform float beam_size < + ui_type = "drag"; + ui_min = 0.0; + ui_max = 1.0; + ui_step = 0.05; + ui_label = "Increased Bright Scanlines Beam"; +> = 0.6; + +uniform float scans < + ui_type = "drag"; + ui_min = 0.0; + ui_max = 6.0; + ui_step = 0.1; + ui_label = "Scanlines Saturation / Mask Falloff"; +> = 0.5; + +uniform float scan_falloff < + ui_type = "drag"; + ui_min = 0.1; + ui_max = 2.0; + ui_step = 0.025; + ui_label = "Scanlines Falloff"; +> = 1.0; + +uniform float spike < + ui_type = "drag"; + ui_min = 0.0; + ui_max = 2.0; + ui_step = 0.1; + ui_label = "Scanlines Spike Removal"; +> = 1.0; + +uniform float ssharp < + ui_type = "drag"; + ui_min = 0.0; + ui_max = 0.3; + ui_step = 0.01; + ui_label = "Smart Sharpen Scanlines"; +> = 0.0; + +uniform float scangamma < + ui_type = "drag"; + ui_min = 0.5; + ui_max = 5.0; + ui_step = 0.05; + ui_label = "Scanlines Gamma"; +> = 2.4; + +uniform float no_scanlines < + ui_type = "drag"; + ui_min = 0.0; + ui_max = 1.5; + ui_step = 0.05; + ui_label = "No-Scanlines Mode"; +> = 0.0; + +uniform float IOS < + ui_type = "drag"; + ui_min = 0.0; + ui_max = 4.0; + ui_step = 1.0; + ui_label = "Integer Scaling: Odd:Y | Even:X+Y"; +> = 0.0; + +uniform float csize < + ui_type = "drag"; + ui_min = 0.0; + ui_max = 0.25; + ui_step = 0.005; + ui_label = "Corner Size"; +> = 0.0; + +uniform float bsize < + ui_type = "drag"; + ui_min = 0.0; + ui_max = 3.0; + ui_step = 0.01; + ui_label = "Border Size"; +> = 0.01; + +uniform float sborder < + ui_type = "drag"; + ui_min = 0.25; + ui_max = 2.0; + ui_step = 0.05; + ui_label = "Border Intensity"; +> = 0.75; + +uniform float barspeed < + ui_type = "drag"; + ui_min = 5.0; + ui_max = 200.0; + ui_step = 1.0; + ui_label = "Hum Bar Speed"; +> = 50.0; + +uniform float barintensity < + ui_type = "drag"; + ui_min = -1.0; + ui_max = 1.0; + ui_step = 0.01; + ui_label = "Hum Bar Intensity"; +> = 0.0; + +uniform float bardir < + ui_type = "drag"; + ui_min = 0.0; + ui_max = 1.0; + ui_step = 1.0; + ui_label = "Hum Bar Direction"; +> = 0.0; + +uniform float warpx < + ui_type = "drag"; + ui_min = 0.0; + ui_max = 0.25; + ui_step = 0.01; + ui_label = "Curvature X (Default 0.03)"; +> = 0.0; + +uniform float warpy < + ui_type = "drag"; + ui_min = 0.0; + ui_max = 0.25; + ui_step = 0.01; + ui_label = "Curvature Y (Default 0.04)"; +> = 0.0; + +uniform float c_shape < + ui_type = "drag"; + ui_min = 0.05; + ui_max = 0.6; + ui_step = 0.05; + ui_label = "Curvature Shape"; +> = 0.25; + +uniform float overscanx < + ui_type = "drag"; + ui_min = -200.0; + ui_max = 200.0; + ui_step = 1.0; + ui_label = "Overscan X Original Pixels"; +> = 0.0; + +uniform float overscany < + ui_type = "drag"; + ui_min = -200.0; + ui_max = 200.0; + ui_step = 1.0; + ui_label = "Overscan Y Original Pixels"; +> = 0.0; + +uniform float shadow_msk < + ui_type = "drag"; + ui_min = 0.0; + ui_max = 14.0; + ui_step = 1.0; + ui_label = "CRT Mask: 1:CGWG | 2-5:Lottes | 6-14:Trinitron"; +> = 1.0; + +uniform float maskstr < + ui_type = "drag"; + ui_min = -0.5; + ui_max = 1.0; + ui_step = 0.025; + ui_label = "Mask Strength (1, 6-14)"; +> = 0.3; + +uniform float mcut < + ui_type = "drag"; + ui_min = 0.0; + ui_max = 2.0; + ui_step = 0.05; + ui_label = "Mask 6-14 Low Strength"; +> = 1.1; + +uniform float maskboost < + ui_type = "drag"; + ui_min = 1.0; + ui_max = 3.0; + ui_step = 0.05; + ui_label = "CRT Mask Boost"; +> = 1.0; + +uniform float masksize < + ui_type = "drag"; + ui_min = 1.0; + ui_max = 4.0; + ui_step = 1.0; + ui_label = "CRT Mask Size"; +> = 1.0; + +uniform float mask_zoom < + ui_type = "drag"; + ui_min = -5.0; + ui_max = 5.0; + ui_step = 1.0; + ui_label = "CRT Mask Zoom (+ Mask Width)"; +> = 0.0; + +uniform float zoom_mask < + ui_type = "drag"; + ui_min = 0.0; + ui_max = 1.0; + ui_step = 0.05; + ui_label = "CRT Mask Zoom Sharpen"; +> = 0.0; + +uniform float mshift < + ui_type = "drag"; + ui_min = 0.0; + ui_max = 1.0; + ui_step = 0.5; + ui_label = "(Transform to) Shadow Mask"; +> = 0.0; + +uniform float mask_layout < + ui_type = "drag"; + ui_min = 0.0; + ui_max = 1.0; + ui_step = 1.0; + ui_label = "Mask Layout: RGB or BGR (Check LCD Panel)"; +> = 0.0; + +uniform float mask_drk < + ui_type = "drag"; + ui_min = 0.0; + ui_max = 2.0; + ui_step = 0.05; + ui_label = "Lottes Mask Dark"; +> = 0.5; + +uniform float mask_lgt < + ui_type = "drag"; + ui_min = 0.0; + ui_max = 2.0; + ui_step = 0.05; + ui_label = "Lottes Mask Bright"; +> = 1.5; + +uniform float mask_gamma < + ui_type = "drag"; + ui_min = 1.0; + ui_max = 5.0; + ui_step = 0.05; + ui_label = "Mask Gamma"; +> = 2.4; + +uniform float slotmask1 < + ui_type = "drag"; + ui_min = 0.0; + ui_max = 1.0; + ui_step = 0.05; + ui_label = "Slot Mask Strength Bright Pixels"; +> = 0.0; + +uniform float slotmask2 < + ui_type = "drag"; + ui_min = 0.0; + ui_max = 1.0; + ui_step = 0.05; + ui_label = "Slot Mask Strength Dark Pixels"; +> = 0.0; + +uniform float slotwidth < + ui_type = "drag"; + ui_min = 0.0; + ui_max = 16.0; + ui_step = 1.0; + ui_label = "Slot Mask Width (0:Auto)"; +> = 0.0; + +uniform float double_slot < + ui_type = "drag"; + ui_min = 1.0; + ui_max = 4.0; + ui_step = 1.0; + ui_label = "Slot Mask Height: 2x1 or 4x1"; +> = 2.0; + +uniform float slotms < + ui_type = "drag"; + ui_min = 1.0; + ui_max = 4.0; + ui_step = 1.0; + ui_label = "Slot Mask Thickness"; +> = 1.0; + +uniform float smoothmask < + ui_type = "drag"; + ui_min = 0.0; + ui_max = 1.0; + ui_step = 1.0; + ui_label = "Smooth Masks In Bright Scanlines"; +> = 0.0; + +uniform float smask_mit < + ui_type = "drag"; + ui_min = 0.0; + ui_max = 1.0; + ui_step = 0.05; + ui_label = "Mitigate Slot Mask Interaction"; +> = 0.0; + +uniform float bmask < + ui_type = "drag"; + ui_min = 0.0; + ui_max = 0.25; + ui_step = 0.01; + ui_label = "Base (Black) Mask Strength"; +> = 0.0; + +uniform float mclip < + ui_type = "drag"; + ui_min = 0.0; + ui_max = 1.0; + ui_step = 0.025; + ui_label = "Preserve Mask Strength"; +> = 0.0; + +uniform float dctypex < + ui_type = "drag"; + ui_min = 0.0; + ui_max = 0.75; + ui_step = 0.05; + ui_label = "Deconvergence Type X: 0:Static | Other:Dynamic"; +> = 0.0; + +uniform float dctypey < + ui_type = "drag"; + ui_min = 0.0; + ui_max = 0.75; + ui_step = 0.05; + ui_label = "Deconvergence Type Y: 0:Static | Other:Dynamic"; +> = 0.0; + +uniform float deconrx < + ui_type = "drag"; + ui_min = -15.0; + ui_max = 15.0; + ui_step = 0.25; + ui_label = "Horizontal Deconvergence 'R' Range"; +> = 0.0; + +uniform float decongx < + ui_type = "drag"; + ui_min = -15.0; + ui_max = 15.0; + ui_step = 0.25; + ui_label = "Horizontal Deconvergence 'G' Range"; +> = 0.0; + +uniform float deconbx < + ui_type = "drag"; + ui_min = -15.0; + ui_max = 15.0; + ui_step = 0.25; + ui_label = "Horizontal Deconvergence 'B' Range"; +> = 0.0; + +uniform float deconry < + ui_type = "drag"; + ui_min = -15.0; + ui_max = 15.0; + ui_step = 0.25; + ui_label = "Vertical Deconvergence 'R' Range"; +> = 0.0; + +uniform float decongy < + ui_type = "drag"; + ui_min = -15.0; + ui_max = 15.0; + ui_step = 0.25; + ui_label = "Vertical Deconvergence 'G' Range"; +> = 0.0; + +uniform float deconby < + ui_type = "drag"; + ui_min = -15.0; + ui_max = 15.0; + ui_step = 0.25; + ui_label = "Vertical Deconvergence 'B' Range"; +> = 0.0; + +uniform float decons < + ui_type = "drag"; + ui_min = 0.0; + ui_max = 3.0; + ui_step = 0.1; + ui_label = "Deconvergence Strength"; +> = 1.0; + +uniform float addnoised < + ui_type = "drag"; + ui_min = -1.0; + ui_max = 1.0; + ui_step = 0.02; + ui_label = "Add Noise"; +> = 0.0; + +uniform float noiseresd < + ui_type = "drag"; + ui_min = 1.0; + ui_max = 10.0; + ui_step = 1.0; + ui_label = "Noise Resolution"; +> = 2.0; + +uniform float noisetype < + ui_type = "drag"; + ui_min = 0.0; + ui_max = 1.0; + ui_step = 1.0; + ui_label = "Noise Type: Colored | Luma"; +> = 0.0; + +uniform float post_br < + ui_type = "drag"; + ui_min = 0.25; + ui_max = 5.0; + ui_step = 0.01; + ui_label = "Post Brightness"; +> = 1.0; + +#include "ReShade.fxh" + +#define TexSize float2(Resolution_X,Resolution_Y) +#define IptSize float2(800.00000000,600.00000000) +#define OptSize float4(BUFFER_SCREEN_SIZE,1.0/BUFFER_SCREEN_SIZE) +#define OrgSize float4(TexSize,1.0/TexSize) +#define SrcSize float4(IptSize,1.0/IptSize) +#define fuxcoord (texcoord*1.00001) +#define scans 1.5*scans +#define internal_res internal_res*(1.0/(1.0+hiscan)) +#define eps 1e-10 +#define fracoord (fuxcoord*OptSize.xy) +#define COMPAT_TEXTURE(c,d) tex2D(c,d) +#define inv_sqr_h 1.0/(2.0*SIGMA_H*SIGMA_H) +#define inv_sqr_v 1.0/(2.0*SIGMA_V*SIGMA_V) +#define inv_sqr_x 1.0/(2.0*SIGMA_X*SIGMA_X) +#define inv_sqr_y 1.0/(2.0*SIGMA_Y*SIGMA_Y) +#define invsigmah 1.0/(2.0*SIGMA_HOR*SIGMA_HOR*internal_res*internal_res) +#define invsigmav 1.0/(2.0*SIGMA_VER*SIGMA_VER*internal_res*internal_res) + +#ifndef Resolution_X +#define Resolution_X 320 +#endif + +#ifndef Resolution_Y +#define Resolution_Y 240 +#endif + +#define CRTHD_S0 ReShade::BackBuffer + +texture CRTHD_T1{Width=Resolution_X;Height=Resolution_Y ;Format=RGBA32F;}; +sampler CRTHD_S1{Texture=CRTHD_T1;AddressU=BORDER;AddressV=BORDER;AddressW=BORDER;MagFilter=POINT ;MinFilter=POINT ;MipFilter=POINT ;}; + +texture CRTHD_T2{Width=Resolution_X;Height=Resolution_Y ;Format=RGBA16F;}; +sampler CRTHD_S2{Texture=CRTHD_T2;AddressU=BORDER;AddressV=BORDER;AddressW=BORDER;MagFilter=POINT ;MinFilter=POINT ;MipFilter=POINT ;}; + +texture CRTHD_T3{Width=Resolution_X;Height=Resolution_Y ;Format=RGBA16F;}; +sampler CRTHD_S3{Texture=CRTHD_T3;AddressU=BORDER;AddressV=BORDER;AddressW=BORDER;MagFilter=LINEAR;MinFilter=LINEAR;MipFilter=LINEAR;}; + +texture CRTHD_T4{Width=BUFFER_WIDTH;Height=Resolution_Y ;Format=RGBA16F;}; +sampler CRTHD_S4{Texture=CRTHD_T4;AddressU=BORDER;AddressV=BORDER;AddressW=BORDER;MagFilter=LINEAR;MinFilter=LINEAR;MipFilter=LINEAR;}; + +texture CRTHD_T5{Width=800.00000000;Height=600.00000000 ;Format=RGBA16F;}; +sampler CRTHD_S5{Texture=CRTHD_T5;AddressU=BORDER;AddressV=BORDER;AddressW=BORDER;MagFilter=LINEAR;MinFilter=LINEAR;MipFilter=LINEAR;}; + +texture CRTHD_T6{Width=800.00000000;Height=600.00000000 ;Format=RGBA16F;}; +sampler CRTHD_S6{Texture=CRTHD_T6;AddressU=BORDER;AddressV=BORDER;AddressW=BORDER;MagFilter=LINEAR;MinFilter=LINEAR;MipFilter=LINEAR;}; + +texture CRTHD_T7{Width=800.00000000;Height=600.00000000 ;Format=RGBA16F;}; +sampler CRTHD_S7{Texture=CRTHD_T7;AddressU=BORDER;AddressV=BORDER;AddressW=BORDER;MagFilter=LINEAR;MinFilter=LINEAR;MipFilter=LINEAR;}; + +texture CRTHD_T8{Width=800.00000000;Height=600.00000000 ;Format=RGBA16F;}; +sampler CRTHD_S8{Texture=CRTHD_T8;AddressU=BORDER;AddressV=BORDER;AddressW=BORDER;MagFilter=LINEAR;MinFilter=LINEAR;MipFilter=LINEAR;}; + +texture CRTHD_T9{Width=BUFFER_WIDTH;Height=BUFFER_HEIGHT;Format=RGBA16F;}; +sampler CRTHD_S9{Texture=CRTHD_T9;AddressU=BORDER;AddressV=BORDER;AddressW=BORDER;MagFilter=LINEAR;MinFilter=LINEAR;MipFilter=LINEAR;}; + +texture CRTHD_01{Width=1024;Height=32;}; +sampler CRTHD_L1{Texture=CRTHD_01;}; + +texture CRTHD_02{Width=1024;Height=32;}; +sampler CRTHD_L2{Texture=CRTHD_02;}; + +texture CRTHD_03{Width=1024;Height=32;}; +sampler CRTHD_L3{Texture=CRTHD_03;}; + +texture CRTHD_04{Width=1024;Height=32;}; +sampler CRTHD_L4{Texture=CRTHD_04;}; + +uniform int framecount; + +float3 fix_lut(float3 lut,float3 ref) +{ + float r=length(ref); + float l=length(lut); + float m=max(max(ref.r,ref.g),ref.b); + ref=normalize(lut+0.0000001)*lerp(r,l,pow(m,1.25)); + return lerp(lut,ref,LUTBR); +} + +float vignette(float2 pos) +{ + float2 b=vigdef*float2(1.0,OrgSize.x/OrgSize.y)*0.125; + pos=clamp(pos,0.0,1.0); + pos=abs(2.0*(pos-0.5)); + float2 res=lerp(0.0.xx,1.0.xx,smoothstep(1.0.xx,1.0.xx-b,sqrt(pos))); + res=pow(res,0.70.xx); + return max(lerp(1.0,sqrt(res.x*res.y),vigstr),0.0); +} + +float contrast(float x) +{ + return max(lerp(x,smoothstep(0.0,1.0,x),contr),0.0); +} + +float3 plant(float3 tar,float r) +{ + float t=max(max(tar.r,tar.g),tar.b)+0.00001; + return tar*r/t; +} + +float crthd_h(float x) +{ + return exp(-x*x*invsigmah); +} + +float crthd_v(float x) +{ + return exp(-x*x*invsigmav); +} + +float gauss_h(float x) +{ + return exp(-x*x*inv_sqr_h); +} + +float gauss_v(float x) +{ + return exp(-x*x*inv_sqr_v); +} + +float bloom_h(float x) +{ + return exp(-x*x*inv_sqr_x); +} + +float bloom_v(float x) +{ + return exp(-x*x*inv_sqr_y); +} + +float mod(float x,float y) +{ + return x-y* floor(x/y); +} + +float st0(float x) +{ + return exp2(-10.0*x*x); +} + +float st1(float x) +{ + return exp2(- 8.0*x*x); +} + +float3 sw0(float x,float color,float scanline,float3 c) +{ + float3 xe=lerp(1.0.xxx+scans,1.0.xxx,c); + float tmp=lerp(beam_min,beam_max,color); + float ex=x*tmp; + ex=(gsl>-0.5)?ex*ex:lerp(ex*ex,ex*ex*ex,0.4); + return exp2(-scanline*ex*xe); +} + +float3 sw1(float x,float color,float scanline,float3 c) +{ + float3 xe=lerp(1.0.xxx+scans,1.0.xxx,c); + x=lerp(x,beam_min*x,max(x-0.4*color,0.0)); + float tmp=lerp(1.2*beam_min,beam_max,color); + float ex=x*tmp; + return exp2(-scanline*ex*ex*xe); +} + +float3 sw2(float x,float color,float scanline,float3 c) +{ + float3 xe=lerp(1.0.xxx+scans,1.0.xxx,c); + float tmp=lerp((2.5-0.5*color)*beam_min,beam_max,color); + tmp=lerp(beam_max,tmp,pow(x,color+0.3)); + float ex=x*tmp; + return exp2(-scanline*ex*ex*xe); +} + +float2 overscan(float2 pos,float dx,float dy) +{ + pos=pos*2.0-1.0; + pos*=float2(dx,dy); + return pos*0.5+0.5; +} + +float2 warp(float2 pos) +{ + pos=pos*2.0-1.0; + pos=lerp(pos,float2(pos.x*rsqrt(1.0-c_shape*pos.y*pos.y),pos.y*rsqrt(1.0-c_shape*pos.x*pos.x)),float2(warpx,warpy)/c_shape); + return pos*0.5+0.5; +} + +float3 gc(float3 c) +{ + float mc=max(max(c.r,c.g),c.b); + float mg=pow(mc,1.0/gamma_c); + return c*mg/(mc+eps); +} + +float3 v_resample(float2 tex0,float4 size) +{ + float f= frac(size.y*tex0.y); + f=0.5-f; + float2 tex=tex0; + tex.y=floor(size.y*tex.y)*size.w+0.5*size.w; + float3 color=0.0.xxx; + float2 dy=float2(0.0,size.w); + float w=0.0; + float wsum=0.0; + float3 pixel; + float vsharpness=max(VSHARPNESS *internal_res,0.6); + float3 cmax=0.0.xxx; + float3 cmin=1.0.xxx; + float sharp= crthd_v(vsharpness)*S_SHARPV; + float maxsharp=MAXS; + float FPR=vsharpness; + float fpx=0.0; + float LOOPSIZE=ceil(2.0*FPR); + float CLPSIZE=round(2.0*LOOPSIZE/3.0); + float n=-LOOPSIZE; + do + { + pixel=COMPAT_TEXTURE(CRTHD_S4,tex+n*dy).rgb; + w=crthd_v(n+f)-sharp; + fpx=abs(n+f-sign(n)*FPR)/FPR; + if(abs(n)<=CLPSIZE){cmax=max(cmax,pixel); cmin=min(cmin,pixel);} + if(w<0.0)w=clamp(w,lerp(-maxsharp,0.0,pow(clamp(fpx,0.0,1.0),VSHARP)),0.0); + color=color+w*pixel; + wsum=wsum+w; + n=n+1.0; + }while(n<=LOOPSIZE); + color=color/wsum; + color=clamp(lerp(clamp(color,cmin,cmax),color,VARNG),0.0,1.0); + return color; +} + +float3 crt_mask(float2 pos,float mx,float mb) +{ + float3 mask=mask_drk; + float3 one=1.0; + if(shadow_msk== 1.0) + { + float mc=1.0-max(maskstr,0.0); + pos.x=frac(pos.x*0.5); + if(pos.x<0.49) + { + mask.r=1.0;mask.g= mc;mask.b=1.0; + }else + { + mask.r= mc;mask.g=1.0;mask.b= mc; + } + }else + if(shadow_msk== 2.0) + { + float lane=mask_lgt; + float odd=0.0; + if(frac(pos.x/6.0)<0.49)odd=1.0; + if(frac((pos.y+odd)/2.0)<0.49)lane=mask_drk; + pos.x=floor(mod(pos.x,3.0)); + if(pos.x<0.5)mask.r=mask_lgt;else + if(pos.x<1.5)mask.g=mask_lgt;else + mask.b= mask_lgt; + mask*=lane; + }else + if(shadow_msk== 3.0) + { + pos.x=floor(mod(pos.x,3.0)); + if(pos.x<0.5)mask.r=mask_lgt;else + if(pos.x<1.5)mask.g=mask_lgt;else + mask.b= mask_lgt; + }else + if(shadow_msk== 4.0) + { + pos.x+=pos.y*3.0; + pos.x=frac(pos.x/6.0); + if(pos.x<0.3)mask.r=mask_lgt;else + if(pos.x<0.6)mask.g=mask_lgt;else + mask.b= mask_lgt; + }else + if(shadow_msk== 5.0) + { + pos.xy=floor(pos.xy*float2(1.0,0.5)); + pos.x+=pos.y*3.0; + pos.x=frac(pos.x/6.0); + if(pos.x<0.3)mask.r=mask_lgt;else + if(pos.x<0.6)mask.g=mask_lgt;else + mask.b= mask_lgt; + }else + if(shadow_msk== 6.0) + { + mask=0.0; + pos.x=frac(pos.x/2.0); + if(pos.x<0.49) + { + mask.r=1.0; + mask.b=1.0; + }else + mask.g=1.0; + mask=clamp(lerp(lerp(one,mask,mcut),lerp(one,mask,maskstr),mx),0.0,1.0); + }else + if(shadow_msk== 7.0) + { + mask=0.0; + pos.x=floor(mod(pos.x,3.0)); + if(pos.x<0.5)mask.r=1.0;else + if(pos.x<1.5)mask.g=1.0;else + mask.b=1.0; + mask=clamp(lerp(lerp(one,mask,mcut),lerp(one,mask,maskstr),mx),0.0,1.0); + }else + if(shadow_msk== 8.0) + { + mask=0.0; + pos.x=frac(pos.x/2.0); + if(pos.x<0.49) + { + mask=0.0.xxx; + }else + mask=1.0.xxx; + mask=clamp(lerp(lerp(one,mask,mcut),lerp(one,mask,maskstr),mx),0.0,1.0); + }else + if(shadow_msk== 9.0) + { + mask=0.0; + pos.x=frac(pos.x/3.0); + if(pos.x<0.3)mask=0.0.xxx;else + if(pos.x<0.6)mask=1.0.xxx;else + mask=1.0.xxx; + mask=clamp(lerp(lerp(one,mask,mcut),lerp(one,mask,maskstr),mx),0.0,1.0); + }else + if(shadow_msk==10.0) + { + mask=0.0; + pos.x=frac(pos.x/3.0); + if(pos.x<0.3)mask =0.0.xxx;else + if(pos.x<0.6)mask.rb=1.0.xx ;else + mask.g=1.0; + mask=clamp(lerp(lerp(one,mask,mcut),lerp(one,mask,maskstr),mx),0.0,1.0); + }else + if(shadow_msk==11.0) + { + mask=0.0; + pos.x=frac(pos.x*0.25); + if(pos.x<0.2)mask =0.0.xxx;else + if(pos.x<0.4)mask.r=1.0 ;else + if(pos.x<0.7)mask.g=1.0 ;else + mask.b=1.0; + mask=clamp(lerp(lerp(one,mask,mcut),lerp(one,mask,maskstr),mx),0.0,1.0); + }else + if(shadow_msk==12.0) + { + mask=0.0; + pos.x=frac(pos.x*0.25); + if(pos.x<0.2)mask.r =1.0 ;else + if(pos.x<0.4)mask.rg=1.0.xx;else + if(pos.x<0.7)mask.gb=1.0.xx;else + mask.b=1.0;mask=clamp(lerp(lerp(one,mask,mcut),lerp(one,mask,maskstr),mx),0.0,1.0); + }else + if(shadow_msk==13.0) + { + mask=0.0; + pos.x=floor(mod(pos.x,7.0)); + if(pos.x<0.5)mask =0.0.xxx;else + if(pos.x<2.5)mask.r=1.0 ;else + if(pos.x<4.5)mask.g=1.0 ;else + mask.b=1.0; + mask=clamp(lerp(lerp(one,mask,mcut),lerp(one,mask,maskstr),mx),0.0,1.0); + }else + { + mask=0.0; + pos.x=floor(mod(pos.x,6.0)); + if(pos.x<0.5)mask =0.0.xxx;else + if(pos.x<1.5)mask.r =1.0 ;else + if(pos.x<2.5)mask.rg =1.0.xx ;else + if(pos.x<3.5)mask.rgb=1.0.xxx;else + if(pos.x<4.5)mask.gb =1.0.xx ;else + mask.b=1.0; + mask=clamp(lerp(lerp(one,mask,mcut),lerp(one,mask,maskstr),mx),0.0,1.0); + } + if(mask_layout>0.5)mask=mask.rbg; + float maskmin=min(min(mask.r,mask.g),mask.b); + return (mask-maskmin)*(1.0+(maskboost-1.0)*mb)+maskmin; +} + +float slt_mask(float2 pos,float m,float swidth) +{ + if ((slotmask1+slotmask2)==0.0)return 1.0;else + { + pos.y=floor(pos.y/slotms); + float mlen=swidth*2.0; + float px=floor( mod(pos.x, 0.99999*mlen)); + float py=floor(frac(pos.y/(2.0*double_slot))*2.0*double_slot); + float slot_dark=lerp(1.0-slotmask2,1.0-slotmask1,m); + float slot=1.0; + if(py==0.0&&px=swidth) slot=slot_dark; + return slot; + } +} + +float humbars(float pos) +{ + if (barintensity==0.0)return 1.0;else + { + pos=(barintensity>=0.0)?pos:(1.0-pos); + pos=frac(pos+ mod(float(framecount),barspeed)/(barspeed-1.0)); + pos=(barintensity< 0.0)?pos:(1.0-pos); + return (1.0-barintensity)+barintensity*pos; + } +} + +float corner(float2 pos) +{ + float2 bc= bsize*float2(1.0,OptSize.x/OptSize.y)*0.05; + pos=clamp(pos,0.0,1.0); + pos=abs(2.0*(pos-0.5)); + float csz=lerp(400.0,7.0,pow(4.0*csize,0.10)); + float crn=dot(pow(pos,csz.xx*float2(1.0,OptSize.y/OptSize.x)),1.0.xx); + crn=(csize==0.0)? max(pos.x,pos.y) : pow(crn,1.0/csz); + pos=max(pos,crn); + float2 rs=(bsize==0.0)? 1.0.xx : lerp(0.0.xx,1.0.xx,smoothstep(1.0.xx,1.0.xx-bc,sqrt(pos))); + rs=pow(rs, sborder.xx); + return sqrt(rs.x*rs.y); +} + +float3 declip(float3 c,float b) +{ + float m=max(max(c.r,c.g),c.b); + if(m>b)c=c*b/m; + return c; +} + +float igc(float mc) +{ + return pow(mc,gamma_c); +} + +float3 noise(float3 v) +{ + if(addnoised<0.0)v.z=-addnoised; else v.z= mod(v.z,6001.0)/1753.0; + v =frac(v)+frac(v*1e4)+frac(v*1e-4); + v+=float3(0.12345,0.6789,0.314159); + v =frac(v*dot(v,v)*123.456); + v =frac(v*dot(v,v)*123.456); + v =frac(v*dot(v,v)*123.456); + v =frac(v*dot(v,v)*123.456); + return v; +} + +void bring_pixel(inout float3 c,inout float3 b,inout float3 g,float2 coord,float2 boord) +{ + float stepx=OptSize.z; + float stepy=OptSize.w; + float2 dx=float2(stepx,0.0); + float2 dy=float2(0.0,stepy); + float posx= 2.0*coord.x-1.0; + float posy= 2.0*coord.y-1.0; + if(dctypex>0.025) + { + posx= sign(posx)*pow(abs(posx),1.05-dctypex); + dx=posx*dx; + } + if(dctypey>0.025) + { + posy= sign(posy)*pow(abs(posy),1.05-dctypey); + dy=posy*dy; + } + float2 rc=deconrx*dx+deconry*dy; + float2 gc=decongx*dx+decongy*dy; + float2 bc=deconbx*dx+deconby*dy; + float r1=COMPAT_TEXTURE(CRTHD_S9,coord+rc).r; + float g1=COMPAT_TEXTURE(CRTHD_S9,coord+gc).g; + float b1=COMPAT_TEXTURE(CRTHD_S9,coord+bc).b; + float ds=decons; + float3 d=float3(r1,g1,b1); + c=clamp(lerp(c,d,ds),0.0,1.0); + r1=COMPAT_TEXTURE(CRTHD_S8,boord+rc).r; + g1=COMPAT_TEXTURE(CRTHD_S8,boord+gc).g; + b1=COMPAT_TEXTURE(CRTHD_S8,boord+bc).b; + d=float3(r1,g1,b1); + b=g=lerp(b,d,min(ds,1.0)); + r1=COMPAT_TEXTURE(CRTHD_S6,boord+rc).r; + g1=COMPAT_TEXTURE(CRTHD_S6,boord+gc).g; + b1=COMPAT_TEXTURE(CRTHD_S6,boord+bc).b; + d=float3(r1,g1,b1); + g=lerp(g,d,min(ds,1.0)); +} + +float4 AfterglowPS(float4 position:SV_Position,float2 texcoord:TEXCOORD):SV_Target +{ + float2 dx=float2(OrgSize.z,0.0); + float2 dy=float2(0.0,OrgSize.w); + float w=1.0; + float3 color0=COMPAT_TEXTURE(CRTHD_S0,texcoord.xy ).rgb; + float3 color1=COMPAT_TEXTURE(CRTHD_S0,texcoord.xy-dx).rgb; + float3 color2=COMPAT_TEXTURE(CRTHD_S0,texcoord.xy+dx).rgb; + float3 color3=COMPAT_TEXTURE(CRTHD_S0,texcoord.xy-dy).rgb; + float3 color4=COMPAT_TEXTURE(CRTHD_S0,texcoord.xy+dy).rgb; + float3 clr=(2.5*color0+color1+color2+color3+color4)/6.5; + float3 a=COMPAT_TEXTURE(CRTHD_S1,texcoord.xy).rgb; + if((color0.r+color0.g+color0.b<5.0/255.0)){w=0.0;} + float3 result=lerp(max(lerp(clr,a,0.49+float3(PR,PG,PB))-1.25/255.0,0.0),clr,w); + return float4(result,w); +} + +float4 PreShaderPS(float4 position:SV_Position,float2 texcoord:TEXCOORD):SV_Target +{ + const float3x3 File0=float3x3(0.412391, 0.212639,0.019331, 0.357584,0.715169, 0.119195, 0.180481,0.072192,0.950532); + const float3x3 File1=float3x3(0.430554, 0.222004,0.020182, 0.341550,0.706655, 0.129553, 0.178352,0.071341,0.939322); + const float3x3 File2=float3x3(0.396686, 0.210299,0.006131, 0.372504,0.713766, 0.115356, 0.181266,0.075936,0.967571); + const float3x3 File3=float3x3(0.393521, 0.212376,0.018739, 0.365258,0.701060, 0.111934, 0.191677,0.086564,0.958385); + const float3x3 File4=float3x3(0.392258, 0.209410,0.016061, 0.351135,0.725680, 0.093636, 0.166603,0.064910,0.850324); + const float3x3 File5=float3x3(0.377923, 0.195679,0.010514, 0.317366,0.722319, 0.097826, 0.207738,0.082002,1.076960); + const float3x3 ToRGB=float3x3(3.240970,-0.969244,0.055630,-1.537383,1.875968,-0.203977,-0.498611,0.041555,1.056972); + const float3x3 ToMDN=float3x3(2.791723,-0.894766,0.041678,-1.173165,1.815586,-0.130886,-0.440973,0.032000,1.002034); + const float3x3 ToDCI=float3x3(2.493497,-0.829489,0.035846,-0.931384,1.762664,-0.076172,-0.402711,0.023625,0.956885); + const float3x3 ToADB=float3x3(2.041588,-0.969244,0.013444,-0.565007,1.875968,-0.118360,-0.344731,0.041555,1.015175); + const float3x3 ToREC=float3x3(1.716651,-0.666684,0.017640,-0.355671,1.616481,-0.042771,-0.253366,0.015769,0.942103); + const float3x3 D65_to_D55=float3x3(0.4850339153,0.2500956126,0.0227359648,0.3488957224,0.6977914447,0.1162985741,0.1302823568,0.0521129427,0.6861537456); + const float3x3 D65_to_D93=float3x3(0.3412754080,0.1759701322,0.0159972847,0.3646170520,0.7292341040,0.1215390173,0.2369894093,0.0947957637,1.2481442225); + float4 imgColor=COMPAT_TEXTURE(CRTHD_S0,texcoord.xy); + float4 aftrglow=COMPAT_TEXTURE(CRTHD_S1,texcoord.xy); + float w=1.0-aftrglow.w; + float l=length(aftrglow.rgb); + aftrglow.rgb=AS*w*normalize(pow(aftrglow.rgb+0.01,sat))*l; + float bp=w*BP/255.0; + if(sega_fix>0.5)imgColor.rgb=imgColor.rgb*(255.0/239.0); + imgColor.rgb=min(imgColor.rgb,1.0); + float3 color=imgColor.rgb; + if(int(TNTC)==0) + { + color.rgb=imgColor.rgb; + }else + { + float lutlow=LUTLOW/255.0;float invLS=1.0/32.0; + float3 lut_ref=imgColor.rgb+lutlow*(1.0-pow(imgColor.rgb,0.333.xxx)); + float lutb=lut_ref.b*(1.0-0.5*invLS); + lut_ref.rg=lut_ref.rg*(1.0-invLS)+0.5*invLS; + float tile1=ceil(lutb*(32.0-1.0)); + float tile0=max(tile1-1.0,0.0); + float f=frac(lutb*(32.0-1.0));if(f==0.0)f=1.0; + float2 coord0=float2(tile0+lut_ref.r,lut_ref.g)*float2(invLS,1.0); + float2 coord1=float2(tile1+lut_ref.r,lut_ref.g)*float2(invLS,1.0); + float4 color1,color2,res; + if(int(TNTC)==1) + { + color1=COMPAT_TEXTURE(CRTHD_L1,coord0); + color2=COMPAT_TEXTURE(CRTHD_L1,coord1); + res=lerp(color1,color2,f); + }else + if(int(TNTC)==2) + { + color1=COMPAT_TEXTURE(CRTHD_L2,coord0); + color2=COMPAT_TEXTURE(CRTHD_L2,coord1); + res=lerp(color1,color2,f); + }else + if(int(TNTC)==3) + { + color1=COMPAT_TEXTURE(CRTHD_L3,coord0); + color2=COMPAT_TEXTURE(CRTHD_L3,coord1); + res=lerp(color1,color2,f); + }else + if(int(TNTC)==4) + { + color1=COMPAT_TEXTURE(CRTHD_L4,coord0); + color2=COMPAT_TEXTURE(CRTHD_L4,coord1); + res=lerp(color1,color2,f); + } + res.rgb=fix_lut(res.rgb,imgColor.rgb); + color=lerp(imgColor.rgb,res.rgb,min(TNTC,1.0)); + } + float3 c=clamp(color,0.0,1.0); + float3x3 m_o; + float p; + if(CS==0.0){p=2.2;m_o=ToRGB;}else + if(CS==1.0){p=2.2;m_o=ToMDN;}else + if(CS==2.0){p=2.6;m_o=ToDCI;}else + if(CS==3.0){p=2.2;m_o=ToADB;}else + if(CS==4.0){p=2.4;m_o=ToREC;} + color=pow(c,p); + float3x3 m_i; + if(CP==0.0){m_i=File0;}else + if(CP==1.0){m_i=File1;}else + if(CP==2.0){m_i=File2;}else + if(CP==3.0){m_i=File3;}else + if(CP==4.0){m_i=File4;}else + if(CP==5.0){m_i=File5;} + color=mul(color,m_i); + color=mul(color,m_o); + color=clamp(color,0.0,1.0); + color=pow(color,1.0/p); + if(CP==-1.0)color=c; + float3 scolor1=plant(pow(color,wp_saturation),max(max(color.r,color.g),color.b)); + float luma=dot(color,float3(0.299,0.587,0.114)); + float3 scolor2=lerp(luma,color,wp_saturation); + color=(wp_saturation>1.0)?scolor1:scolor2; + color=plant(color,contrast(max(max(color.r,color.g),color.b))); + p=2.2; + color=clamp(color,0.0,1.0); + color=pow(color,p); + float3 warmer=mul(color,D65_to_D55); + warmer=mul(warmer,ToRGB); + float3 cooler=mul(color,D65_to_D93); + cooler=mul(cooler,ToRGB); + float m=abs(WP)/100.0; + float3 comp=(WP<0.0)?cooler:warmer; + color=lerp(color,comp,m); + color=pow(max(color,0.0),1.0/p); + if(BP>-0.5)color=color+aftrglow.rgb+bp;else + { + color=max(color+BP/255.0,0.0)/(1.0+BP/255.0*step(-BP/255.0,max(max(color.r,color.g),color.b)))+aftrglow.rgb; + } + color=min(color*pre_bb,1.0); + return float4(color,vignette(texcoord.xy)); +} + +float4 LinearizePS(float4 position:SV_Position,float2 texcoord:TEXCOORD):SV_Target +{ + float3 c1=COMPAT_TEXTURE(CRTHD_S2,fuxcoord).rgb; + float3 c2=COMPAT_TEXTURE(CRTHD_S2,fuxcoord+float2(0.0,OrgSize.w)).rgb; + float3 c=c1; + float intera=1.0; + float gamma_in=clamp(gamma_i,1.0,5.0); + float m1=max(max(c1.r,c1.g),c1.b); + float m2=max(max(c2.r,c2.g),c2.b); + float3 df=abs(c1-c2); + float d=max(max(df.r,df.g),df.b); + if(interm==2.0)d=lerp(0.1*d,10.0*d,step(m1/(m2+0.0001),m2/(m1+0.0001))); + float r=m1; + float yres_div=1.0;if(intres>1.25)yres_div=intres; + bool hscans =(hiscan>0.5); + if(interr<=OrgSize.y/yres_div&&interm>0.5&&intres!=1.0&&intres!=0.5&&vga_mode<0.5||hscans) + { + intera=0.25; + float liine_no=clamp(floor( mod(OrgSize.y*fuxcoord.y,2.0)),0.0,1.0); + float frame_no=clamp(floor( mod(float(framecount),2.0)),0.0,1.0); + float ii=abs(liine_no-frame_no); + if(interm< 3.5) + { + c2=plant(lerp(c2,c2*c2,iscans),max(max(c2.r,c2.g),c2.b)); + r=clamp(max(m1*ii,(1.0-iscanb)*min(m1,m2)),0.0,1.0); + c=plant(lerp(lerp(c1,c2,min(lerp(m1,1.0-m2,min(m1,1.0-m1))/(d+0.00001),1.0)),c1,ii),r); + if(interm==3.0)c=(1.0-0.5*iscanb)*lerp(c2,c1,ii); + } + if(interm==4.0){c=plant(lerp(c,c*c,0.5*iscans),max(max(c.r,c.g),c.b))*(1.0-0.5*iscanb); + } + if(hscans)c=c1; + } + if(vga_mode>0.5) + { + c=c1; if(interr<=OrgSize.y)intera=0.75;else intera=0.5; + } + c=pow(c,gamma_in); + if(fuxcoord.x>0.5)gamma_in=intera;else gamma_in=1.0/gamma_in; + return float4(c,gamma_in); +} + +float4 HGaussianPS(float4 position:SV_Position,float2 texcoord:TEXCOORD):SV_Target +{ + float4 GaussSize=float4(OrgSize.x,OrgSize.y,OrgSize.z,OrgSize.w)*lerp(1.0.xxxx,float4(FINE_GAUSS,FINE_GAUSS,1.0/FINE_GAUSS,1.0/FINE_GAUSS),min(FINE_GAUSS-1.0,1.0)); + float f=frac(GaussSize.x*texcoord.x); + f=0.5-f; + float2 tex=floor(GaussSize.xy*texcoord)*GaussSize.zw+0.5*GaussSize.zw; + float3 color=0.0; + float2 dx=float2(GaussSize.z ,0.0); + float3 pixel; + float w; + float wsum=0.0; + float n=-SIZEH; + do + { + pixel=COMPAT_TEXTURE(CRTHD_S3,tex+n*dx).rgb; + if(m_glow>0.5) + { + pixel=max(pixel-m_glow_cutoff,0.0); + pixel=plant(pixel,max(max(max(pixel.r,pixel.g),pixel.b)-m_glow_cutoff,0.0)); + } + w=gauss_h(n+f); + color=color+w*pixel; + wsum=wsum+w; + n=n+1.0; + }while(n<=SIZEH); + color=color/wsum; + return float4(color,1.0); +} + +float4 VGaussianPS(float4 position:SV_Position,float2 texcoord:TEXCOORD):SV_Target +{ + float4 GaussSize=float4(SrcSize.x,OrgSize.y,SrcSize.z,OrgSize.w)*lerp(1.0.xxxx,float4(FINE_GAUSS,FINE_GAUSS,1.0/FINE_GAUSS,1.0/FINE_GAUSS),min(FINE_GAUSS-1.0,1.0)); + float f=frac(GaussSize.y*texcoord.y); + f=0.5-f; + float2 tex=floor(GaussSize.xy*texcoord)*GaussSize.zw+0.5*GaussSize.zw; + float3 color=0.0; + float2 dy=float2(0.0,GaussSize.w ); + float3 pixel; + float w; + float wsum=0.0; + float n=-SIZEV; + do + { + pixel=COMPAT_TEXTURE(CRTHD_S5,tex+n*dy).rgb; + w=gauss_v(n+f); + color=color+w*pixel; + wsum=wsum+w; + n=n+1.0; + }while(n<=SIZEV); + color=color/wsum; + return float4(color,1.0); +} + +float4 BloomHorzPS(float4 position:SV_Position,float2 texcoord:TEXCOORD):SV_Target +{ + float4 BloomSize=float4(OrgSize.x,OrgSize.y,OrgSize.z,OrgSize.w)*lerp(1.0.xxxx,float4(FINE_BLOOM,FINE_BLOOM,1.0/FINE_BLOOM,1.0/FINE_BLOOM),min(FINE_BLOOM-1.0,1.0)); + float f=frac(BloomSize.x*texcoord.x); + f=0.5-f; + float2 tex=floor(BloomSize.xy*texcoord)*BloomSize.zw+0.5*BloomSize.zw; + float4 color=0.0; + float2 dx=float2(BloomSize.z ,0.0); + float4 pixel; + float w; + float wsum=0.0; + float n=-SIZEX; + do + { + pixel=COMPAT_TEXTURE(CRTHD_S3,tex+n*dx); + w=bloom_h(n+f); + pixel.a =max(max(pixel.r,pixel.g),pixel.b); + pixel.a*=pixel.a*pixel.a; + color=color+w*pixel; + wsum=wsum+w; + n=n+1.0; + }while(n<=SIZEX); + color=color/wsum; + return float4(color.rgb,pow(color.a,0.333333)); +} + +float4 BloomVertPS(float4 position:SV_Position,float2 texcoord:TEXCOORD):SV_Target +{ + float4 BloomSize=float4(SrcSize.x,OrgSize.y,SrcSize.z,OrgSize.w)*lerp(1.0.xxxx,float4(FINE_BLOOM,FINE_BLOOM,1.0/FINE_BLOOM,1.0/FINE_BLOOM),min(FINE_BLOOM-1.0,1.0)); + float f=frac(BloomSize.y*texcoord.y); + f=0.5-f; + float2 tex=floor(BloomSize.xy*texcoord)*BloomSize.zw+0.5*BloomSize.zw; + float4 color=0.0; + float2 dy=float2(0.0,BloomSize.w ); + float4 pixel; + float w; + float wsum=0.0; + float n=-SIZEY; + do + { + pixel=COMPAT_TEXTURE(CRTHD_S7,tex+n*dy); + w=bloom_v(n+f); + pixel.a*=pixel.a*pixel.a; + color=color+w*pixel; + wsum=wsum+w; + n=n+1.0; + }while(n<=SIZEY); + color=color/wsum; + return float4(color.rgb,pow(color.a,0.175000)); +} + +float4 HD_Pass1_PS(float4 position:SV_Position,float2 texcoord:TEXCOORD):SV_Target +{ + float2 prescalex=float2(tex2Dsize(CRTHD_S3,0))/OrgSize.xy; + float4 PALSize=OrgSize*float4(prescalex.x,prescalex.y,1.0/prescalex.x,1.0/prescalex.y); + float f=frac(PALSize.x*fuxcoord.x); + f=0.5-f; + float2 tex=floor(PALSize.xy*fuxcoord)*PALSize.zw+0.5*PALSize.zw; + float3 color=0.0.xxx; + float scolor=0.0; + float2 dx=float2(PALSize.z ,0.0); + float3 pixel; + float w=0.0; + float swsum=0.0; + float wsum=0.0; + float hsharpness=HSHARPNESS*internal_res; + float3 cmax=0.0.xxx; + float3 cmin=1.0.xxx; + float sharp=crthd_h(hsharpness)*S_SHARPH; + float maxsharp=MAXS; + float FPR=hsharpness; + float fpx=0.0; + float sp=0.0; + float sw=0.0; + float ts=0.025; + float3 luma=float3(0.2126,0.7152,0.0722); + float LOOPSIZE=ceil(2.0*FPR); + float CLPSIZE=round(2.0*LOOPSIZE/3.0); + float n=-LOOPSIZE; + do + { + pixel=COMPAT_TEXTURE(CRTHD_S3,tex+n*dx).rgb; + sp=max(max(pixel.r,pixel.g),pixel.b); + w=crthd_h(n+f)-sharp; + fpx=abs(n+f-sign(n)*FPR)/FPR; + if(abs(n)<=CLPSIZE){cmax=max(cmax,pixel); cmin=min(cmin,pixel);} + if(w<0.0)w=clamp(w,lerp(-maxsharp,0.0,pow(clamp(fpx,0.0,1.0),HSHARP)),0.0); + color=color+w*pixel; + wsum=wsum+w; + sw=max(w,0.0)*(dot(pixel,luma)+ts); + scolor=scolor+sw*sp; + swsum=swsum+sw; + n=n+1.0; + }while(n<=LOOPSIZE); + color =color/wsum; + scolor=scolor/swsum; + color =clamp(lerp(clamp(color,cmin,cmax),color,HARNG),0.0,1.0); + scolor=clamp(lerp(max(max(color.r,color.g),color.b),scolor,spike),0.0,1.0); + return float4(color,scolor); +} + +float4 HD_Pass2_PS(float4 position:SV_Position,float2 texcoord:TEXCOORD):SV_Target +{ + float2 prescalex=float2(tex2Dsize(CRTHD_S3,0))/OrgSize.xy; + float4 PALSize=float4(OrgSize.x,OrgSize.y,OrgSize.z,OrgSize.w); + float gamma_in=1.0/COMPAT_TEXTURE(CRTHD_S3,0.25).a; + float intera=COMPAT_TEXTURE(CRTHD_S3,float2(0.75,0.25)).a; + bool hscans=(hiscan>0.5); + bool interb=(((intera<0.35)||(no_scanlines>0.025))&&!hscans); + bool vgascan=((abs(intera-0.5)<0.05)&&(no_scanlines==0.0)); + float SourceY=PALSize.y; + float sy=1.0; + if( intres==1.0)sy=max(floor(SourceY/199.0),1.0); + if( intres>0.25&&intres!=1.0)sy=intres; + if(vgascan)sy=0.5; else if(abs(intera-0.75)<0.05)sy=1.0; + PALSize*=float4(1.0,1.0/sy,1.0,sy); + float2 lexcoord = fuxcoord.xy; + if(IOS> 0.0&&!interb) + { + float2 ofactor= OptSize.xy/OrgSize.xy; + float2 intfactor=(IOS<2.5)?floor(ofactor):ceil(ofactor); + float2 diff=ofactor/intfactor; + float scan=diff.y; + lexcoord=overscan(lexcoord,scan,scan); + if(IOS==1.0||IOS==3.0)lexcoord=float2(fuxcoord.x,lexcoord.y); + } + lexcoord=overscan(lexcoord,(OrgSize.x-overscanx)/OrgSize.x,(OrgSize.y-overscany)/OrgSize.y); + float2 pos=warp(lexcoord); + float coffset=0.5; + float2 ps=PALSize.zw; + float OGL2Pos=pos.y*PALSize.y-coffset; + float f=frac(OGL2Pos); + float2 dx=float2(ps.x,0.0); + float2 dy=float2(0.0,ps.y); + float2 pC4; + pC4.y=floor(OGL2Pos)*ps.y+0.5*ps.y; + pC4.x=pos.x; + if((intres==0.5&&prescalex.y<1.5)||vgascan)pC4.y=floor(pC4.y*OrgSize.y)*OrgSize.w+0.5*OrgSize.w; + if( interb&&no_scanlines>0.025)pC4.y=pC4.y+smoothstep(0.40-0.5*no_scanlines,0.60+0.5*no_scanlines,f)*PALSize.w; + float3 color1=COMPAT_TEXTURE(CRTHD_S4,pC4).rgb; + float3 scolor1=COMPAT_TEXTURE(CRTHD_S4,pC4).aaa; + float prescaley=float(tex2Dsize(CRTHD_S3,0).y)/OrgSize.y; + if( interb&&no_scanlines<0.05||hscans&&vgascan||hscans)color1=v_resample(pos,PALSize*float4(1.0,prescaley,1.0,1.0/prescaley)); + color1=pow(color1,scangamma/gamma_in); + pC4+=dy; + if((intres==0.5&&prescalex.y<1.5)||vgascan)pC4.y=floor((pos.y+0.33*dy.y)*OrgSize.y)*OrgSize.w+0.5*OrgSize.w; + float3 color2=COMPAT_TEXTURE(CRTHD_S4,pC4).rgb; + float3 scolor2=COMPAT_TEXTURE(CRTHD_S4,pC4).aaa; + color2=pow(color2,scangamma/gamma_in); + float3 ctmp=color1;float w3=1.0;float3 color=color1; + float3 one=1.0; + if( hscans){color2=color1;scolor2=scolor1;} + if(!interb||hscans) + { + float3 luma=float3(0.2126,0.7152,0.0722); + float ssub=ssharp*max(abs(scolor1.x-scolor2.x),abs(dot(color1,luma)-dot(color2,luma))); + float shape1=lerp(scanline1,scanline2+ssub*scolor1.x*35.0, f); + float shape2=lerp(scanline1,scanline2+ssub*scolor2.x*35.0,1.0-f); + float wt1=st0( f); + float wt2=st0(1.0- f); + float3 color0= color1*wt1+ color2*wt2; + float3 scolor0=scolor1*wt1+scolor2*wt2; + ctmp=color0/(wt1+wt2); + float3 sctmp=max(scolor0/(wt1+wt2),ctmp); + float3 w1,w2; + float3 cref1=lerp(sctmp,scolor1,beam_size);float creff1=pow(max(max(cref1.r,cref1.g),cref1.b),scan_falloff); + float3 cref2=lerp(sctmp,scolor2,beam_size);float creff2=pow(max(max(cref2.r,cref2.g),cref2.b),scan_falloff); + if(tds>0.5){shape1=lerp(scanline2,shape1,creff1);shape2=lerp(scanline2,shape2,creff2);} + float f1= f; + float f2=1.0- f; + float m1=max(max(color1.r,color1.g),color1.b)+eps; + float m2=max(max(color2.r,color2.g),color2.b)+eps; + cref1=color1/m1; + cref2=color2/m2; + if(gsl< 0.5) + {w1=sw0(f1,creff1,shape1,cref1);w2=sw0(f2,creff2,shape2,cref2);}else + if(gsl==1.0) + {w1=sw1(f1,creff1,shape1,cref1);w2=sw1(f2,creff2,shape2,cref2);}else + {w1=sw2(f1,creff1,shape1,cref1);w2=sw2(f2,creff2,shape2,cref2);} + float3 w3=w1+w2; + float wf1=max(max(w3.r,w3.g),w3.b); + if(wf1> 1.0) {wf1=1.0/wf1; w1*=wf1, w2*=wf1;} + if(abs(clp)>0.005) + { + sy=m1; one=(clp>0.0)?w1:1.0.xxx; + float sat=1.0001-min(min(cref1.r,cref1.g),cref1.b); + color1=lerp(color1,plant(pow(color1,0.70.xxx-0.325*sat),sy),pow(sat,0.3333)*one*abs(clp)); + sy=m2; one=(clp>0.0)?w2:1.0.xxx; + sat=1.0001-min(min(cref2.r,cref2.g),cref2.b); + color2=lerp(color2,plant(pow(color2,0.70.xxx-0.325*sat),sy),pow(sat,0.3333)*one*abs(clp)); + } + color=(gc(color1)*w1+gc(color2)*w2); + color=min(color,1.0); + } + if( interb) + { + color=gc(color1); + } + float colmx=max(max(ctmp.r,ctmp.g),ctmp.b); + color=pow(color,gamma_in/scangamma); + return float4(color,colmx); +} + +float4 ChromaticPS(float4 position:SV_Position,float2 texcoord:TEXCOORD):SV_Target +{ + float gamma_in=1.0/COMPAT_TEXTURE(CRTHD_S3,0.25).a; + float intera=COMPAT_TEXTURE(CRTHD_S3,float2(0.75,0.25)).a; + bool interb=((intera<0.35||no_scanlines>0.025)&&(hiscan<0.5)); + float2 lexcoord = fuxcoord.xy; + if(IOS> 0.0&&!interb) + { + float2 ofactor= OptSize.xy/OrgSize.xy; + float2 intfactor=(IOS<2.5)?floor(ofactor):ceil(ofactor); + float2 diff=ofactor/intfactor; + float scan=diff.y; + lexcoord=overscan(lexcoord,scan,scan); + if(IOS==1.0||IOS==3.0)lexcoord=float2(fuxcoord.x,lexcoord.y); + } + lexcoord=overscan(lexcoord,(OrgSize.x-overscanx)/OrgSize.x,(OrgSize.y-overscany)/OrgSize.y); + float2 pos0=warp(fuxcoord.xy); + float2 pos1=fuxcoord.xy; + float2 pos=warp(lexcoord); + float3 color=COMPAT_TEXTURE(CRTHD_S9,pos1).rgb; + float3 Bloom=COMPAT_TEXTURE(CRTHD_S8,pos).rgb; + float3 Glow=COMPAT_TEXTURE(CRTHD_S6,pos).rgb; + if((abs(deconrx)+abs(deconry)+abs(decongx)+abs(decongy)+abs(deconbx)+abs(deconby))>0.2) + bring_pixel(color,Bloom,Glow,pos1,pos); + float cm=igc(max(max(color.r,color.g),color.b)); + float mx1=COMPAT_TEXTURE(CRTHD_S9,pos1 ).a; + float colmx=max(mx1,cm); + float w3=min((cm+0.0001)/(colmx+0.0005),1.0);if(interb)w3=1.00; + float2 dx=float2(0.001,0.0); + float mx0=COMPAT_TEXTURE(CRTHD_S9,pos1-dx).a; + float mx2=COMPAT_TEXTURE(CRTHD_S9,pos1+dx).a; + float mxg=max(max(mx0,mx1),max(mx2,cm)); + float mx=pow(mxg,1.40/gamma_in); + dx=float2(OrgSize.z,0.0)*0.25; + mx0=COMPAT_TEXTURE(CRTHD_S9,pos1-dx).a; + mx2=COMPAT_TEXTURE(CRTHD_S9,pos1+dx).a; + float mb=(1.0-min(abs(mx0-mx2)/(0.5+mx1),1.0)); + float3 orig1=color; + float3 one=1.0; + float3 cmask=one; + float3 dmask=one; + float3 emask=one; + float mwidths[15]={0.0,2.0,3.0,3.0,6.0,6.0,2.4,3.5,2.4,3.25,3.5,4.5,4.25,7.5,6.25}; + float mwidth=mwidths[int(shadow_msk)]; + float mask_compensate=frac(mwidth); + if(shadow_msk> 0.5) + { + float2 maskcoord=fracoord.xy* 1.00001; + float2 scoord=maskcoord; + mwidth=floor(mwidth)*masksize; + float swidth=mwidth; + bool zoomed=(abs(mask_zoom)>0.75); + float mscale=1.0; + float2 maskcoord0=maskcoord; + maskcoord.y=floor(maskcoord.y/masksize); + float mwidth1=max(mwidth+mask_zoom,2.0); + if( mshift> 0.25) + { + float stagg_lvl=1.0; if(frac(mshift)>0.25)stagg_lvl=2.0; + float next_line=float(floor(mod(maskcoord.y,2.0*stagg_lvl))0.025 )mlerp=clamp((1.0+zoom_mask)*mlerp-0.5*zoom_mask,0.0,1.0); + float mcoord=floor(maskcoord.x/mscale); if(shadow_msk==13.0&&mask_zoom==-2.0)mcoord=ceil(maskcoord.x/mscale); + cmask*=lerp(crt_mask(float2(mcoord,maskcoord.y),mx,mb),crt_mask(float2(mcoord+1.0,maskcoord.y),mx,mb),mlerp); + } + if(slotwidth>0.5)swidth=slotwidth;float smask=1.0; + float sm_offset=0.0;bool bsm_offset=(shadow_msk==1.0||shadow_msk==3.0||shadow_msk==6.0||shadow_msk==7.0||shadow_msk==9.0||shadow_msk==12.0); + if( zoomed) + { + if(mask_layout<0.5&&bsm_offset)sm_offset=1.0;else + if(bsm_offset)sm_offset=-1.0; + } + swidth=round(swidth*mscale); + smask=slt_mask(scoord+float2(sm_offset,0.0),mx,swidth); + smask=clamp(smask+lerp(smask_mit,0.0,min(w3,pow(w3*max(max(orig1.r,orig1.g),orig1.b),0.33333))),0.0,1.0); + emask =cmask; + cmask*=smask; + dmask =cmask; + if(abs(mask_bloom)>0.025) + { + float maxbl=max(max(max(Bloom.r,Bloom.g),Bloom.b),mxg); + maxbl=maxbl*max(lerp(1.0,2.0-colmx,bloom_dist),0.0); + if(mask_bloom>0.025)cmask=max(min(cmask+maxbl*mask_bloom,1.0),cmask);else + cmask=max(lerp(cmask,cmask*(1.0-0.5*maxbl)+plant(pow(Bloom,0.35.xxx),maxbl),-mask_bloom),cmask); + } + color=pow(color,mask_gamma/gamma_in); + color=color*cmask; + color=min(color,1.0); + color=pow(color,gamma_in/mask_gamma); + cmask=min(cmask,1.0); + dmask=min(dmask,1.0); + } + float dark_compensate=lerp(max(clamp(lerp(mcut,maskstr,mx),0.0,1.0)-1.0+mask_compensate,0.0)+1.0,1.0,mx); if(shadow_msk< 0.5) dark_compensate=1.0; + float bb=lerp(brightboost1,brightboost2,mx)* dark_compensate; color*=bb; + float3 Ref=COMPAT_TEXTURE(CRTHD_S3,pos).rgb; + float maxb=COMPAT_TEXTURE(CRTHD_S8,pos).a; + float vig=COMPAT_TEXTURE(CRTHD_S2,clamp(pos,0.0+0.5*OrgSize.zw,1.0 -0.5*OrgSize.zw)).a; + float3 bcmask=lerp(one,cmask,b_mask); + float3 hcmask=lerp(one,cmask,h_mask); + float3 Bloom1=Bloom; + if(abs(bloom)>0.025) + { + if(bloom<-0.01)Bloom1=plant(Bloom,maxb); + Bloom1= min(Bloom1*(orig1+color), max(0.5*(colmx+orig1-color),0.001*Bloom1)); + Bloom1=0.5*(Bloom1+lerp(Bloom1,lerp(colmx*orig1,Bloom1,0.5),1.0-color)); + Bloom1= bcmask*Bloom1*max(lerp(1.0,2.0-colmx,bloom_dist),0.0); + color=pow(pow(color,mask_gamma/gamma_in)+abs(bloom)*pow(Bloom1,mask_gamma/gamma_in),gamma_in/mask_gamma); + } + if(!interb)color=declip(min(color,1.0),lerp(1.0,w3,0.6)); + if(halation> 0.01) + { + Bloom=0.5*(Bloom+Bloom*Bloom); + float mbl=max(max(Bloom.r,Bloom.g),Bloom.b); + float mxh=colmx+colmx*colmx; + Bloom=plant(Bloom,max(1.25*(mbl-0.1375),0.165*mxh*(1.0+w3))); + Bloom=max((2.0*lerp(maxb*maxb,maxb,colmx)-0.5*max(max(Ref.r,Ref.g),Ref.b)),0.25)*Bloom; + Bloom=min((2.5-colmx+0.5*color)*plant(0.375+orig1,lerp(0.5*(1.0+w3),(0.50+w3)/1.5,colmx))*hcmask*Bloom,1.0-color); + color=pow(pow(color,mask_gamma/gamma_in)+halation*pow(Bloom,mask_gamma/gamma_in),gamma_in/mask_gamma); + }else + if(halation<-0.01) + { + float mbl=max(max(Bloom.r,Bloom.g),Bloom.b); + Bloom=plant(Bloom+Ref+orig1+Bloom*Bloom*Bloom,min(mbl*mbl,0.75)); + color=color+2.0*lerp(1.0,w3,0.5*colmx)*hcmask*Bloom*(-halation); + } + float w=0.25+0.60*lerp(w3,1.0,sqrt(colmx)); + if(smoothmask>0.5) + { + color=min(color,1.0); color=max(min(color/w3,1.0)*w3, min(orig1*bb,color*(1.0-w3))); + } + if(m_glow<0.5)Glow=lerp(Glow,0.25*color,colmx);else + { + float3 orig2=plant(orig1+0.001*Ref,1.0); maxb=max(max(Glow.r,Glow.g),Glow.b); + Bloom=plant(Glow,1.0);Ref=abs(orig2-Bloom); + mx0=max(max(orig2.r,orig2.g),orig2.b)-min(min(orig2.r,orig2.g),orig2.b); + mx2=max(max(Bloom.r,Bloom.g),Bloom.b)-min(min(Bloom.r,Bloom.g),Bloom.b); + Bloom=lerp(maxb*min(Bloom,orig2),w*lerp(lerp(Glow,max(max(Ref.r,Ref.g),Ref.b)*Glow,max(mx,mx0)),lerp(color,Glow,mx2),max(mx0,mx2)*Ref),min(sqrt((1.10-mx0)*(0.10+mx2)),1.0)); + if(m_glow>1.5)Glow=lerp(0.5*Glow*Glow,Bloom,Bloom); + Glow=lerp(m_glow_low*Glow,m_glow_high*Bloom,pow(colmx,m_glow_dist/gamma_in)); + } + if(m_glow<0.5) + { + if(glow >=0.0)color=color+0.5*Glow*glow;else color=color+abs(glow)*min(emask*emask,1.0)*Glow;}else + { + float3 fmask= clamp(lerp(one,dmask,m_glow_mask),0.0,1.0); + color=color+abs(glow)*fmask*Glow; + } + color=min(color,1.0); + color=min(color,max(orig1,color)* lerp(one,dmask,mclip)); + color=pow(color,1.0/gamma_o); + float rc=0.6*sqrt(max(max(color.r,color.g),color.b))+0.4; + if(abs(addnoised)>0.01) + { + float3 noise0=noise(float3(floor(OptSize.xy*fuxcoord/noiseresd),float(framecount))); + if(noisetype<0.5)color=lerp(color,noise0,0.25*abs(addnoised)*rc);else + color=min(color*lerp(1.0,1.5*noise0.x,0.5*abs(addnoised)),1.0); + } + colmx=max(max(orig1.r,orig1.g),orig1.b); + color=color+bmask*lerp(emask,0.125*(1.0-colmx)*color,min(20.0*colmx,1.0)); + return float4(color*vig*humbars(lerp(pos.y,pos.x,bardir))*post_br*corner(pos0),1.0); +} + +technique CRT_Guest_HD +{ + pass Afterglow + { + VertexShader=PostProcessVS; + PixelShader=AfterglowPS; + RenderTarget=CRTHD_T1; + } + pass PreShader + { + VertexShader=PostProcessVS; + PixelShader=PreShaderPS; + RenderTarget=CRTHD_T2; + } + pass Linearize + { + VertexShader=PostProcessVS; + PixelShader=LinearizePS; + RenderTarget=CRTHD_T3; + } + pass CRT_Pass1 + { + VertexShader=PostProcessVS; + PixelShader=HD_Pass1_PS; + RenderTarget=CRTHD_T4; + } + pass GaussianX + { + VertexShader=PostProcessVS; + PixelShader=HGaussianPS; + RenderTarget=CRTHD_T5; + } + pass GaussianY + { + VertexShader=PostProcessVS; + PixelShader=VGaussianPS; + RenderTarget=CRTHD_T6; + } + pass BloomHorz + { + VertexShader=PostProcessVS; + PixelShader=BloomHorzPS; + RenderTarget=CRTHD_T7; + } + pass BloomVert + { + VertexShader=PostProcessVS; + PixelShader=BloomVertPS; + RenderTarget=CRTHD_T8; + } + pass CRT_Pass2 + { + VertexShader=PostProcessVS; + PixelShader=HD_Pass2_PS; + RenderTarget=CRTHD_T9; + } + pass Chromatic + { + VertexShader=PostProcessVS; + PixelShader=ChromaticPS; + } +} \ No newline at end of file diff --git a/data/resources/shaders/reshade/Textures/CRT-LUT-1.png b/data/resources/shaders/reshade/Textures/CRT-LUT-1.png new file mode 100644 index 0000000000000000000000000000000000000000..b5f1e5af172acbf56d42f79c9e254d7c94c7d780 GIT binary patch literal 14866 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 literal 0 HcmV?d00001 diff --git a/data/resources/shaders/reshade/Textures/CRT-LUT-4.png b/data/resources/shaders/reshade/Textures/CRT-LUT-4.png new file mode 100644 index 0000000000000000000000000000000000000000..323ec71c97874656229107545b68f766ead12da5 GIT binary patch literal 22140 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 Da;uw+ literal 0 HcmV?d00001 diff --git a/data/resources/shaders/reshade/source.txt b/data/resources/shaders/reshade/source.txt index eb18a52a9..5ad864c5d 100644 --- a/data/resources/shaders/reshade/source.txt +++ b/data/resources/shaders/reshade/source.txt @@ -1,3 +1,4 @@ https://github.com/crosire/reshade-shaders https://github.com/Matsilagi/RSRetroArch/ https://github.com/akgunter/crt-royale-reshade +https://github.com/HelelSingh/CRT-Guest-ReShade diff --git a/data/resources/thirdparty.html b/data/resources/thirdparty.html index 8df3b02ca..1ceb92046 100644 --- a/data/resources/thirdparty.html +++ b/data/resources/thirdparty.html @@ -2734,6 +2734,7 @@ Some shaders provided with the application are sourced from:

License details are included in the relevant shader source files, under resources\shaders\reshade.