AmbientLightDither2017 vs AmbientLightDither2020

Created Diff never expires
54 removals
Lines
Total
Removed
Words
Total
Removed
To continue using this feature, upgrade to
Diffchecker logo
Diffchecker Pro
540 lines
40 additions
Lines
Total
Added
Words
Total
Added
To continue using this feature, upgrade to
Diffchecker logo
Diffchecker Pro
525 lines
/**
/**
* Copyright (C) 2015 Ganossa (mediehawk@gmail.com)
* Copyright (C) 2015 Ganossa (mediehawk@gmail.com)
*
*
* Permission is hereby granted, free of charge, to any person obtaining a copy of
* Permission is hereby granted, free of charge, to any person obtaining a copy of
* this software and associated documentation files (the "Software"), to deal in
* this software and associated documentation files (the "Software"), to deal in
* the Software with restriction, including without limitation the rights to
* the Software with restriction, including without limitation the rights to
* use and/or sell copies of the Software, and to permit persons to whom the Software
* use and/or sell copies of the Software, and to permit persons to whom the Software
* is furnished to do so, subject to the following conditions:
* is furnished to do so, subject to the following conditions:
*
*
* The above copyright notice and the permission notices (this and below) shall
* The above copyright notice and the permission notices (this and below) shall
* be included in all copies or substantial portions of the Software.
* be included in all copies or substantial portions of the Software.
*
*
* Permission needs to be specifically granted by the author of the software to any
* Permission needs to be specifically granted by the author of the software to any
* person obtaining a copy of this software and associated documentation files
* person obtaining a copy of this software and associated documentation files
* (the "Software"), to deal in the Software without restriction, including without
* (the "Software"), to deal in the Software without restriction, including without
* limitation the rights to copy, modify, merge, publish, distribute, and/or
* limitation the rights to copy, modify, merge, publish, distribute, and/or
* sublicense the Software, and subject to the following conditions:
* sublicense the Software, and subject to the following conditions:
*
*
* The above copyright notice and the permission notices (this and above) shall
* The above copyright notice and the permission notices (this and above) shall
* be included in all copies or substantial portions of the Software.
* be included in all copies or substantial portions of the Software.
*
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
* SOFTWARE.
*/
*/


/**
/**
* This version of AmbientLight.fx has been modified to allow the "dither" effect
* This version of AmbientLight.fx has been modified to allow the "dither" effect
* to be toggled on and off.
* to be toggled on and off.
*/
*/
#include "ReShadeUI.fxh"


uniform bool alDebug <
uniform bool alDebug <
ui_tooltip = "Activates debug mode of AL, upper bar shows detected light, lower bar shows adaptation";
ui_tooltip = "Activates debug mode of AL, upper bar shows detected light, lower bar shows adaptation";
> = false;
> = false;
uniform float alInt <
uniform float alInt < __UNIFORM_SLIDER_FLOAT1
ui_type = "drag";
ui_min = 0.0; ui_max = 20.0;
ui_min = 0.0; ui_max = 20.0;
ui_tooltip = "Base intensity of AL";
ui_tooltip = "Base intensity of AL";
> = 10.15;
> = 10.15;
uniform float alThreshold <
uniform float alThreshold < __UNIFORM_SLIDER_FLOAT1
ui_type = "drag";
ui_min = 0.0; ui_max = 100.0;
ui_min = 0.0; ui_max = 100.0;
ui_tooltip = "Reduces intensity for not bright light";
ui_tooltip = "Reduces intensity for not bright light";
> = 15.00;
> = 15.00;
uniform bool AL_Dither <
uniform bool AL_Dither <
ui_tooltip = "Applies dither - may cause diagonal stripes";
ui_tooltip = "Applies dither - may cause diagonal stripes";
> = true;
> = true;


uniform bool AL_Adaptation <
uniform bool AL_Adaptation <
ui_tooltip = "Activates adaptation algorithm";
ui_tooltip = "Activates adaptation algorithm";
> = true;
> = true;
uniform float alAdapt <
uniform float alAdapt < __UNIFORM_SLIDER_FLOAT1
ui_type = "drag";
ui_min = 0.0; ui_max = 4.0;
ui_min = 0.0; ui_max = 4.0;
ui_tooltip = "Intensity of AL correction for bright light";
ui_tooltip = "Intensity of AL correction for bright light";
> = 0.70;
> = 0.70;
uniform float alAdaptBaseMult <
uniform float alAdaptBaseMult < __UNIFORM_SLIDER_FLOAT1
ui_type = "drag";
ui_min = 0.0; ui_max = 4.0;
ui_min = 0.0; ui_max = 4.0;
ui_tooltip = "Multiplier for adaption applied to the original image";
ui_tooltip = "Multiplier for adaption applied to the original image";
> = 1.00;
> = 1.00;
uniform int alAdaptBaseBlackLvL <
uniform int alAdaptBaseBlackLvL < __UNIFORM_SLIDER_INT1
ui_type = "drag";
ui_min = 0; ui_max = 4;
ui_min = 0; ui_max = 4;
ui_tooltip = "Distinction level of black and white (lower => less distinct)";
ui_tooltip = "Distinction level of black and white (lower => less distinct)";
> = 2;
> = 2;


