mirror of
				https://github.com/RetroDECK/Duckstation.git
				synced 2025-04-10 19:15:14 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			244 lines
		
	
	
		
			6.4 KiB
		
	
	
	
		
			HLSL
		
	
	
	
	
	
			
		
		
	
	
			244 lines
		
	
	
		
			6.4 KiB
		
	
	
	
		
			HLSL
		
	
	
	
	
	
| #include "ReShade.fxh"
 | |
| 
 | |
| /////////////////////////////  GPL LICENSE NOTICE  /////////////////////////////
 | |
| 
 | |
| //  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
 | |
| 
 | |
| // Enable or disable the shader
 | |
| #ifndef CONTENT_BOX_VISIBLE
 | |
| 	#define CONTENT_BOX_VISIBLE 0
 | |
| #endif
 | |
| 
 | |
| #include "crt-royale/shaders/content-box.fxh"
 | |
| 
 | |
| #if !CONTENT_BOX_VISIBLE
 | |
| 	#include "crt-royale/shaders/input-blurring.fxh"
 | |
| 	#include "crt-royale/shaders/electron-beams.fxh"
 | |
| 	#include "crt-royale/shaders/blurring.fxh"
 | |
| 	#include "crt-royale/shaders/deinterlace.fxh"
 | |
| 	#include "crt-royale/shaders/phosphor-mask.fxh"
 | |
| 	#include "crt-royale/shaders/brightpass.fxh"
 | |
| 	#include "crt-royale/shaders/bloom.fxh"
 | |
| 	#include "crt-royale/shaders/geometry-aa-last-pass.fxh"
 | |
| #endif
 | |
| 
 | |
| 
 | |
| technique CRT_Royale
 | |
