mirror of https://github.com/stenzek/duckstation
				
				
				
			
			You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
	
	
		
			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
 | 
						|
} |