mirror of
				https://github.com/RetroDECK/Duckstation.git
				synced 2025-04-10 19:15:14 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			908 lines
		
	
	
		
			28 KiB
		
	
	
	
		
			HLSL
		
	
	
	
	
	
			
		
		
	
	
			908 lines
		
	
	
		
			28 KiB
		
	
	
	
		
			HLSL
		
	
	
	
	
	
| #ifndef _BIND_SHADER_PARAMS_H
 | |
| #define _BIND_SHADER_PARAMS_H
 | |
| 
 | |
| /////////////////////////////  GPL LICENSE NOTICE  /////////////////////////////
 | |
| 
 | |
| //  crt-royale: A full-featured CRT shader, with cheese.
 | |
| //  Copyright (C) 2014 TroggleMonkey <trogglemonkey@gmx.com>
 | |
| //
 | |
| //  crt-royale-reshade: A port of TroggleMonkey's crt-royale from libretro to ReShade.
 | |
| //  Copyright (C) 2020 Alex Gunter <akg7634@gmail.com>
 | |
| //
 | |
| //  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 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
 | |
| 
 | |
| 
 | |
| /////////////////////////////  SETTINGS MANAGEMENT  ////////////////////////////
 | |
| 
 | |
| ///////////////////////////////  BEGIN INCLUDES  ///////////////////////////////
 | |
| #include "helper-functions-and-macros.fxh"
 | |
| #include "user-settings.fxh"
 | |
| #include "derived-settings-and-constants.fxh"
 | |
| #include "../version-number.fxh"
 | |
| 
 | |
| ////////////////////////////////  END INCLUDES  ////////////////////////////////
 | |
| 
 | |
| //  Override some parameters for gamma-management.h and tex2Dantialias.h:
 | |
| #ifndef _OVERRIDE_DEVICE_GAMMA
 | |
|     #define _OVERRIDE_DEVICE_GAMMA 1
 | |
| #endif
 | |
| 
 | |
| #if __RENDERER__ != 0x9000
 | |
|     #define _DX9_ACTIVE 0
 | |
| #else
 | |
|     #define _DX9_ACTIVE 1
 | |
| #endif
 | |
| 
 | |
| // #ifndef ANTIALIAS_OVERRIDE_BASICS
 | |
| //     #define ANTIALIAS_OVERRIDE_BASICS 1
 | |
| // #endif
 | |
| 
 | |
| // #ifndef ANTIALIAS_OVERRIDE_PARAMETERS
 | |
| //     #define ANTIALIAS_OVERRIDE_PARAMETERS 1
 | |
| // #endif
 | |
| 
 | |
| #ifndef ADVANCED_SETTINGS
 | |
|     #define ADVANCED_SETTINGS 0
 | |
| #endif 
 | |
| 
 | |
| // The width of the game's content
 | |
| #ifndef CONTENT_WIDTH
 | |
| 	#define CONTENT_WIDTH BUFFER_WIDTH
 | |
| #endif
 | |
| // The height of the game's content
 | |
| #ifndef CONTENT_HEIGHT
 | |
| 	#define CONTENT_HEIGHT BUFFER_HEIGHT
 | |
| #endif
 | |
| 
 | |
| #if ADVANCED_SETTINGS == 1
 | |
|     // Using vertex uncropping is marginally faster, but vulnerable to DX9 weirdness.
 | |
|     // Most users will likely prefer the slower algorithm.
 | |
|     #ifndef USE_VERTEX_UNCROPPING
 | |
|         #define USE_VERTEX_UNCROPPING 0
 | |
|     #endif
 | |
| 
 | |
|     #ifndef NUM_BEAMDIST_COLOR_SAMPLES
 | |
|         #define NUM_BEAMDIST_COLOR_SAMPLES 1024
 | |
|     #endif
 | |
| 
 | |
|     #ifndef NUM_BEAMDIST_DIST_SAMPLES
 | |
|         #define NUM_BEAMDIST_DIST_SAMPLES 120
 | |
|     #endif
 | |
| 
 | |
|     #ifndef BLOOMAPPROX_DOWNSIZING_FACTOR
 | |
|         #define BLOOMAPPROX_DOWNSIZING_FACTOR 4.0
 | |
|     #endif
 | |
| 
 | |
|     // Define this internal value, so ADVANCED_SETTINGS == 0 doesn't cause a redefinition error when
 | |
|     //   NUM_BEAMDIST_COLOR_SAMPLES defined in the preset file. Also makes it easy to avoid bugs
 | |
|     //   related to parentheses and order-of-operations when the user defines this arithmetically.
 | |
|     static const uint num_beamdist_color_samples = uint(NUM_BEAMDIST_COLOR_SAMPLES);
 | |
|     static const uint num_beamdist_dist_samples = uint(NUM_BEAMDIST_DIST_SAMPLES);
 | |
|     static const float bloomapprox_downsizing_factor = float(BLOOMAPPROX_DOWNSIZING_FACTOR);
 | |
| #else
 | |
|     static const uint USE_VERTEX_CROPPING = 0;
 | |
|     static const uint num_beamdist_color_samples = 1024;
 | |
|     static const uint num_beamdist_dist_samples = 120;
 | |
|     static const float bloomapprox_downsizing_factor = 4.0;
 | |
| #endif
 | |
| 
 | |
| #ifndef HIDE_HELP_SECTIONS
 | |
|     #define HIDE_HELP_SECTIONS 0
 | |
| #endif
 | |
| 
 | |