uniform bool AL_Dirt <
uniform bool AL_Dirt <
> = true;
> = true;
uniform bool AL_DirtTex <
uniform bool AL_DirtTex <
ui_tooltip = "Defines if dirt texture is used as overlay";
ui_tooltip = "Defines if dirt texture is used as overlay";
> = false;
> = false;
uniform bool AL_Vibrance <
uniform bool AL_Vibrance <
ui_tooltip = "Vibrance of dirt effect";
ui_tooltip = "Vibrance of dirt effect";
> = false;
> = false;
uniform int AL_Adaptive <
uniform int AL_Adaptive <
ui_type = "combo";
ui_type = "combo";
ui_min = 0; ui_max = 2;
ui_min = 0; ui_max = 2;
ui_items = "Warm\0Cold\0Light Dependent\0";
ui_items = "Warm\0Cold\0Light Dependent\0";
> = 0;
> = 0;
uniform float alDirtInt <
uniform float alDirtInt < __UNIFORM_SLIDER_FLOAT1
ui_type = "drag";
ui_min = 0.0; ui_max = 2.0;
ui_min = 0.0; ui_max = 2.0;
ui_tooltip = "Intensity of dirt effect";
ui_tooltip = "Intensity of dirt effect";
> = 1.0;
> = 1.0;
uniform float alDirtOVInt <
uniform float alDirtOVInt < __UNIFORM_SLIDER_FLOAT1
ui_type = "drag";
ui_min = 0.0; ui_max = 2.0;
ui_min = 0.0; ui_max = 2.0;
ui_tooltip = "Intensity of colored dirt effect";
ui_tooltip = "Intensity of colored dirt effect";
> = 1.0;
> = 1.0;
uniform bool AL_Lens <
uniform bool AL_Lens <
ui_tooltip = "Lens effect based on AL";
ui_tooltip = "Lens effect based on AL";
> = false;
> = false;
uniform float alLensThresh <
uniform float alLensThresh < __UNIFORM_SLIDER_FLOAT1
ui_type = "drag";
ui_min = 0.0; ui_max = 1.0;
ui_min = 0.0; ui_max = 1.0;
ui_tooltip = "Reduces intensity of lens effect for not bright light";
ui_tooltip = "Reduces intensity of lens effect for not bright light";
> = 0.5;
> = 0.5;
uniform float alLensInt <
uniform float alLensInt < __UNIFORM_SLIDER_FLOAT1
ui_type = "drag";
ui_min = 0.0; ui_max = 10.0;
ui_min = 0.0; ui_max = 10.0;
ui_tooltip = "Intensity of lens effect";
ui_tooltip = "Intensity of lens effect";
> = 2.0;
> = 2.0;


#include "ReShade.fxh"
#include "ReShade.fxh"


uniform float2 AL_t < source = "pingpong"; min = 0.0f; max = 6.28f; step = float2(0.1f, 0.2f); >;
uniform float2 AL_t < source = "pingpong"; min = 0.0f; max = 6.28f; step = float2(0.1f, 0.2f); >;


#define GEMFX_PIXEL_SIZE float2(1.0f / (BUFFER_WIDTH / 16.0f), 1.0f / (BUFFER_HEIGHT / 16.0f))
#define GEMFX_PIXEL_SIZE float2(1.0f / (BUFFER_WIDTH / 16.0f), 1.0f / (BUFFER_HEIGHT / 16.0f))


texture alInTex { Width = BUFFER_WIDTH / 16; Height = BUFFER_HEIGHT / 16; Format = RGBA32F; };
texture alInTex { Width = BUFFER_WIDTH / 16; Height = BUFFER_HEIGHT / 16; Format = RGBA32F; };
texture alOutTex { Width = BUFFER_WIDTH / 16; Height = BUFFER_HEIGHT / 16; Format = RGBA32F; };
texture alOutTex { Width = BUFFER_WIDTH / 16; Height = BUFFER_HEIGHT / 16; Format = RGBA32F; };
texture detectIntTex { Width = 32; Height = 32; Format = RGBA8; };
texture detectIntTex { Width = 32; Height = 32; Format = RGBA8; };
sampler detectIntColor { Texture = detectIntTex; };
sampler detectIntColor { Texture = detectIntTex; };
texture detectLowTex { Width = 1; Height = 1; Format = RGBA8; };
texture detectLowTex { Width = 1; Height = 1; Format = RGBA8; };
sampler detectLowColor { Texture = detectLowTex; };
sampler detectLowColor { Texture = detectLowTex; };


texture dirtTex < source = "Dirt.png"; > { Width = 1920; Height = 1080; MipLevels = 1; Format = RGBA8; };
texture dirtTex < source = "Dirt.png"; > { Width = 1920; Height = 1080; MipLevels = 1; Format = RGBA8; };
texture dirtOVRTex < source = "DirtOVR.png"; > { Width = 1920; Height = 1080; MipLevels = 1; Format = RGBA8; };
texture dirtOVRTex < source = "DirtOVR.png"; > { Width = 1920; Height = 1080; MipLevels = 1; Format = RGBA8; };
texture dirtOVBTex < source = "DirtOVB.png"; > { Width = 1920; Height = 1080; MipLevels = 1; Format = RGBA8; };
texture dirtOVBTex < source = "DirtOVB.png"; > { Width = 1920; Height = 1080; MipLevels = 1; Format = RGBA8; };
texture lensDBTex < source = "LensDB.png"; > { Width = 1920; Height = 1080; MipLevels = 1; Format = RGBA8; };
texture lensDBTex < source = "LensDB.png"; > { Width = 1920; Height = 1080; MipLevels = 1; Format = RGBA8; };
texture lensDB2Tex < source = "LensDB2.png"; > { Width = 1920; Height = 1080; MipLevels = 1; Format = RGBA8; };
texture lensDB2Tex < source = "LensDB2.png"; > { Width = 1920; Height = 1080; MipLevels = 1; Format = RGBA8; };
texture lensDOVTex < source = "LensDOV.png"; > { Width = 1920; Height = 1080; MipLevels = 1; Format = RGBA8; };
texture lensDOVTex < source = "LensDOV.png"; > { Width = 1920; Height = 1080; MipLevels = 1; Format = RGBA8; };
texture lensDUVTex < source = "LensDUV.png"; > { Width = 1920; Height = 1080; MipLevels = 1; Format = RGBA8; };
texture lensDUVTex < source = "LensDUV.png"; > { Width = 1920; Height = 1080; MipLevels = 1; Format = RGBA8; };


sampler alInColor { Texture = alInTex; };
sampler alInColor { Texture = alInTex; };
sampler alOutColor { Texture = alOutTex; };
sampler alOutColor { Texture = alOutTex; };
sampler dirtSampler { Texture = dirtTex; };
sampler dirtSampler { Texture = dirtTex; };
sampler dirtOVRSampler { Texture = dirtOVRTex; };
sampler dirtOVRSampler { Texture = dirtOVRTex; };
sampler dirtOVBSampler { Texture = dirtOVBTex; };
sampler dirtOVBSampler { Texture = dirtOVBTex; };
sampler lensDBSampler { Texture = lensDBTex; };
sampler lensDBSampler { Texture = lensDBTex; };
sampler lensDB2Sampler { Texture = lensDB2Tex; };
sampler lensDB2Sampler { Texture = lensDB2Tex; };
sampler lensDOVSampler { Texture = lensDOVTex; };
sampler lensDOVSampler { Texture = lensDOVTex; };
sampler lensDUVSampler { Texture = lensDUVTex; };
sampler lensDUVSampler { Texture = lensDUVTex; };