| {
 | |
| 	// Toggle the content box to help users configure it
 | |
| 	#if CONTENT_BOX_VISIBLE
 | |
| 		pass contentBoxPass
 | |
| 		{
 | |
| 			// content-box.fxh
 | |
| 			// Draw a box that displays the crop we'll perform.
 | |
| 			VertexShader = PostProcessVS;
 | |
| 			PixelShader = contentBoxPixelShader;
 | |
| 		}
 | |
| 	#else
 | |
| 		#if ENABLE_PREBLUR
 | |
| 			pass PreblurVert
 | |
| 			{
 | |
| 				// input-blurring.fxh
 | |
| 				// Optionally blur the input buffer a little
 | |
| 				VertexShader = contentCropVS;
 | |
| 				PixelShader = preblurVertPS;
 | |
| 
 | |
| 				RenderTarget = texPreblurVert;
 | |
| 
 | |
| 				PrimitiveTopology = TRIANGLESTRIP;
 | |
| 				VertexCount = 4;
 | |
| 			}
 | |
| 			pass PreblurHoriz
 | |
| 			{
 | |
| 				// input-blurring.fxh
 | |
| 				VertexShader = PostProcessVS;
 | |
| 				PixelShader = preblurHorizPS;
 | |
| 				
 | |
| 				RenderTarget = texPreblurHoriz;
 | |
| 			}
 | |
| 		#endif
 | |
| 		pass beamDistPass
 | |
| 		{
 | |
| 			// electron-beams.fxh
 | |
| 			// Simulate emission of the interlaced video as electron beams. 	
 | |
| 			VertexShader = calculateBeamDistsVS;
 | |
| 			PixelShader = calculateBeamDistsPS;
 | |
| 
 | |
| 			RenderTarget = texBeamDist;
 | |
| 
 | |
| 			// This lets us improve performance by only computing the mask every k frames
 | |
| 			ClearRenderTargets = false;
 | |
| 		}
 | |
| 		pass electronBeamPass
 | |
| 		{
 | |
| 			// electron-beams.fxh
 | |
| 			// Simulate emission of the interlaced video as electron beams. 	
 | |
| 			VertexShader = simulateEletronBeamsVS;
 | |
| 			PixelShader = simulateEletronBeamsPS;
 | |
| 
 | |
| 			RenderTarget = texElectronBeams;
 | |
| 
 | |
| 			// If the preblur passes are disabled, we have to crop in this pass
 | |
| 			#if !ENABLE_PREBLUR
 | |
| 			PrimitiveTopology = TRIANGLESTRIP;
 | |
| 			VertexCount = 4;
 | |
| 			#endif
 | |
| 		}
 | |
| 		pass beamConvergencePass
 | |
| 		{
 | |
| 			// electron-beams.fxh
 | |
| 			// Simulate beam convergence miscalibration
 | |
| 			//   Not to be confused with beam purity
 | |
| 			VertexShader = beamConvergenceVS;
 | |
| 			PixelShader = beamConvergencePS;
 | |
| 
 | |
| 			RenderTarget = texBeamConvergence;
 | |
| 		}
 | |
| 		pass bloomApproxPassVert
 | |
| 		{
 | |
| 			// bloom.fxh
 | |
| 			VertexShader = PostProcessVS;
 | |
| 			PixelShader = approximateBloomVertPS;
 | |
| 			
 | |
| 			RenderTarget = texBloomApproxVert;
 | |
| 		}
 | |
| 		pass bloomApproxPassHoriz
 | |
| 		{
 | |
| 			// bloom.fxh
 | |
| 			VertexShader = PostProcessVS;
 | |
| 			PixelShader = approximateBloomHorizPS;
 | |
| 			
 | |
| 			RenderTarget = texBloomApproxHoriz;
 | |
| 		}
 | |
| 		pass blurVerticalPass
 | |
| 		{
 | |
| 			// blurring.fxh
 | |
| 			// Vertically blur the approx bloom
 | |
| 			VertexShader = blurVerticalVS;
 | |
| 			PixelShader = blurVerticalPS;
 | |
| 			
 | |
| 			RenderTarget = texBlurVertical;
 | |
| 		}
 | |
| 		pass blurHorizontalPass
 | |
| 		{
 | |
| 			// blurring.fxh
 | |
| 			// Horizontally blur the approx bloom
 | |
| 			VertexShader = blurHorizontalVS;
 | |
| 			PixelShader = blurHorizontalPS;
 | |
| 			
 | |
| 			RenderTarget = texBlurHorizontal;
 | |
| 		}
 | |
| 		pass deinterlacePass
 | |
| 		{
 | |
| 			// deinterlace.fxh
 | |
| 			// Optionally deinterlace the video if interlacing is enabled.
 | |
| 			//   Can help approximate the original crt-royale's appearance
 | |
| 			//   without some issues like image retention.
 | |
| 			VertexShader = deinterlaceVS;
 | |
| 			PixelShader = deinterlacePS;
 | |
| 			
 | |
| 			RenderTarget = texDeinterlace;
 | |
| 		}
 | |
| 		pass freezeFramePass
 | |
| 		{
 | |
| 			// deinterlace.fxh
 | |
| 			// Capture the current frame, so we can use it in the next
 | |
| 			//   frame's deinterlacing pass.
 | |
| 			VertexShader = freezeFrameVS;
 | |
| 			PixelShader = freezeFramePS;
 | |
| 
 | |
| 			RenderTarget = texFreezeFrame;
 | |
| 
 | |
| 			// Explicitly disable clearing render targets
 | |
| 			//   scanlineBlendPass will not work properly if this ever defaults to true
 | |
| 			ClearRenderTargets = false;
 | |
| 		}
 | |
| 		pass generatePhosphorMask
 | |
| 		{
 | |
| 			// phosphor-mask.fxh
 | |
| 			VertexShader = generatePhosphorMaskVS;
 | |
| 			PixelShader = generatePhosphorMaskPS;
 | |
| 
 | |
| 			RenderTarget = texPhosphorMask;
 | |
| 
 | |
| 			// This lets us improve performance by only computing the mask every k frames
 | |
| 			ClearRenderTargets = false;
 | |
| 			
 | |
| 			PrimitiveTopology = TRIANGLESTRIP;
 | |
| 			VertexCount = 4;
 | |
| 		}
 | |
| 		pass applyPhosphormask
 | |
| 		{
 | |
| 			// phosphor-mask.fxh
 | |
| 			// Tile the scaled phosphor mask and apply it to
 | |
| 			//   the deinterlaced image.
 | |
| 			VertexShader = PostProcessVS;
 | |
| 			PixelShader = applyComputedPhosphorMaskPS;
 | |
| 			
 | |
| 			RenderTarget = texMaskedScanlines;
 | |
| 			// RenderTarget = texGeometry;
 | |
| 		}
 | |
| 		pass brightpassPass
 | |
| 		{
 | |
| 			// brightpass.fxh
 | |
| 			// Apply a brightpass filter for the bloom effect
 | |
| 			VertexShader = brightpassVS;
 | |
| 			PixelShader = brightpassPS;
 | |
| 			
 | |
| 			RenderTarget = texBrightpass;
 | |
| 		}
 | |
| 		pass bloomVerticalPass
 | |
| 		{
 | |
| 			// bloom.fxh
 | |
| 			// Blur vertically for the bloom effect
 | |
| 			VertexShader = bloomVerticalVS;
 | |
| 			PixelShader = bloomVerticalPS;
 | |
| 			
 | |
| 			RenderTarget = texBloomVertical;
 | |
| 		}
 | |
| 		pass bloomHorizontalPass
 | |
| 		{
 | |
| 			// bloom.fxh
 | |
| 			// Blur horizontally for the bloom effect.
 | |
| 			//   Also apply various color changes and effects.
 | |
| 			VertexShader = bloomHorizontalVS;
 | |
| 			PixelShader = bloomHorizontalPS;
 | |
| 			
 | |
| 			RenderTarget = texBloomHorizontal;
 | |
| 		}
 | |
| 		pass geometryPass
 | |
| 		{
 | |
| 			// geometry-aa-last-pass.fxh
 | |
| 			// Apply screen geometry and anti-aliasing.
 | |
| 			VertexShader = geometryVS;
 | |
| 			PixelShader = geometryPS;
 | |
| 
 | |
| 			RenderTarget = texGeometry;
 | |
| 		}
 | |
| 		pass uncropPass
 | |
| 		{
 | |
| 			// content-box.fxh
 | |
| 			// Uncrop the video, so we draw the game's content
 | |
| 			//   in the same position it started in.
 | |
| 			VertexShader = contentUncropVS;
 | |
| 			PixelShader = uncropContentPixelShader;
 | |
| 			
 | |
| 			PrimitiveTopology = TRIANGLESTRIP;
 | |
| 			VertexCount = 4;
 | |
| 		}
 | |
| 	#endif
 | |
| } | 