| 
 | |
| // Offset the center of the game's content (horizontal)
 | |
| #ifndef CONTENT_CENTER_X
 | |
| 	#define CONTENT_CENTER_X 0
 | |
| #endif
 | |
| // Offset the center of the game's content (vertical)
 | |
| #ifndef CONTENT_CENTER_Y
 | |
| 	#define CONTENT_CENTER_Y 0
 | |
| #endif
 | |
| 
 | |
| // Wrap the content size in parenthesis for internal use, so the user doesn't have to
 | |
| static const float2 content_size = float2(int(CONTENT_WIDTH), int(CONTENT_HEIGHT));
 | |
| 
 | |
| #ifndef ENABLE_PREBLUR
 | |
|     #define ENABLE_PREBLUR 1
 | |
| #endif
 | |
| 
 | |
| 
 | |
| static const float2 buffer_size = float2(BUFFER_WIDTH, BUFFER_HEIGHT);
 | |
| 
 | |
| 
 | |
| // The normalized center is 0.5 plus the normalized offset
 | |
| static const float2 content_center = float2(CONTENT_CENTER_X, CONTENT_CENTER_Y) / buffer_size + 0.5;
 | |
| // The content's normalized diameter d is its size divided by the buffer's size. The radius is d/2.
 | |
| static const float2 content_radius = content_size / (2.0 * buffer_size);
 | |
| static const float2 content_scale = content_size / buffer_size;
 | |
| 
 | |
| static const float content_left = content_center.x - content_radius.x;
 | |
| static const float content_right = content_center.x + content_radius.x;
 | |
| static const float content_upper = content_center.y - content_radius.y;
 | |
| static const float content_lower = content_center.y + content_radius.y;
 | |
| 
 | |
| // The xy-offset of the top-left pixel in the content box
 | |
| static const float2 content_offset = float2(content_left, content_upper);
 | |
| static const float2 content_offset_from_right = float2(content_right, content_lower);
 | |
| 
 | |
| uniform uint frame_count < source = "framecount"; >;
 | |
| uniform int overlay_active < source = "overlay_active"; >;
 | |
| 
 | |
| static const float gba_gamma = 3.5; //  Irrelevant but necessary to define.
 | |
| 
 | |
| 
 | |
| // === HELP AND INFO ===
 | |
| 
 | |
| uniform int APPEND_VERSION_SUFFIX(version) <
 | |
| 	ui_text = "Version: " DOT_VERSION_STR;
 | |
| 	ui_label = " ";
 | |
| 	ui_type = "radio";
 | |
| >;
 | |
| 
 | |
| uniform int basic_setup_help <
 | |
| 	ui_text = "1. Configure the Content Box if your game has letter-boxing.\n"
 | |
| 			  "2. Configure the Phosphor Mask.\n"
 | |
|               "3. Configure the Scanlines.\n"
 | |
|               "4. Configure the Colors and Effects.\n"
 | |
|               "5. Configure the Screen Geometry.\n"
 | |
|               "6. Configure or disable Preblur\n\n"
 | |
|               "- In Preprocessor Definitions, set ADVANCED_SETTINGS to 1 to access more settings.\n";
 | |
| 	ui_category = "Basic Setup Instructions";
 | |
|     ui_category_closed = true;
 | |
| 	ui_label = " ";
 | |
| 	ui_type = "radio";
 | |
|     hidden = HIDE_HELP_SECTIONS;
 | |
| >;
 | |
| 
 | |
| uniform int content_box_help <
 | |
| 	ui_text = "1. Expand the Preprocessor Definitions section.\n"
 | |
|               "2. Set CONTENT_BOX_VISIBLE to 1.\n"
 | |
|               "3. Use the \"CONTENT_\" parameters to configure the Content Box.\n"
 | |
| 			  "4. Align the content box with the border of your game.\n"
 | |
|               "5. Set CONTENT_BOX_VISIBLE to 0 when you're done.\n\n"
 | |
|               "Parameters to focus on:\n"
 | |
|               "- CONTENT_HEIGHT and CONTENT_WIDTH\n"
 | |
|               "- CONTENT_CENTER_X and CONTENT_CENTER_Y\n"
 | |
|               "- CONTENT_BOX_INSCRIBED\n\n"
 | |
|               "Fancy Trick 1:\n"
 | |
|               "\tCONTENT_HEIGHT = BUFFER_HEIGHT\n"
 | |
|               "\tCONTENT_WIDTH = CONTENT_HEIGHT * 4.0 / 3.0\n"
 | |
|               "- Good if your game fills the screen vertically and has a 4:3 aspect ratio.\n"
 | |
|               "- Will also rescale automatically if you resize the window.\n\n"
 | |
|               "Fancy Trick 2:\n"
 | |
|               "\tCONTENT_HEIGHT = CONTENT_WIDTH * 9.0 / 16.0\n"
 | |
|               "\tCONTENT_WIDTH = 1500\n"
 | |
|               "- Good if your game is 1500 pixels wide with a 16:9 aspect ratio.\n"
 | |
|               "- Won't rescale automatically, but you'd only have to change the width.\n";
 | |
| 	ui_category = "Content Box Instructions";
 | |
|     ui_category_closed = true;
 | |
| 	ui_label = " ";
 | |
| 	ui_type = "radio";
 | |
|     hidden = HIDE_HELP_SECTIONS;
 | |
| >;
 | |
| 
 | |
| 
 | |
| // ==== PHOSPHOR MASK ====
 | |