void PS_AL_DetectInt(float4 vpos : SV_Position, float2 texcoord : TEXCOORD, out float4 detectInt : SV_Target0)
void PS_AL_DetectInt(float4 vpos : SV_Position, float2 texcoord : TEXCOORD, out float4 detectInt : SV_Target0)
{
{
detectInt = tex2D(ReShade::BackBuffer, texcoord);
detectInt = tex2D(ReShade::BackBuffer, texcoord);
}
}

void PS_AL_DetectLow(float4 vpos : SV_Position, float2 texcoord : TEXCOORD, out float4 detectLow : SV_Target0)
void PS_AL_DetectLow(float4 vpos : SV_Position, float2 texcoord : TEXCOORD, out float4 detectLow : SV_Target0)
{
{
detectLow = 0;
detectLow = 0;


if (texcoord.x != 0.5 && texcoord.y != 0.5)
if (texcoord.x != 0.5 && texcoord.y != 0.5)
discard;
discard;


[loop]
[loop]
for (float i = 0.0; i <= 1; i += 0.03125)
for (float i = 0.0; i <= 1; i += 0.03125)
{
{
[unroll]
[unroll]
for (float j = 0.0; j <= 1; j += 0.03125)
for (float j = 0.0; j <= 1; j += 0.03125)
{
{
detectLow.xyz += tex2D(detectIntColor, float2(i, j)).xyz;
detectLow.xyz += tex2D(detectIntColor, float2(i, j)).xyz;
}
}
}
}


detectLow.xyz /= 32 * 32;
detectLow.xyz /= 32 * 32;
}
}

void PS_AL_DetectHigh(float4 vpos : SV_Position, float2 texcoord : TEXCOORD, out float4 x : SV_Target)
void PS_AL_DetectHigh(float4 vpos : SV_Position, float2 texcoord : TEXCOORD, out float4 x : SV_Target)
{
{
x = tex2D(ReShade::BackBuffer, texcoord);
x = tex2D(ReShade::BackBuffer, texcoord);
x = float4(x.rgb * pow(abs(max(x.r, max(x.g, x.b))), 2.0), 1.0f);
x = float4(x.rgb * pow(abs(max(x.r, max(x.g, x.b))), 2.0), 1.0f);


float base = (x.r + x.g + x.b); base /= 3;
float base = (x.r + x.g + x.b); base /= 3;
float nR = (x.r * 2) - base;
float nR = (x.r * 2) - base;
float nG = (x.g * 2) - base;
float nG = (x.g * 2) - base;
float nB = (x.b * 2) - base;
float nB = (x.b * 2) - base;


[flatten]
[flatten]
if (nR < 0)
if (nR < 0)
{
{
nG += nR / 2;
nG += nR / 2;
nB += nR / 2;
nB += nR / 2;
nR = 0;
nR = 0;
}
}
[flatten]
[flatten]
if (nG < 0)
if (nG < 0)
{
{
nB += nG / 2;
nB += nG / 2;
[flatten] if (nR > -nG / 2) nR += nG / 2; else nR = 0;
[flatten] if (nR > -nG / 2) nR += nG / 2; else nR = 0;
nG = 0;
nG = 0;
}
}
[flatten]
[flatten]
if (nB < 0)
if (nB < 0)
{
{
[flatten] if (nR > -nB / 2) nR += nB / 2; else nR = 0;
[flatten] if (nR > -nB / 2) nR += nB / 2; else nR = 0;
[flatten] if (nG > -nB / 2) nG += nB / 2; else nG = 0;
[flatten] if (nG > -nB / 2) nG += nB / 2; else nG = 0;
nB = 0;
nB = 0;
}
}


[flatten]
[flatten]
if (nR > 1)
if (nR > 1)
{
{
nG += (nR - 1) / 2;
nG += (nR - 1) / 2;
nB += (nR - 1) / 2;
nB += (nR - 1) / 2;
nR = 1;
nR = 1;
}
}
[flatten]
[flatten]
if (nG > 1)
if (nG > 1)
{
{
nB += (nG - 1) / 2;
nB += (nG - 1) / 2;
[flatten] if (nR + (nG - 1) < 1) nR += (nG - 1) / 2; else nR = 1;
[flatten] if (nR + (nG - 1) < 1) nR += (nG - 1) / 2; else nR = 1;
nG = 1;
nG = 1;
}
}
[flatten]
[flatten]
if (nB > 1)
if (nB > 1)
{
{
[flatten] if (nR + (nB - 1) < 1) nR += (nB - 1) / 2; else nR = 1;
[flatten] if (nR + (nB - 1) < 1) nR += (nB - 1) / 2; else nR = 1;
[flatten] if (nG + (nB - 1) < 1) nG += (nB - 1) / 2; else nG = 1;
[flatten] if (nG + (nB - 1) < 1) nG += (nB - 1) / 2; else nG = 1;
nB = 1;
nB = 1;
}
}


x.r = nR; x.g = nG; x.b = nB;
x.r = nR; x.g = nG; x.b = nB;
}
}


