2023-09-23 14:39:09 +06:00

307 lines
8.3 KiB
HLSL

////----------//
///**Trails**///
//----------////
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//* Trails
//* For Reshade 3.0
//* --------------------------
//* This work is licensed under a Creative Commons Attribution 3.0 Unported License.
//* So you are free to share, modify and adapt it for your needs, and even use it for commercial use.
//* I would also love to hear about a project you are using it with.
//* https://creativecommons.org/licenses/by/3.0/us/
//*
//* Have fun,
//* Jose Negrete AKA BlueSkyDefender
//*
//* https://github.com/BlueSkyDefender/Depth3D
//* ---------------------------------
//*
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#define Per_Color_Channel 0 // Lets you adjust per Color Channel.Default 0 off
#define Add_Depth_Effects 0 // Lets this effect be affected by Depth..Default 0 off
#if !Per_Color_Channel
uniform float Persistence <
ui_type = "drag";
ui_min = 0.0; ui_max = 1.00;
ui_label = "Persistence";
ui_tooltip = "Increase persistence longer the trail or afterimage.\n"
"If pushed out the effect is alot like long exposure.\n"
"This can be used for light painting in games.\n"
"1000/1 is 1.0, so 1/2 is 0.5 and so forth.\n"
"Default is 0.25, 0 is infinity.";
> = 0.25;
#else
uniform float3 Persistence <
ui_type = "drag";
ui_min = 0.0; ui_max = 1.00;
ui_label = "Persistence";
ui_tooltip = "Increase persistence longer the trail or afterimage RGB.\n"
"If pushed out the effect is alot like long exposure.\n"
"This can be used for light painting in games.\n"
"1000/1 is 1.0, so 1/2 is 0.5 and so forth.\n"
"Default is 0.25, 0 is infinity.";
> = float3(0.25,0.25,0.25);
#endif
uniform float TQ <
ui_type = "drag";
ui_min = 0.0; ui_max = 1.0;
ui_label = "Trail Blur Quality";
ui_tooltip = "Adjust Trail Blur Quality.\n"
"Default is Zero.";
> = 0.0;
//uniform bool TrailsX2 <
// ui_label = "Trails X2";
// ui_tooltip = "Two times the samples.\n"
// "This disables Trail Quality.";
//> = false;
uniform bool PS2 <
ui_label = "PS2 Style Echo";
ui_tooltip = "This enables PS2 Style Echo in your game.\n"
"This disables Trail Quality.";
> = false;
#if Add_Depth_Effects
uniform bool Allow_Depth <
ui_label = "Depth Map Toggle";
ui_tooltip = "This Alows Depth to be used in Trails.";
ui_category = "Depth Buffer";
> = 0;
uniform int Depth_Map <
ui_type = "combo";
ui_items = "Normal\0Reverse\0";
ui_label = "Custom Depth Map";
ui_tooltip = "Pick your Depth Map.";
ui_category = "Depth Buffer";
> = 0;
uniform float Depth_Map_Adjust <
ui_type = "slider";
ui_min = 0.0; ui_max = 1.0;
ui_label = "Depth Map Adjustment";
ui_tooltip = "Adjust the depth map and sharpness distance.";
ui_category = "Depth Buffer";
> = 0.0;
uniform bool Hard_CutOff <
ui_label = "Hard CutOff";
ui_tooltip = "Depth Cutoff toggle this give a hard cutoff for depth isolation.";
ui_category = "Depth Buffer";
> = 0;
uniform bool Depth_Map_Flip <
ui_label = "Depth Map Flip";
ui_tooltip = "Flip the depth map if it is upside down.";
ui_category = "Depth Buffer";
> = 0;
uniform bool Invert_Depth <
ui_label = "Depth Map Inverte";
ui_tooltip = "Inverts Depth so you can target only your weapon or what's near you.";
ui_category = "Depth Buffer";
> = 0;
uniform bool Depth_View <
ui_label = "Depth Map View";
ui_tooltip = "Lets you see Depth so you can Debug.";
ui_category = "Depth Buffer";
> = 0;
#else
static const int Allow_Depth = 0;
static const int Depth_Map = 0;
static const float Depth_Map_Adjust = 250.0;
static const int Depth_Map_Flip = 0;
static const int Invert_Depth = 0;
static const int Depth_View = 0;
static const int Hard_CutOff = 0;
#endif
/////////////////////////////////////////////D3D Starts Here/////////////////////////////////////////////////////////////////
texture DepthBufferTex : DEPTH;
sampler DepthBuffer
{
Texture = DepthBufferTex;
};
texture BackBufferTex : COLOR;
sampler BackBuffer
{
Texture = BackBufferTex;
};
texture CurrentBackBufferT { Width = BUFFER_WIDTH; Height = BUFFER_HEIGHT; Format = RGBA8;};
sampler CBackBuffer
{
Texture = CurrentBackBufferT;
};
texture PBB { Width = BUFFER_WIDTH; Height = BUFFER_HEIGHT; Format = RGBA8; MipLevels = 2;};
sampler PBackBuffer
{
Texture = PBB;
};
texture PSBB { Width = BUFFER_WIDTH; Height = BUFFER_HEIGHT; Format = RGBA8;};
sampler PSBackBuffer
{
Texture = PSBB;
};
///////////////////////////////////////////////////////////TAA/////////////////////////////////////////////////////////////////////
#define pix float2(BUFFER_RCP_WIDTH, BUFFER_RCP_HEIGHT)
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
float Depth(in float2 texcoord : TEXCOORD0)
{
if (Depth_Map_Flip)
texcoord.y = 1 - texcoord.y;
float zBuffer = tex2D(DepthBuffer, texcoord).x; //Depth Buffer
//Conversions to linear space.....
//Near & Far Adjustment
float Far = 1.0, Near = 0.125/250.0; //Division Depth Map Adjust - Near
float2 Z = float2( zBuffer, 1-zBuffer );
if (Depth_Map == 0)//DM0. Normal
zBuffer = Far * Near / (Far + Z.x * (Near - Far));
else if (Depth_Map == 1)//DM1. Reverse
zBuffer = Far * Near / (Far + Z.y * (Near - Far));
return saturate(zBuffer);
}
float3 T_Out(float4 position : SV_Position, float2 texcoord : TEXCOORD) : SV_Target
{
float TQA = TQ, D = Depth(texcoord);
if(PS2)
TQA = 0;
float3 C = tex2D(BackBuffer, texcoord).rgb;
//float3 PS = tex2D(PSBackBuffer, texcoord).rgb;
float3 P = tex2Dlod(PBackBuffer, float4(texcoord,0,TQA)).rgb;
#if !PerColor
float Per = 1-Persistence;
#else
float3 Per = 1-Persistence;
#endif
D = smoothstep(0,Depth_Map_Adjust,D);
if(Hard_CutOff)
D = step(0.5,D);
if(Invert_Depth)
D = 1-D;
if(!PS2)
{
P *= Per;
C = max( tex2D(BackBuffer, texcoord).rgb, P);
//PS = max( tex2D(BackBuffer, texcoord).rgb, P);
}
else
{
C = (1-Per) * C + Per * P;
//PS = (1-Per) * PS + Per * P;
}
//if(TrailsX2)
//{
// C = lerp(PS,C,0.5);
//}
if(Allow_Depth)
C = lerp(C,tex2D(BackBuffer, texcoord).rgb,saturate(D));
if(Depth_View)
C = D;
return C;
}
void Current_BackBuffer_T(float4 position : SV_Position, float2 texcoord : TEXCOORD, out float4 color : SV_Target0)
{
color = tex2D(BackBuffer,texcoord);
}
void Past_BB(float4 position : SV_Position, float2 texcoord : TEXCOORD, out float4 Past : SV_Target0, out float4 PastSingle : SV_Target1)
{ float2 samples[12] = {
float2(-0.326212, -0.405805),
float2(-0.840144, -0.073580),
float2(-0.695914, 0.457137),
float2(-0.203345, 0.620716),
float2(0.962340, -0.194983),
float2(0.473434, -0.480026),
float2(0.519456, 0.767022),
float2(0.185461, -0.893124),
float2(0.507431, 0.064425),
float2(0.896420, 0.412458),
float2(-0.321940, -0.932615),
float2(-0.791559, -0.597705)
};
float4 sum_A = tex2D(BackBuffer,texcoord), sum_B = 0;//tex2D(CBackBuffer,texcoord);
if(!PS2)
{
float Adjust = TQ*pix.x;
[loop]
for (int i = 0; i < 12; i++)
{
sum_A += tex2Dlod(BackBuffer, float4(texcoord + Adjust * samples[i],0,0));
//sum_B += tex2Dlod(CBackBuffer, float4(texcoord + Adjust * samples[i],0,0));
}
Past = sum_A * 0.07692307;
PastSingle = 0;//sum_B * 0.07692307;
}
else
{
Past = sum_A;
PastSingle = 0;//sum_B * 0.07692307;
}
}
///////////////////////////////////////////////////////////ReShade.fxh/////////////////////////////////////////////////////////////
// Vertex shader generating a triangle covering the entire screen
void PostProcessVS(in uint id : SV_VertexID, out float4 position : SV_Position, out float2 texcoord : TEXCOORD)
{
texcoord.x = (id == 2) ? 2.0 : 0.0;
texcoord.y = (id == 1) ? 2.0 : 0.0;
position = float4(texcoord * float2(2.0, -2.0) + float2(-1.0, 1.0), 0.0, 1.0);
}
technique Trails
{
pass CBB
{
VertexShader = PostProcessVS;
PixelShader = Current_BackBuffer_T;
RenderTarget = CurrentBackBufferT;
}
pass Trails
{
VertexShader = PostProcessVS;
PixelShader = T_Out;
}
pass PBB
{
VertexShader = PostProcessVS;
PixelShader = Past_BB;
RenderTarget0 = PBB;
RenderTarget1 = PSBB;
}
}