| uniform int mask_type <
 | |
|         #if !HIDE_HELP_SECTIONS
 | |
|         ui_text    = "Choose which kind of CRT you want.\n\n";
 | |
|         #endif
 | |
|         ui_label   = "Mask Type";
 | |
|         ui_tooltip = "Selects the phosphor shape";
 | |
|         ui_type    = "combo";
 | |
|         ui_items   = "Grille\0"
 | |
|                     "Slot\0"
 | |
|                     "Shadow\0"
 | |
|                     "LowRes Grille\0"
 | |
|                     "LowRes Slot\0"
 | |
|                     "LowRes Shadow\0";
 | |
| 
 | |
|     ui_category = "Phosphor Mask";
 | |
|     ui_category_closed = true;
 | |
| > = mask_type_static;
 | |
| 
 | |
| uniform uint mask_size_param <
 | |
|         ui_label   = "Mask Size Param";
 | |
|         ui_tooltip = "Switch between using Mask Triad Size or Mask Num Triads";
 | |
|         ui_type    = "combo";
 | |
|         ui_items   = "Triad Width\0"
 | |
|                     "Num Triads Across\0";
 | |
|         hidden     = !ADVANCED_SETTINGS;
 | |
| 
 | |
|     ui_spacing = 2;
 | |
|     ui_category = "Phosphor Mask";
 | |
| > = mask_size_param_static;
 | |
| 
 | |
| uniform float mask_triad_width <
 | |
|         ui_label   = "Mask Triad Width";
 | |
|         ui_tooltip = "The width of a triad in pixels";
 | |
|         ui_type    = "slider";
 | |
|         ui_min     = 1.0;
 | |
|         ui_max     = 60.0;
 | |
|         ui_step    = 0.1;
 | |
| 
 | |
|     ui_category = "Phosphor Mask";
 | |
| > = mask_triad_width_static;
 | |
| 
 | |
| uniform float mask_num_triads_across <
 | |
|         ui_label   = "Mask Num Triads Across";
 | |
|         ui_tooltip = "The number of triads in the viewport (horizontally)";
 | |
|         ui_type    = "drag";
 | |
|         ui_min     = 1.0;
 | |
|         ui_max     = 1280.0;
 | |
|         ui_step    = 1.0;
 | |
|         hidden     = !ADVANCED_SETTINGS;
 | |
| 
 | |
|     ui_category = "Phosphor Mask";
 | |
| > = mask_num_triads_across_static;
 | |
| 
 | |
| uniform float scale_triad_height<
 | |
|         ui_label   = "Scale Triad Height";
 | |
|         ui_tooltip = "Scales the height of a triad";
 | |
|         ui_type    = "drag";
 | |
|         ui_min     = 0.01;
 | |
|         ui_max     = 10.0;
 | |
|         ui_step    = 0.001;
 | |
| 
 | |
|     ui_spacing = 2;
 | |
|     ui_category = "Phosphor Mask";
 | |
| > = 1.0;
 | |
| 
 | |
| uniform float2 phosphor_thickness <
 | |
|         ui_label   = "Phosphor Thickness XY";
 | |
|         ui_tooltip = "Makes the phosphors appear thicker in each direction";
 | |
|         ui_type    = "drag";
 | |
|         ui_min     = 0.01;
 | |
|         ui_max     = 0.99;
 | |
|         ui_step    = 0.01;
 | |
|         // hidden     = !ADVANCED_SETTINGS;
 | |
| 
 | |
|     ui_category = "Phosphor Mask";
 | |
| > = 0.2;
 | |
| 
 | |
| uniform float2 phosphor_sharpness <
 | |
|         ui_label   = "Phosphor Sharpness XY";
 | |
|         ui_tooltip = "Makes the phosphors appear more crisp in each direction";
 | |
|         ui_type    = "drag";
 | |
|         ui_min     = 1;
 | |
|         ui_max     = 100;
 | |
|         ui_step    = 1;
 | |
|         // hidden     = !ADVANCED_SETTINGS;
 | |
| 
 | |
|     ui_category = "Phosphor Mask";
 | |
| > = 50;
 | |
| 
 | |
| uniform float3 phosphor_offset_x <
 | |
|         ui_label   = "Phosphor Offset RGB X";
 | |
|         ui_tooltip = "Very slightly shifts the phosphor mask. Can help with subpixel alignment.";
 | |
|         ui_type    = "drag";
 | |
|         ui_min     = -1;
 | |
|         ui_max     = 1;
 | |
|         ui_step    = 0.01;
 | |
|         // hidden     = !ADVANCED_SETTINGS;
 | |
| 
 | |
|     ui_spacing = 2;
 | |
|     ui_category = "Phosphor Mask";
 | |
| > = 0;
 | |
| 
 | |
| uniform float3 phosphor_offset_y <
 | |
|         ui_label   = "Phosphor Offset RGB Y";
 | |
|         ui_tooltip = "Very slightly shifts the phosphor mask. Can help with subpixel alignment.";
 | |
|         ui_type    = "drag";
 | |
|         ui_min     = -1;
 | |
|         ui_max     = 1;
 | |
|         ui_step    = 0.01;
 | |
|         // hidden     = !ADVANCED_SETTINGS;
 | |
| 
 | |
|     ui_category = "Phosphor Mask";
 | |
| > = 0;
 | |
| 
 | |
| // static const uint pixel_grid_mode = 0;
 | |
| // static const float2 pixel_size = 1;
 | |