void PS_AL_HGB(float4 vpos : SV_Position, float2 texcoord : TEXCOORD, out float4 hgb : SV_Target)
void PS_AL_HGB(float4 vpos : SV_Position, float2 texcoord : TEXCOORD, out float4 hgb : SV_Target)
{
{
const float sampleOffsets[5] = { 0.0, 2.4347826, 4.3478260, 6.2608695, 8.1739130 };
const float sampleOffsets[5] = { 0.0, 2.4347826, 4.3478260, 6.2608695, 8.1739130 };
const float sampleWeights[5] = { 0.16818994, 0.27276957, 0.111690125, 0.024067905, 0.0021112196 };
const float sampleWeights[5] = { 0.16818994, 0.27276957, 0.111690125, 0.024067905, 0.0021112196 };


hgb = tex2D(alInColor, texcoord) * sampleWeights[0];
hgb = tex2D(alInColor, texcoord) * sampleWeights[0];
hgb = float4(max(hgb.rgb - alThreshold, 0.0), hgb.a);
hgb = float4(max(hgb.rgb - alThreshold, 0.0), hgb.a);
float step = 1.08 + (AL_t.x / 100) * 0.02;
float stepMult = 1.08 + (AL_t.x / 100) * 0.02;


[flatten]
[flatten]
if ((texcoord.x + sampleOffsets[1] * GEMFX_PIXEL_SIZE.x) < 1.05)
if ((texcoord.x + sampleOffsets[1] * GEMFX_PIXEL_SIZE.x) < 1.05)
hgb += tex2D(alInColor, texcoord + float2(sampleOffsets[1] * GEMFX_PIXEL_SIZE.x, 0.0)) * sampleWeights[1] * step;
hgb += tex2D(alInColor, texcoord + float2(sampleOffsets[1] * GEMFX_PIXEL_SIZE.x, 0.0)) * sampleWeights[1] * stepMult;
[flatten]
[flatten]
if ((texcoord.x - sampleOffsets[1] * GEMFX_PIXEL_SIZE.x) > -0.05)
if ((texcoord.x - sampleOffsets[1] * GEMFX_PIXEL_SIZE.x) > -0.05)
hgb += tex2D(alInColor, texcoord - float2(sampleOffsets[1] * GEMFX_PIXEL_SIZE.x, 0.0)) * sampleWeights[1] * step;
hgb += tex2D(alInColor, texcoord - float2(sampleOffsets[1] * GEMFX_PIXEL_SIZE.x, 0.0)) * sampleWeights[1] * stepMult;


[flatten]
[flatten]
if ((texcoord.x + sampleOffsets[2] * GEMFX_PIXEL_SIZE.x) < 1.05)
if ((texcoord.x + sampleOffsets[2] * GEMFX_PIXEL_SIZE.x) < 1.05)
hgb += tex2D(alInColor, texcoord + float2(sampleOffsets[2] * GEMFX_PIXEL_SIZE.x, 0.0)) * sampleWeights[2] * step;
hgb += tex2D(alInColor, texcoord + float2(sampleOffsets[2] * GEMFX_PIXEL_SIZE.x, 0.0)) * sampleWeights[2] * stepMult;
[flatten]
[flatten]
if ((texcoord.x - sampleOffsets[2] * GEMFX_PIXEL_SIZE.x) > -0.05)
if ((texcoord.x - sampleOffsets[2] * GEMFX_PIXEL_SIZE.x) > -0.05)
hgb += tex2D(alInColor, texcoord - float2(sampleOffsets[2] * GEMFX_PIXEL_SIZE.x, 0.0)) * sampleWeights[2] * step;
hgb += tex2D(alInColor, texcoord - float2(sampleOffsets[2] * GEMFX_PIXEL_SIZE.x, 0.0)) * sampleWeights[2] * stepMult;


[flatten]
[flatten]
if ((texcoord.x + sampleOffsets[3] * GEMFX_PIXEL_SIZE.x) < 1.05)
if ((texcoord.x + sampleOffsets[3] * GEMFX_PIXEL_SIZE.x) < 1.05)
hgb += tex2D(alInColor, texcoord + float2(sampleOffsets[3] * GEMFX_PIXEL_SIZE.x, 0.0)) * sampleWeights[3] * step;
hgb += tex2D(alInColor, texcoord + float2(sampleOffsets[3] * GEMFX_PIXEL_SIZE.x, 0.0)) * sampleWeights[3] * stepMult;
[flatten]
[flatten]
if ((texcoord.x - sampleOffsets[3] * GEMFX_PIXEL_SIZE.x) > -0.05)
if ((texcoord.x - sampleOffsets[3] * GEMFX_PIXEL_SIZE.x) > -0.05)
hgb += tex2D(alInColor, texcoord - float2(sampleOffsets[3] * GEMFX_PIXEL_SIZE.x, 0.0)) * sampleWeights[3] * step;
hgb += tex2D(alInColor, texcoord - float2(sampleOffsets[3] * GEMFX_PIXEL_SIZE.x, 0.0)) * sampleWeights[3] * stepMult;


[flatten]
[flatten]
if ((texcoord.x + sampleOffsets[4] * GEMFX_PIXEL_SIZE.x) < 1.05)
if ((texcoord.x + sampleOffsets[4] * GEMFX_PIXEL_SIZE.x) < 1.05)
hgb += tex2D(alInColor, texcoord + float2(sampleOffsets[4] * GEMFX_PIXEL_SIZE.x, 0.0)) * sampleWeights[4] * step;
hgb += tex2D(alInColor, texcoord + float2(sampleOffsets[4] * GEMFX_PIXEL_SIZE.x, 0.0)) * sampleWeights[4] * stepMult;
[flatten]
[flatten]
if ((texcoord.x - sampleOffsets[4] * GEMFX_PIXEL_SIZE.x) > -0.05)
if ((texcoord.x - sampleOffsets[4] * GEMFX_PIXEL_SIZE.x) > -0.05)
hgb += tex2D(alInColor, texcoord - float2(sampleOffsets[4] * GEMFX_PIXEL_SIZE.x, 0.0)) * sampleWeights[4] * step;
hgb += tex2D(alInColor, texcoord - float2(sampleOffsets[4] * GEMFX_PIXEL_SIZE.x, 0.0)) * sampleWeights[4] * stepMult;
}
}