| /*
 | |
| // ==== PIXELATION ===
 | |
| uniform uint pixel_grid_mode <
 | |
|         #if !HIDE_HELP_SECTIONS
 | |
|         ui_text    = "- Fix issues displaying pixel art.\n"
 | |
|                      "- Force high-res games to look low-res.\n\n";
 | |
|         #endif
 | |
|         ui_label   = "Pixel Grid Param";
 | |
|         ui_tooltip = "Switch between using Pixel Size or Num Pixels";
 | |
|         ui_type    = "combo";
 | |
|         ui_items   = "Pixel Size\0"
 | |
|                     "Content Resolution\0";
 | |
|         hidden     = !ADVANCED_SETTINGS;
 | |
| 
 | |
|     ui_category = "Pixelation";
 | |
|     ui_category_closed = true;
 | |
| > = 0;
 | |
| 
 | |
| uniform float2 pixel_size <
 | |
|         #if !HIDE_HELP_SECTIONS && !ADVANCED_SETTINGS
 | |
|         ui_text    = "- Fix issues displaying pixel art.\n"
 | |
|                      "- Force high-res games to look low-res.\n\n";
 | |
|         #endif
 | |
|         ui_label   = "Pixel Size";
 | |
|         ui_tooltip = "The size of an in-game pixel on screen, in real-world pixels";
 | |
|         ui_type    = "slider";
 | |
|         ui_min     = 1.0;
 | |
|         ui_max     = 30.0;
 | |
|         ui_step    = 1.0;
 | |
| 
 | |
|     ui_category = "Pixelation";
 | |
|     ui_category_closed = true;
 | |
| > = float2(1, 1);
 | |
| 
 | |
| uniform float2 pixel_grid_resolution <
 | |
|         ui_label   = "Num Pixels";
 | |
|         ui_tooltip = "The number of in-game pixels displayed on-screen in each direction";
 | |
|         ui_type    = "drag";
 | |
|         ui_min     = 1.0;
 | |
|         ui_max     = 10000.0;
 | |
|         ui_step    = 1.0;
 | |
|         hidden     = !ADVANCED_SETTINGS;
 | |
| 
 | |
|     ui_category = "Pixelation";
 | |
| > = content_size;
 | |
| uniform float2 pixel_grid_offset <
 | |
|         ui_label   = "Pixel Grid Offset";
 | |
|         ui_tooltip = "Shifts the pixel-grid to help with alignment";
 | |
|         ui_type    = "slider";
 | |
|         ui_min     = -15.0;
 | |
|         ui_max     = 15.0;
 | |
|         ui_step    = 1.0;
 | |
| 
 | |
|     #if ADVANCED_SETTINGS
 | |
|     ui_spacing = 2;
 | |
|     #endif
 | |
|     ui_category = "Pixelation";
 | |
| > = float2(0, 0);
 | |
| */
 | |
| 
 | |
| // ==== SCANLINES ====
 | |
| uniform uint scanline_thickness <
 | |
|         #if !HIDE_HELP_SECTIONS
 | |
|         ui_text    = "Configure the electron beams and interlacing.\n\n";
 | |
|         #endif
 | |
|         ui_label   = "Scanline Thickness";
 | |
|         ui_tooltip = "Sets the height of each scanline";
 | |
|         ui_type    = "slider";
 | |
|         ui_min     = 1;
 | |
|         ui_max     = 30;
 | |
|         ui_step    = 1;
 | |
| 
 | |
|     ui_category = "Scanlines";
 | |
|     ui_category_closed = true;
 | |
| > = 2;
 | |
| 
 | |
| uniform float scanline_offset <
 | |
|         ui_label   = "Scanline Offset";
 | |
|         ui_tooltip = "Vertically shifts the scanlines to help with alignment";
 | |
|         ui_type    = "slider";
 | |
|         ui_min     = -30;
 | |
|         ui_max     = 30;
 | |
|         ui_step    = 1;
 | |
|         hidden     = !ADVANCED_SETTINGS;
 | |
| 
 | |
|     ui_category = "Scanlines";
 | |
| > = 0;
 | |
| 
 | |
| uniform uint beam_shape_mode <
 | |
|         ui_label   = "Beam Shape Mode";
 | |
|         ui_tooltip = "Select the kind of beam to use.";
 | |
|         ui_type    = "combo";
 | |
|         ui_items   = "Digital (Fast)\0"
 | |
|                     "Linear (Simple)\0"
 | |
|                     "Gaussian (Realistic)\0"
 | |
|                     "Multi-Source Gaussian (Expensive)\0";
 | |
| 
 | |
|     ui_category = "Scanlines";
 | |
| > = 1;
 | |
| 
 | |
| uniform bool enable_interlacing <
 | |
|         ui_label   = "Enable Interlacing";
 | |
| 
 | |
|     ui_spacing = 5;
 | |
|     ui_category = "Scanlines";
 | |
| > = false;
 | |
| 
 | |
| uniform bool interlace_back_field_first <
 | |
|         ui_label   = "Draw Back-Field First";
 | |
|         ui_tooltip = "Draw odd-numbered scanlines first (often has no effect)";
 | |
| 
 | |
|     ui_category = "Scanlines";
 | |
| > = interlace_back_field_first_static;
 | |
| 
 | |
| uniform uint scanline_deinterlacing_mode <
 | |
|         ui_label   = "Deinterlacing Mode";
 | |
|         ui_tooltip = "Selects the deinterlacing algorithm, if any.";
 | |
|         ui_type    = "combo";
 | |
|         ui_items   = "None\0"
 | |
|                      "Fake-Progressive\0"  
 | |
|                      "Weaving\0"
 | |
|                      "Blended Weaving\0";
 | |
| 
 | |
|     ui_category = "Scanlines";
 | |
| > = 1;
 | |
| 
 | |
| uniform float deinterlacing_blend_gamma <
 | |
|         ui_label   = "Deinterlacing Blend Gamma";
 | |
|         ui_tooltip = "Nudge this if deinterlacing changes your colors too much";
 | |
|         ui_type    = "slider";
 | |
|         ui_min     = 0.01;
 | |
|         ui_max     = 5.0;
 | |
|         ui_step    = 0.01;
 | |
| 
 | |
|     ui_category = "Scanlines";
 | |
| > = 1.0;
 | |
| 
 | |
| uniform float linear_beam_thickness <
 | |
|         ui_label   = "Linear Beam Thickness";
 | |
|         ui_tooltip = "Linearly widens or narrows the beam";
 | |
|         ui_type    = "slider";
 | |
|         ui_min     = 0.01;
 | |
|         ui_max     = 3.0;
 | |
|         ui_step    = 0.01;
 | |
| 
 | |
|     ui_spacing = 5;
 | |
|     ui_category = "Scanlines";
 | |
| > = 1.0;
 | |
| 
 | |
| uniform float gaussian_beam_min_sigma <
 | |
|         ui_label   = "Gaussian Beam Min Sigma";
 | |
|         ui_tooltip = "For Gaussian Beam Shape, sets thickness of dim pixels";
 | |
|         ui_type    = "drag";
 | |
|         ui_min     = 0.0;
 | |
|         ui_step    = 0.01;
 | |
| 
 | |
|     ui_spacing = 5;
 | |
|     ui_category = "Scanlines";
 | |
| > = gaussian_beam_min_sigma_static;
 | |
| 
 | |
| uniform float gaussian_beam_max_sigma <
 | |
|         ui_label   = "Gaussian Beam Max Sigma";
 | |
|         ui_tooltip = "For Gaussian Beam Shape, sets thickness of bright pixels";
 | |
|         ui_type    = "drag";
 | |
|         ui_min     = 0.0;
 | |
|         ui_step    = 0.01;
 | |
| 
 | |
|     ui_category = "Scanlines";
 | |
| > = gaussian_beam_max_sigma_static;
 | |
| 
 | |
| uniform float gaussian_beam_spot_power <
 | |
|         ui_label   = "Gaussian Beam Spot Power";
 | |
|         ui_tooltip = "For Gaussian Beam Shape, balances between Min and Max Sigma";
 | |
|         ui_type    = "drag";
 | |
|         ui_min     = 0.0;
 | |
|         ui_step    = 0.01;
 | |
| 
 | |
|     ui_category = "Scanlines";
 | |
| > = gaussian_beam_spot_power_static;
 | |
| 
 | |
| uniform float gaussian_beam_min_shape <
 | |
|         ui_label   = "Gaussian Beam Min Shape";
 | |
|         ui_tooltip = "For Gaussian Beam Shape, sets sharpness of dim pixels";
 | |
|         ui_type    = "drag";
 | |
|         ui_min     = 0.0;
 | |
|         ui_step    = 0.01;
 | |
|         hidden     = !ADVANCED_SETTINGS;
 | |
| 
 | |
|     ui_spacing = 2;
 | |
|     ui_category = "Scanlines";
 | |
| > = gaussian_beam_min_shape_static;
 | |
| 
 | |
| uniform float gaussian_beam_max_shape <
 | |
|         ui_label   = "Gaussian Beam Max Shape";
 | |
|         ui_tooltip = "For Gaussian Beam Shape, sets sharpness of bright pixels";
 | |
|         ui_type    = "drag";
 | |
|         ui_min     = 0.0;
 | |
|         ui_step    = 0.01;
 | |
|         hidden     = !ADVANCED_SETTINGS;
 | |
| 
 | |
|     ui_category = "Scanlines";
 | |
| > = gaussian_beam_max_shape_static;
 | |
| 
 | |
| uniform float gaussian_beam_shape_power <
 | |
|         ui_label   = "Gaussian Beam Shape Power";
 | |
|         ui_tooltip = "For Gaussian Beam Shape, balances between Min and Max Shape";
 | |
|         ui_type    = "drag";
 | |
|         ui_min     = 0.0;
 | |
|         ui_step    = 0.01;
 | |
|         hidden     = !ADVANCED_SETTINGS;
 | |
| 
 | |
|     ui_category = "Scanlines";
 | |
| > = gaussian_beam_shape_power_static;
 | |
| 
 | |
| uniform float3 convergence_offset_x <
 | |
|         ui_label   = "Convergence Offset X RGB";
 | |
|         ui_tooltip = "Shift the color channels horizontally";
 | |
|         ui_type    = "drag";
 | |
|         ui_min     = -10;
 | |
|         ui_max     = 10;
 | |
|         ui_step    = 0.05;
 | |
|         hidden     = !ADVANCED_SETTINGS;
 | |
| 
 | |
|     ui_spacing = 5;
 | |
|     ui_category = "Scanlines";
 | |
| > = 0;
 | |
| uniform float3 convergence_offset_y <
 | |
|         ui_label   = "Convergence Offset Y RGB";
 | |
|         ui_tooltip = "Shift the color channels vertically";
 | |
|         ui_type    = "drag";
 | |