void PS_AL_VGB(float4 vpos : SV_Position, float2 texcoord : TEXCOORD, out float4 vgb : SV_Target)
void PS_AL_VGB(float4 vpos : SV_Position, float2 texcoord : TEXCOORD, out float4 vgb : SV_Target)
{
{
const float sampleOffsets[5] = { 0.0, 2.4347826, 4.3478260, 6.2608695, 8.1739130 };
const float sampleOffsets[5] = { 0.0, 2.4347826, 4.3478260, 6.2608695, 8.1739130 };
const float sampleWeights[5] = { 0.16818994, 0.27276957, 0.111690125, 0.024067905, 0.0021112196 };
const float sampleWeights[5] = { 0.16818994, 0.27276957, 0.111690125, 0.024067905, 0.0021112196 };


vgb = tex2D(alOutColor, texcoord) * sampleWeights[0];
vgb = tex2D(alOutColor, texcoord) * sampleWeights[0];
vgb = float4(max(vgb.rgb - alThreshold, 0.0), vgb.a);
vgb = float4(max(vgb.rgb - alThreshold, 0.0), vgb.a);
float step = 1.08 + (AL_t.x / 100) * 0.02;
float stepMult = 1.08 + (AL_t.x / 100) * 0.02;
[flatten]
[flatten]
if ((texcoord.y + sampleOffsets[1] * GEMFX_PIXEL_SIZE.y) < 1.05)
if ((texcoord.y + sampleOffsets[1] * GEMFX_PIXEL_SIZE.y) < 1.05)
vgb += tex2D(alOutColor, texcoord + float2(0.0, sampleOffsets[1] * GEMFX_PIXEL_SIZE.y)) * sampleWeights[1] * step;
vgb += tex2D(alOutColor, texcoord + float2(0.0, sampleOffsets[1] * GEMFX_PIXEL_SIZE.y)) * sampleWeights[1] * stepMult;
[flatten]
[flatten]
if ((texcoord.y - sampleOffsets[1] * GEMFX_PIXEL_SIZE.y) > -0.05)
if ((texcoord.y - sampleOffsets[1] * GEMFX_PIXEL_SIZE.y) > -0.05)
vgb += tex2D(alOutColor, texcoord - float2(0.0, sampleOffsets[1] * GEMFX_PIXEL_SIZE.y)) * sampleWeights[1] * step;
vgb += tex2D(alOutColor, texcoord - float2(0.0, sampleOffsets[1] * GEMFX_PIXEL_SIZE.y)) * sampleWeights[1] * stepMult;
[flatten]
[flatten]
if ((texcoord.y + sampleOffsets[2] * GEMFX_PIXEL_SIZE.y) < 1.05)
if ((texcoord.y + sampleOffsets[2] * GEMFX_PIXEL_SIZE.y) < 1.05)
vgb += tex2D(alOutColor, texcoord + float2(0.0, sampleOffsets[2] * GEMFX_PIXEL_SIZE.y)) * sampleWeights[2] * step;
vgb += tex2D(alOutColor, texcoord + float2(0.0, sampleOffsets[2] * GEMFX_PIXEL_SIZE.y)) * sampleWeights[2] * stepMult;
[flatten]
[flatten]
if ((texcoord.y - sampleOffsets[2] * GEMFX_PIXEL_SIZE.y) > -0.05)
if ((texcoord.y - sampleOffsets[2] * GEMFX_PIXEL_SIZE.y) > -0.05)
vgb += tex2D(alOutColor, texcoord - float2(0.0, sampleOffsets[2] * GEMFX_PIXEL_SIZE.y)) * sampleWeights[2] * step;
vgb += tex2D(alOutColor, texcoord - float2(0.0, sampleOffsets[2] * GEMFX_PIXEL_SIZE.y)) * sampleWeights[2] * stepMult;


[flatten]
[flatten]
if ((texcoord.y + sampleOffsets[3] * GEMFX_PIXEL_SIZE.y) < 1.05)
if ((texcoord.y + sampleOffsets[3] * GEMFX_PIXEL_SIZE.y) < 1.05)
vgb += tex2D(alOutColor, texcoord + float2(0.0, sampleOffsets[3] * GEMFX_PIXEL_SIZE.y)) * sampleWeights[3] * step;
vgb += tex2D(alOutColor, texcoord + float2(0.0, sampleOffsets[3] * GEMFX_PIXEL_SIZE.y)) * sampleWeights[3] * stepMult;
[flatten]
[flatten]
if ((texcoord.y - sampleOffsets[3] * GEMFX_PIXEL_SIZE.y) > -0.05)
if ((texcoord.y - sampleOffsets[3] * GEMFX_PIXEL_SIZE.y) > -0.05)
vgb += tex2D(alOutColor, texcoord - float2(0.0, sampleOffsets[3] * GEMFX_PIXEL_SIZE.y)) * sampleWeights[3] * step;
vgb += tex2D(alOutColor, texcoord - float2(0.0, sampleOffsets[3] * GEMFX_PIXEL_SIZE.y)) * sampleWeights[3] * stepMult;


[flatten]
[flatten]
if ((texcoord.y + sampleOffsets[4] * GEMFX_PIXEL_SIZE.y) < 1.05)
if ((texcoord.y + sampleOffsets[4] * GEMFX_PIXEL_SIZE.y) < 1.05)
vgb += tex2D(alOutColor, texcoord + float2(0.0, sampleOffsets[4] * GEMFX_PIXEL_SIZE.y)) * sampleWeights[4] * step;
vgb += tex2D(alOutColor, texcoord + float2(0.0, sampleOffsets[4] * GEMFX_PIXEL_SIZE.y)) * sampleWeights[4] * stepMult;
[flatten]
[flatten]
if ((texcoord.y - sampleOffsets[4] * GEMFX_PIXEL_SIZE.y) > -0.05)
if ((texcoord.y - sampleOffsets[4] * GEMFX_PIXEL_SIZE.y) > -0.05)
vgb += tex2D(alOutColor, texcoord - float2(0.0, sampleOffsets[4] * GEMFX_PIXEL_SIZE.y)) * sampleWeights[4] * step;
vgb += tex2D(alOutColor, texcoord - float2(0.0, sampleOffsets[4] * GEMFX_PIXEL_SIZE.y)) * sampleWeights[4] * stepMult;
}
}