|         ui_min     = -10;
 | |
|         ui_max     = 10;
 | |
|         ui_step    = 0.05;
 | |
|         hidden     = !ADVANCED_SETTINGS;
 | |
|     ui_category = "Scanlines";
 | |
| > = 0;
 | |
| 
 | |
| static uint beam_horiz_filter = beam_horiz_filter_static;
 | |
| static float beam_horiz_sigma = beam_horiz_sigma_static;
 | |
| static float beam_horiz_linear_rgb_weight = beam_horiz_linear_rgb_weight_static;
 | |
| 
 | |
| // ==== IMAGE COLORIZATION ====
 | |
| uniform float crt_gamma <
 | |
|         #if !HIDE_HELP_SECTIONS
 | |
|         ui_text    = "Apply gamma, contrast, and blurring.\n\n";
 | |
|         #endif
 | |
|         ui_label   = "CRT Gamma";
 | |
|         ui_tooltip = "The gamma-level of the original content";
 | |
|         ui_type    = "slider";
 | |
|         ui_min     = 1.0;
 | |
|         ui_max     = 5.0;
 | |
|         ui_step    = 0.01;
 | |
| 
 | |
|     ui_category = "Colors and Effects";
 | |
|     ui_category_closed = true;
 | |
| > = crt_gamma_static;
 | |
| 
 | |
| uniform float lcd_gamma <
 | |
|         ui_label   = "LCD Gamma";
 | |
|         ui_tooltip = "The gamma-level of your display";
 | |
|         ui_type    = "slider";
 | |
|         ui_min     = 1.0;
 | |
|         ui_max     = 5.0;
 | |
|         ui_step    = 0.01;
 | |
| 
 | |
|     ui_category = "Colors and Effects";
 | |
| > = lcd_gamma_static;
 | |
| 
 | |
| uniform float levels_contrast <
 | |
|         ui_label   = "Levels Contrast";
 | |
|         ui_tooltip = "Sets the contrast of the CRT";
 | |
|         ui_type    = "slider";
 | |
|         ui_min     = 0.0;
 | |
|         ui_max     = 4.0;
 | |
|         ui_step    = 0.01;
 | |
| 
 | |
|     ui_spacing = 5;
 | |
|     ui_category = "Colors and Effects";
 | |
| > = levels_contrast_static;
 | |
| 
 | |
| uniform float halation_weight <
 | |
|         ui_label   = "Halation";
 | |
|         ui_tooltip = "Desaturation due to eletrons exciting the wrong phosphors";
 | |
|         ui_type    = "slider";
 | |
|         ui_min     = 0.0;
 | |
|         ui_max     = 1.0;
 | |
|         ui_step    = 0.01;
 | |
|         
 | |
|     ui_spacing = 2;
 | |
|     ui_category = "Colors and Effects";
 | |
| > = halation_weight_static;
 | |
| 
 | |
| uniform float diffusion_weight <
 | |
|         ui_label   = "Diffusion";
 | |
|         ui_tooltip = "Blurring due to refraction from the screen's glass";
 | |
|         ui_type    = "slider";
 | |
|         ui_min     = 0.0;
 | |
|         ui_max     = 1.0;
 | |
|         ui_step    = 0.01;
 | |
| 
 | |
|     ui_category = "Colors and Effects";
 | |
| > = diffusion_weight_static;
 | |
| 
 | |
| uniform float blur_radius <
 | |
|         ui_label   = "Blur Radius";
 | |
|         ui_tooltip = "Scales the radius of the halation and diffusion effects";
 | |
|         ui_type    = "slider";
 | |
|         ui_min     = 0.01;
 | |
|         ui_max     = 5.0;
 | |
|         ui_step    = 0.01;
 | |
|         hidden     = !ADVANCED_SETTINGS;
 | |
| 
 | |
|     ui_category = "Colors and Effects";
 | |
| > = 1.0;
 | |
| 
 | |
| uniform float bloom_underestimate_levels <
 | |
|         ui_label   = "Bloom Underestimation";
 | |
|         ui_tooltip = "Scale the bloom effect's intensity";
 | |
|         ui_type    = "drag";
 | |
|         ui_min     = FIX_ZERO(0.0);
 | |
|         ui_step    = 0.01;
 | |
| 
 | |
|     ui_spacing = 2;
 | |
|     ui_category = "Colors and Effects";
 | |
| > = bloom_underestimate_levels_static;
 | |
| 
 | |
| uniform float bloom_excess <
 | |
|         ui_label   = "Bloom Excess";
 | |
|         ui_tooltip = "Extra bloom applied to all colors";
 | |
|         ui_type    = "slider";
 | |
|         ui_min     = 0.0;
 | |
|         ui_max     = 1.0;
 | |
|         ui_step    = 0.01;
 | |
| 
 | |
|     ui_category = "Colors and Effects";
 | |
| > = bloom_excess_static;
 | |
| 
 | |
| uniform float2 aa_subpixel_r_offset_runtime <
 | |
|         ui_label   = "AA Subpixel R Offet XY";
 | |
|         ui_type    = "drag";
 | |
|         ui_min     = -0.5;
 | |
|         ui_max     = 0.5;
 | |
|         ui_step    = 0.01;
 | |
|         hidden     = !ADVANCED_SETTINGS || !_RUNTIME_ANTIALIAS_SUBPIXEL_OFFSETS;
 | |
| 
 | |
|     ui_category = "Colors and Effects";
 | |
| > = aa_subpixel_r_offset_static;
 | |
| 
 | |
| static const float aa_cubic_c = aa_cubic_c_static;
 | |
| static const float aa_gauss_sigma = aa_gauss_sigma_static;
 | |
| 
 | |
| 
 | |
| // ==== GEOMETRY ====
 | |
| uniform uint geom_rotation_mode <
 | |
|         #if !HIDE_HELP_SECTIONS
 | |
|         ui_text    = "Change the geometry of the screen's glass.\n\n";
 | |
|         #endif
 | |
|         ui_label   = "Rotate Screen";
 | |
|         ui_type    = "combo";
 | |
|         ui_items   = "0 degrees\0"
 | |
|                      "90 degrees\0"
 | |
|                      "180 degrees\0"
 | |
|                      "270 degrees\0";
 | |
| 
 | |
|     ui_category = "Screen Geometry";
 | |
|     ui_category_closed = true;
 | |
| > = 0;
 | |
| uniform uint geom_mode_runtime <
 | |
|         ui_label   = "Geometry Mode";
 | |
|         ui_tooltip = "Select screen curvature type";
 | |
|         ui_type    = "combo";
 | |
|         ui_items   = "Flat\0"
 | |
|                     "Spherical\0"
 | |
|                     "Spherical (Alt)\0"
 | |
|                     "Cylindrical (Trinitron)\0";
 | |
|                     
 | |
|     ui_category = "Screen Geometry";
 | |
| > = geom_mode_static;
 | |
| 
 | |
| uniform float geom_radius <
 | |
|         ui_label   = "Geometry Radius";
 | |
|         ui_tooltip = "Select screen curvature radius";
 | |
|         ui_type    = "slider";
 | |
|         ui_min     = 1.0 / (2.0 * pi);
 | |
|         ui_max     = 1024;
 | |
|         ui_step    = 0.01;
 | |
| 
 | |
|     ui_category = "Screen Geometry";
 | |
| > = geom_radius_static;
 | |
| 
 | |
| uniform float geom_view_dist <
 | |
|         ui_label   = "View Distance";
 | |
|         ui_type    = "slider";
 | |
|         ui_min     = 0.5;
 | |
|         ui_max     = 1024;
 | |
|         ui_step    = 0.01;
 | |
|         hidden     = !ADVANCED_SETTINGS;
 | |
| 
 | |
|     ui_spacing = 2;
 | |
|     ui_category = "Screen Geometry";
 | |
| > = geom_view_dist_static;
 | |
| 
 | |
| uniform float2 geom_tilt_angle <
 | |
|         ui_label   = "Screen Tilt Angles";
 | |
|         ui_type    = "drag";
 | |
|         ui_min     = -pi;
 | |
|         ui_max     = pi;
 | |
|         ui_step    = 0.01;
 | |
|         hidden     = !ADVANCED_SETTINGS;
 | |
| 
 | |
|     ui_category = "Screen Geometry";
 | |
| > = geom_tilt_angle_static;
 | |
| 
 | |
| uniform float2 geom_aspect_ratio <
 | |
|         ui_label   = "Screen Aspect Ratios";
 | |
|         ui_type    = "drag";
 | |
|         ui_min     = 1.0;
 | |
|         ui_step    = 0.01;
 | |
|         hidden     = !ADVANCED_SETTINGS;
 | |
| 
 | |
|     ui_category = "Screen Geometry";
 | |
| > = float2(geom_aspect_ratio_static, 1);
 | |
| uniform float2 geom_overscan <
 | |
|         ui_label   = "Geom Overscan";
 | |
|         ui_type    = "drag";
 | |
|         ui_min     = FIX_ZERO(0.0);
 | |
|         ui_step    = 0.01;
 | |
|         hidden     = !ADVANCED_SETTINGS;
 | |
| 
 | |
|     ui_spacing = 2;
 | |
|     ui_category = "Screen Geometry";
 | |
| > = geom_overscan_static;
 | |
| 
 | |
| // ==== BORDER ====
 | |
| uniform float border_size <
 | |
|         #if !HIDE_HELP_SECTIONS
 | |
|         ui_text    = "Apply a thin vignette to the edge of the screen.\n\n";
 | |
|         #endif
 | |
|         ui_label   = "Border Size";
 | |
|         ui_category_closed = true;
 | |
|         ui_type    = "slider";
 | |
|         ui_min     = 0.0;
 | |
|         ui_max     = 0.5;
 | |
|         ui_step    = 0.01;
 | |
| 
 | |
|     ui_category = "Screen Border";
 | |
| > = border_size_static;
 | |
| 
 | |
| uniform float border_darkness <
 | |
|         ui_label   = "Border Darkness";
 | |
|         ui_type    = "drag";
 | |
|         ui_min     = 0.0;
 | |
|         ui_step    = 0.01;
 | |
| 
 | |
|     ui_category = "Screen Border";
 | |
| > = border_darkness_static;
 | |
| 
 | |
| uniform float border_compress <
 | |
|         ui_label   = "Border Compress";
 | |
|         ui_type    = "drag";
 | |
|         ui_min     = 0.0;
 | |
|         ui_step    = 0.01;
 | |
|         
 | |
|     ui_category = "Screen Border";
 | |
| > = border_compress_static;
 | |
| 
 | |
| // ==== PREBLUR ====
 | |
| #if ENABLE_PREBLUR
 | |
|     uniform float2 preblur_effect_radius <
 | |
|             #if !HIDE_HELP_SECTIONS
 | |