float4 PS_AL_Magic(float4 vpos : SV_Position, float2 texcoord : TEXCOORD) : SV_Target
float4 PS_AL_Magic(float4 vpos : SV_Position, float2 texcoord : TEXCOORD) : SV_Target
{
{
float4 base = tex2D(ReShade::BackBuffer, texcoord);
float4 base = tex2D(ReShade::BackBuffer, texcoord);
float4 high = tex2D(alInColor, texcoord);
float4 high = tex2D(alInColor, texcoord);
float adapt = 0;
float adapt = 0;


#if __RENDERER__ < 0xa000 && !__RESHADE_PERFORMANCE_MODE__
#if __RENDERER__ < 0xa000 && !__RESHADE_PERFORMANCE_MODE__
[flatten]
[flatten]
#endif
#endif

if (AL_Adaptation)
if (AL_Adaptation)
{
{
//DetectLow
//DetectLow
float4 detectLow = tex2D(detectLowColor, 0.5) / 4.215;
float4 detectLow = tex2D(detectLowColor, 0.5) / 4.215;
float low = sqrt(0.241 * detectLow.r * detectLow.r + 0.691 * detectLow.g * detectLow.g + 0.068 * detectLow.b * detectLow.b);
float low = sqrt(0.241 * detectLow.r * detectLow.r + 0.691 * detectLow.g * detectLow.g + 0.068 * detectLow.b * detectLow.b);
//.DetectLow
//.DetectLow


low = pow(low * 1.25f, 2);
low = pow(low * 1.25f, 2);
adapt = low * (low + 1.0f) * alAdapt * alInt * 5.0f;
adapt = low * (low + 1.0f) * alAdapt * alInt * 5.0f;


if (alDebug)
if (alDebug)
{
{
float mod = (texcoord.x * 1000.0f) % 1.001f;
float mod = (texcoord.x * 1000.0f) % 1.001f;
//mod = abs(mod - texcoord.x / 4.0f);
//mod = abs(mod - texcoord.x / 4.0f);


if (texcoord.y < 0.01f && (texcoord.x < low * 10f && mod < 0.3f))
if (texcoord.y < 0.01f && (texcoord.x < low * 10f && mod < 0.3f))
return float4(1f, 0.5f, 0.3f, 0f);
return float4(1f, 0.5f, 0.3f, 0f);


if (texcoord.y > 0.01f && texcoord.y < 0.02f && (texcoord.x < adapt / (alInt * 1.5) && mod < 0.3f))
if (texcoord.y > 0.01f && texcoord.y < 0.02f && (texcoord.x < adapt / (alInt * 1.5) && mod < 0.3f))
return float4(0.2f, 1f, 0.5f, 0f);
return float4(0.2f, 1f, 0.5f, 0f);
}
}
}
}


high = min(0.0325f, high) * 1.15f;
high = min(0.0325f, high) * 1.15f;
float4 highOrig = high;
float4 highOrig = high;


float2 flipcoord = 1.0f - texcoord;
float2 flipcoord = 1.0f - texcoord;
float4 highFlipOrig = tex2D(alInColor, flipcoord);
float4 highFlipOrig = tex2D(alInColor, flipcoord);
highFlipOrig = min(0.03f, highFlipOrig) * 1.15f;
highFlipOrig = min(0.03f, highFlipOrig) * 1.15f;


float4 highFlip = highFlipOrig;
float4 highFlip = highFlipOrig;
float4 highLensSrc = high;
float4 highLensSrc = high;


#if __RENDERER__ < 0xa000 && !__RESHADE_PERFORMANCE_MODE__
#if __RENDERER__ < 0xa000 && !__RESHADE_PERFORMANCE_MODE__
[flatten]
[flatten]
#endif
#endif

if (AL_Dirt)
if (AL_Dirt)
{
{
float4 dirt = tex2D(dirtSampler, texcoord);
float4 dirt = tex2D(dirtSampler, texcoord);
float4 dirtOVR = tex2D(dirtOVRSampler, texcoord);
float4 dirtOVR = tex2D(dirtOVRSampler, texcoord);
float4 dirtOVB = tex2D(dirtOVBSampler, texcoord);
float4 dirtOVB = tex2D(dirtOVBSampler, texcoord);


float maxhigh = max(high.r, max(high.g, high.b));
float maxhigh = max(high.r, max(high.g, high.b));
float threshDiff = maxhigh - 3.2f;
float threshDiff = maxhigh - 3.2f;


[flatten]
[flatten]
if (threshDiff > 0)
if (threshDiff > 0)
{
{
high.r = (high.r / maxhigh) * 3.2f;
high.r = (high.r / maxhigh) * 3.2f;
high.g = (high.g / maxhigh) * 3.2f;
high.g = (high.g / maxhigh) * 3.2f;
high.b = (high.b / maxhigh) * 3.2f;
high.b = (high.b / maxhigh) * 3.2f;
}
}


float4 highDirt = AL_DirtTex ? highOrig * dirt * alDirtInt : highOrig * high * alDirtInt;
float4 highDirt = AL_DirtTex ? highOrig * dirt * alDirtInt : highOrig * high * alDirtInt;


if (AL_Vibrance)
if (AL_Vibrance)
{
{
highDirt *= 1.0f + 0.5f * sin(AL_t.x);
highDirt *= 1.0f + 0.5f * sin(AL_t.x);
}
}


float highMix = highOrig.r + highOrig.g + highOrig.b;
float highMix = highOrig.r + highOrig.g + highOrig.b;
float red = highOrig.r / highMix;
float red = highOrig.r / highMix;
float green = highOrig.g / highMix;
float green = highOrig.g / highMix;
float blue = highOrig.b / highMix;
float blue = highOrig.b / highMix;
highOrig = highOrig + highDirt;
highOrig = highOrig + highDirt;


if (AL_Adaptive == 2)
if (AL_Adaptive == 2)
{
{
high = high + high * dirtOVR * alDirtOVInt * green;
high = high + high * dirtOVR * alDirtOVInt * green;
high = high + highDirt;
high = high + highDirt;
high = high + highOrig * dirtOVB * alDirtOVInt * blue;
high = high + highOrig * dirtOVB * alDirtOVInt * blue;
high = high + highOrig * dirtOVR * alDirtOVInt* red;
high = high + highOrig * dirtOVR * alDirtOVInt* red;
}
}
else if (AL_Adaptive == 1)
else if (AL_Adaptive == 1)
{
{
high = high + highDirt;
high = high + highDirt;
high = high + highOrig * dirtOVB * alDirtOVInt;
high = high + highOrig * dirtOVB * alDirtOVInt;
}
}
else
else
{
{
high = high + highDirt;
high = high + highDirt;
high = high + highOrig * dirtOVR * alDirtOVInt;
high = high + highOrig * dirtOVR * alDirtOVInt;
}
}


highLensSrc = high * 85f * pow(1.25f - (abs(texcoord.x - 0.5f) + abs(texcoord.y - 0.5f)), 2);
highLensSrc = high * 85f * pow(1.25f - (abs(texcoord.x - 0.5f) + abs(texcoord.y - 0.5f)), 2);
}
}


float origBright = max(highLensSrc.r, max(highLensSrc.g, highLensSrc.b));
float origBright = max(highLensSrc.r, max(highLensSrc.g, highLensSrc.b));
float maxOrig = max((1.8f * alLensThresh) - pow(origBright * (0.5f - abs(texcoord.x - 0.5f)), 4), 0.0f);
float maxOrig = max((1.8f * alLensThresh) - pow(origBright * (0.5f - abs(texcoord.x - 0.5f)), 4), 0.0f);
float smartWeight = maxOrig * max(abs(flipcoord.x - 0.5f), 0.3f * abs(flipcoord.y - 0.5f)) * (2.2 - 1.2 * (abs(flipcoord.x - 0.5f))) * alLensInt;
float smartWeight = maxOrig * max(abs(flipcoord.x - 0.5f), 0.3f * abs(flipcoord.y - 0.5f)) * (2.2 - 1.2 * (abs(flipcoord.x - 0.5f))) * alLensInt;
smartWeight = min(0.85f, max(0, AL_Adaptation ? smartWeight - adapt : smartWeight));
smartWeight = min(0.85f, max(0, AL_Adaptation ? smartWeight - adapt : smartWeight));


#if __RENDERER__ < 0xa000 && !__RESHADE_PERFORMANCE_MODE__
#if __RENDERER__ < 0xa000 && !__RESHADE_PERFORMANCE_MODE__
[flatten]
[flatten]
#endif
#endif

if (AL_Lens)
if (AL_Lens)
{
{
float4 lensDB = tex2D(lensDBSampler, texcoord);
float4 lensDB = tex2D(lensDBSampler, texcoord);
float4 lensDB2 = tex2D(lensDB2Sampler, texcoord);
float4 lensDB2 = tex2D(lensDB2Sampler, texcoord);
float4 lensDOV = tex2D(lensDOVSampler, texcoord);
float4 lensDOV = tex2D(lensDOVSampler, texcoord);
float4 lensDUV = tex2D(lensDUVSampler, texcoord);
float4 lensDUV = tex2D(lensDUVSampler, texcoord);


float4 highLens = highFlip * lensDB * 0.7f * smartWeight;
float4 highLens = highFlip * lensDB * 0.7f * smartWeight;
high += highLens;
high += highLens;


highLens = highFlipOrig * lensDUV * 1.15f * smartWeight;
highLens = highFlipOrig * lensDUV * 1.15f * smartWeight;
highFlipOrig += highLens;
highFlipOrig += highLens;
high += highLens;
high += highLens;


highLens = highFlipOrig * lensDB2 * 0.7f * smartWeight;
highLens = highFlipOrig * lensDB2 * 0.7f * smartWeight;
highFlipOrig += highLens;
highFlipOrig += highLens;
high += highLens;
high += highLens;


highLens = highFlipOrig * lensDOV * 1.15f * smartWeight / 2f + highFlipOrig * smartWeight / 2f;
highLens = highFlipOrig * lensDOV * 1.15f * smartWeight / 2f + highFlipOrig * smartWeight / 2f;
highFlipOrig += highLens;
highFlipOrig += highLens;
high += highLens;
high += highLens;
}
}


float dither = 0.15 * (1.0 / (pow(2, 10.0) - 1.0));
float dither = 0.15 * (1.0 / (pow(2, 10.0) - 1.0));
dither = lerp(2.0 * dither, -2.0 * dither, frac(dot(texcoord, ReShade::ScreenSize * float2(1.0 / 16.0, 10.0 / 36.0)) + 0.25));
dither = lerp(2.0 * dither, -2.0 * dither, frac(dot(texcoord, BUFFER_SCREEN_SIZE * float2(1.0 / 16.0, 10.0 / 36.0)) + 0.25));


if (all(base.xyz == 1.0))
if (all(base.xyz == 1.0))
{
{
return 1.0;
return 1.0;
}
}


#if __RENDERER__ < 0xa000 && !__RESHADE_PERFORMANCE_MODE__
#if __RENDERER__ < 0xa000 && !__RESHADE_PERFORMANCE_MODE__
[flatten]
[flatten]
#endif
#endif


if (AL_Adaptation && AL_Dither)
if (AL_Adaptation && AL_Dither)
{
{
base.xyz *= max(0.0f, (1.0f - adapt * 0.75f * alAdaptBaseMult * pow((1.0f - (base.x + base.y + base.z) / 3), alAdaptBaseBlackLvL)));
base.xyz *= max(0.0f, (1.0f - adapt * 0.75f * alAdaptBaseMult * pow(abs(1.0f - (base.x + base.y + base.z) / 3), alAdaptBaseBlackLvL)));
float4 highSampleMix = (1.0 - ((1.0 - base) * (1.0 - high * 1.0))) + dither;
float4 highSampleMix = (1.0 - ((1.0 - base) * (1.0 - high * 1.0))) + dither;
float4 baseSample = lerp(base, highSampleMix, max(0.0f, alInt - adapt));
float4 baseSample = lerp(base, highSampleMix, max(0.0f, alInt - adapt));
float baseSampleMix = baseSample.r + baseSample.g + baseSample.b;
float baseSampleMix = baseSample.r + baseSample.g + baseSample.b;
return baseSampleMix > 0.008 ? baseSample : lerp(base, highSampleMix, max(0.0f, (alInt - adapt) * 0.85f) * baseSampleMix);
return baseSampleMix > 0.008 ? baseSample : lerp(base, highSampleMix, max(0.0f, (alInt - adapt) * 0.85f) * baseSampleMix);
}
}

else if (AL_Adaptation)
if (AL_Adaptation)
{
{
base.xyz *= max(0.0f, (1.0f - adapt * 0.75f * alAdaptBaseMult * pow((1.0f - (base.x + base.y + base.z) / 3), alAdaptBaseBlackLvL)));
base.xyz *= max(0.0f, (1.0f - adapt * 0.75f * alAdaptBaseMult * pow(abs(1.0f - (base.x + base.y + base.z) / 3), alAdaptBaseBlackLvL)));
float4 highSampleMix = (1.0 - ((1.0 - base) * (1.0 - high * 1.0)));
float4 highSampleMix = (1.0 - ((1.0 - base) * (1.0 - high * 1.0)));
float4 baseSample = lerp(base, highSampleMix, max(0.0f, alInt - adapt));
float4 baseSample = lerp(base, highSampleMix, max(0.0f, alInt - adapt));
float baseSampleMix = baseSample.r + baseSample.g + baseSample.b;
float baseSampleMix = baseSample.r + baseSample.g + baseSample.b;
return baseSampleMix > 0.008 ? baseSample : lerp(base, highSampleMix, max(0.0f, (alInt - adapt) * 0.85f) * baseSampleMix);
return baseSampleMix > 0.008 ? baseSample : lerp(base, highSampleMix, max(0.0f, (alInt - adapt) * 0.85f) * baseSampleMix);
}
}

else if (AL_Dither)
if (AL_Dither)
{
{
float4 highSampleMix = (1.0 - ((1.0 - base) * (1.0 - high * 1.0))) + dither + adapt;
float4 highSampleMix = (1.0 - ((1.0 - base) * (1.0 - high * 1.0))) + dither + adapt;
float4 baseSample = lerp(base, highSampleMix, alInt);
float4 baseSample = lerp(base, highSampleMix, alInt);
float baseSampleMix = baseSample.r + baseSample.g + baseSample.b;
float baseSampleMix = baseSample.r + baseSample.g + baseSample.b;
return baseSampleMix > 0.008 ? baseSample : lerp(base, highSampleMix, max(0.0f, alInt * 0.85f) * baseSampleMix);
return baseSampleMix > 0.008 ? baseSample : lerp(base, highSampleMix, max(0.0f, alInt * 0.85f) * baseSampleMix);
}
}

else
float4 highSampleMix = (1.0 - ((1.0 - base) * (1.0 - high * 1.0))) + adapt;
{
float4 baseSample = lerp(base, highSampleMix, alInt);
float4 highSampleMix = (1.0 - ((1.0 - base) * (1.0 - high * 1.0))) + adapt;
float baseSampleMix = baseSample.r + baseSample.g + baseSample.b;
float4 baseSample = lerp(base, highSampleMix, alInt);
return baseSampleMix > 0.008 ? baseSample : lerp(base, highSampleMix, max(0.0f, alInt * 0.85f) * baseSampleMix);
float baseSampleMix = baseSample.r + baseSample.g + baseSample.b;

return baseSampleMix > 0.008 ? baseSample : lerp(base, highSampleMix, max(0.0f, alInt * 0.85f) * baseSampleMix);
}
}
}