|             ui_text    = "- Apply a linear blur to the input image. Kind of like an NTSC/Composite shader, but much faster.\n"
 | |
|                          "- If you want to use an NTSC shader or don't like this effect, disable it by setting ENABLE_PREBLUR to 0\n"
 | |
|                          "- If you leave all of these set to 0, then they don't do anything. Consider disabling the effect to improve performance.\n\n";
 | |
|             #endif
 | |
|             ui_type    = "drag";
 | |
|             ui_min     = 0;
 | |
|             ui_max     = 100;
 | |
|             ui_step    = 1;
 | |
|             ui_label   = "Effect Radius XY";
 | |
|             ui_tooltip = "The radius of the effect visible on the screen (measured in pixels)";
 | |
|         
 | |
|         ui_category   = "Pre-Blur";
 | |
|         ui_category_closed = true;
 | |
|     > = 0;
 | |
|     uniform uint2 preblur_sampling_radius <
 | |
|             ui_type = "drag";
 | |
|             ui_min = 0;
 | |
|             ui_max = 100;
 | |
|             ui_step = 1;
 | |
|             ui_label = "Sampling Radius XY";
 | |
|             ui_tooltip = "The number of samples to take on either side of each pixel";
 | |
|         
 | |
|         ui_category   = "Pre-Blur";
 | |
|     > = 0;
 | |
| #else
 | |
|     static const float2 preblur_effect_radius = 0;
 | |
|     static const uint2 preblur_sampling_radius = 0;
 | |
| #endif
 | |
| 
 | |
| //  Provide accessors for vector constants that pack scalar uniforms:
 | |
| float2 get_aspect_vector(const float geom_aspect_ratio)
 | |
| {
 | |
|     //  Get an aspect ratio vector.  Enforce geom_max_aspect_ratio, and prevent
 | |
|     //  the absolute scale from affecting the uv-mapping for curvature:
 | |
|     const float geom_clamped_aspect_ratio =
 | |
|         min(geom_aspect_ratio, geom_max_aspect_ratio);
 | |
|     const float2 geom_aspect =
 | |
|         normalize(float2(geom_clamped_aspect_ratio, 1.0));
 | |
|     return geom_aspect;
 | |
| }
 | |
| 
 | |
| float2 get_geom_overscan_vector()
 | |
| {
 | |
|     return geom_overscan;
 | |
| }
 | |
| 
 | |
| float2 get_geom_tilt_angle_vector()
 | |
| {
 | |
|     return geom_tilt_angle;
 | |
| }
 | |
| 
 | |
| float3 get_convergence_offsets_x_vector()
 | |
| {
 | |
|     return convergence_offset_x;
 | |
| }
 | |
| 
 | |
| float3 get_convergence_offsets_y_vector()
 | |
| {
 | |
|     return convergence_offset_y;
 | |
| }
 | |
| 
 | |
| float2 get_convergence_offsets_r_vector()
 | |
| {
 | |
|     return float2(convergence_offset_x.r, convergence_offset_y.r);
 | |
| }
 | |
| 
 | |
| float2 get_convergence_offsets_g_vector()
 | |
| {
 | |
|     return float2(convergence_offset_x.g, convergence_offset_y.g);
 | |
| }
 | |
| 
 | |
| float2 get_convergence_offsets_b_vector()
 | |
| {
 | |
|     return float2(convergence_offset_x.b, convergence_offset_y.b);
 | |
| }
 | |
| 
 | |
| float2 get_aa_subpixel_r_offset()
 | |
| {
 | |
|     #if _RUNTIME_ANTIALIAS_WEIGHTS
 | |
|         #if _RUNTIME_ANTIALIAS_SUBPIXEL_OFFSETS
 | |
|             //  WARNING: THIS IS EXTREMELY EXPENSIVE.
 | |
|             return aa_subpixel_r_offset_runtime;
 | |
|         #else
 | |
|             return aa_subpixel_r_offset_static;
 | |
|         #endif
 | |
|     #else
 | |
|         return aa_subpixel_r_offset_static;
 | |
|     #endif
 | |
| }
 | |
| 
 | |
| //  Provide accessors settings which still need "cooking:"
 | |
| float get_mask_amplify()
 | |
| {
 | |
|     static const float mask_grille_amplify = 1.0/mask_grille_avg_color;
 | |
|     static const float mask_slot_amplify = 1.0/mask_slot_avg_color;
 | |
|     static const float mask_shadow_amplify = 1.0/mask_shadow_avg_color;
 | |
| 
 | |
|     float mask_amplify;
 | |
|     [flatten]
 | |
|     switch (mask_type) {
 | |
|         case 0:
 | |
|             mask_amplify = mask_grille_amplify;
 | |
|             break;
 | |
|         case 1:
 | |
|             mask_amplify = mask_slot_amplify;
 | |
|             break;
 | |
|         case 2:
 | |
|             mask_amplify = mask_shadow_amplify;
 | |
|             break;
 | |
|         case 3:
 | |
|             mask_amplify = mask_grille_amplify;
 | |
|             break;
 | |
|         case 4:
 | |
|             mask_amplify = mask_slot_amplify;
 | |
|             break;
 | |
|         default:
 | |
|             mask_amplify = mask_shadow_amplify;
 | |
|             break;
 | |
|                     
 | |
|     }
 | |
|     
 | |
|     return mask_amplify;
 | |
| }
 | |
| 
 | |
| #endif  //  _BIND_SHADER_PARAMS_H | 