technique AmbientLight
technique AmbientLight
{
{
pass AL_DetectInt
pass AL_DetectInt
{
{
VertexShader = PostProcessVS;
VertexShader = PostProcessVS;
PixelShader = PS_AL_DetectInt;
PixelShader = PS_AL_DetectInt;
RenderTarget = detectIntTex;
RenderTarget = detectIntTex;
}
}
pass AL_DetectLow
pass AL_DetectLow
{
{
VertexShader = PostProcessVS;
VertexShader = PostProcessVS;
PixelShader = PS_AL_DetectLow;
PixelShader = PS_AL_DetectLow;
RenderTarget = detectLowTex;
RenderTarget = detectLowTex;
}
}
pass AL_DetectHigh
pass AL_DetectHigh
{
{
VertexShader = PostProcessVS;
VertexShader = PostProcessVS;
PixelShader = PS_AL_DetectHigh;
PixelShader = PS_AL_DetectHigh;
RenderTarget = alInTex;
RenderTarget = alInTex;
}
}


#define PASS_AL_H(i) \
#define PASS_AL_H(i) \
pass AL_H##i \
pass AL_H##i \
{ \
{ \
VertexShader = PostProcessVS; \
VertexShader = PostProcessVS; \
PixelShader = PS_AL_HGB; \
PixelShader = PS_AL_HGB; \
RenderTarget = alOutTex; \
RenderTarget = alOutTex; \
}
}
#define PASS_AL_V(i) \
#define PASS_AL_V(i) \
pass AL_V##i \
pass AL_V##i \
{ \
{ \
VertexShader = PostProcessVS; \
VertexShader = PostProcessVS; \
PixelShader = PS_AL_VGB; \
PixelShader = PS_AL_VGB; \
RenderTarget = alInTex; \
RenderTarget = alInTex; \
}
}


PASS_AL_H(1)
PASS_AL_H(1)
PASS_AL_V(1)
PASS_AL_V(1)
PASS_AL_H(2)
PASS_AL_H(2)
PASS_AL_V(2)
PASS_AL_V(2)
PASS_AL_H(3)
PASS_AL_H(3)
PASS_AL_V(3)
PASS_AL_V(3)
PASS_AL_H(4)
PASS_AL_H(4)
PASS_AL_V(4)
PASS_AL_V(4)
PASS_AL_H(5)
PASS_AL_H(5)
PASS_AL_V(5)
PASS_AL_V(5)
PASS_AL_H(6)
PASS_AL_H(6)
PASS_AL_V(6)
PASS_AL_V(6)
PASS_AL_H(7)
PASS_AL_H(7)
PASS_AL_V(7)
PASS_AL_V(7)
PASS_AL_H(8)
PASS_AL_H(8)
PASS_AL_V(8)
PASS_AL_V(8)
PASS_AL_H(9)
PASS_AL_H(9)
PASS_AL_V(9)
PASS_AL_V(9)
PASS_AL_H(10)
PASS_AL_H(10)
PASS_AL_V(10)
PASS_AL_V(10)
PASS_AL_H(11)
PASS_AL_H(11)
PASS_AL_V(11)
PASS_AL_V(11)
PASS_AL_H(12)
PASS_AL_H(12)
PASS_AL_V(12)
PASS_AL_V(12)


pass AL_Magic
pass AL_Magic
{
{
VertexShader = PostProcessVS;
VertexShader = PostProcessVS;
PixelShader = PS_AL_Magic;
PixelShader = PS_AL_Magic;
}
}
}
}