// Adjustable Variables
#include "enbconfig.txt"
// Depth of Field
#define LOWQUALITYDOF
//#define HIGHQUALITYDOF
////////////////////////////////////////////
// sampler2D AdapLumSampler;
// sampler2D BloomSampler;
// float4 ColorCorrect;
// float4 ColorShift;
// float Exposure;
// sampler2D GBufferTextureSampler2;
// sampler2D GBufferTextureSampler3;
// sampler2D HDRSampler;
// sampler2D JitterSampler;
// float PLAYER_MASK;
// sampler2D StencilCopySampler;
// float4 TexelSize;
// float4 ToneMapParams;
// float4 deSatContrastGamma;
// float4 dofBlur;
// float4 dofDist;
// float4 dofProj;
// float gDirectionalMotionBlurLength;
// float4 globalScreenSize;
// row_major float4x4 motionBlurMatrix;
//
// Registers:
//
// Name Reg Size
// ---------------------------- ----- ----
// globalScreenSize c44 1
// Exposure c66 1
// motionBlurMatrix c72 4
// TexelSize c76 1
// dofProj c77
// dofDist c78 1
// dofBlur c79 1
// gDirectionalMotionBlurLength c80 1
// ToneMapParams c81 1
// deSatContrastGamma c82 1
// ColorCorrect c83 1
// ColorShift c84 1
// PLAYER_MASK c85 1
// GBufferTextureSampler2 s0 1
// GBufferTextureSampler3 s1 1
// HDRSampler s2 1
// BloomSampler s3 1
// AdapLumSampler s4 1
// JitterSampler s5 1
// StencilCopySampler s6 1
////////////////////////////////////////////
struct VS_OUTPUT_POST
{
float4 vpos : POSITION;
float2 txcoord0 : TEXCOORD0;
};
struct VS_INPUT_POST
{
float3 pos : POSITION;
float2 txcoord0 : TEXCOORD0;
};
//int4 _i0 : register(i0);
////////////////////////////////////////////
/*
float4 _c0 : register(c0);
float4 _c1 : register(c1);
float4 _c2 : register(c2);
float4 _c3 : register(c3);
float4 _c4 : register(c4);
float4 _c5 : register(c5);
float4 _c6 : register(c6);
*/
float4 _c44 : register(c44);
float4 _c66 : register(c66);
float4 _c72 : register(c72);
float4 _c73 : register(c73);
float4 _c74 : register(c74);
float4 _c75 : register(c75);
float4 _c76 : register(c76);
float4 _c77 : register(c77);
float4 _c78 : register(c78);
float4 _c79 : register(c79);
float4 _c80 : register(c80);
float4 _c81 : register(c81);
float4 _c82 : register(c82);
float4 _c83 : register(c83);
float4 _c84 : register(c84);
float4 _c85 : register(c85);
float maxi : register(c86);
float temp : register(c87);
////////////////////////////////////////////
texture2D texs0 : register(s0);
texture2D texs1 : register(s1);
texture2D texs2 : register(s2);
texture2D texs3 : register(s3);
texture2D texs4 : register(s4);
texture2D texs5 : register(s5);
texture2D texs6 : register(s6);
texture2D texs7 : register(s7);
texture2D texs13 : register(s13); //palette
texture2D texs15 : register(s15);
////////////////////////////////////////////
//sampler2D s0 = sampler_state { Texture=<texs0>; };
//sampler2D s1 = sampler_state { Texture=<texs1>; };
sampler2D s2 = sampler_state { Texture=<texs2>; };
//sampler2D s3 = sampler_state { Texture=<texs3>; };
sampler2D s4 = sampler_state { Texture=<texs4>; };
sampler2D s5 = sampler_state { Texture=<texs5>; };
sampler2D s6 = sampler_state { Texture=<texs6>; };
sampler2D s7 = sampler_state { Texture=<texs7>; };
//sampler2D s13 = sampler_state { Texture=<texs13>; };
sampler2D s15 = sampler_state { Texture=<texs15>; };
//Sampler states fixing problems on ATI cards
sampler2D s0 = sampler_state
{
Texture = <texs0>;
MinFilter = LINEAR;
MagFilter = LINEAR;
MipFilter = NONE; //NONE; //LINEAR;
AddressU = Clamp;
AddressV = Clamp;
SRGBTexture = FALSE;
MaxMipLevel = 0;
MipMapLodBias = 0;
};
sampler2D s1 = sampler_state
{
Texture = <texs1>;
MinFilter = LINEAR;
MagFilter = LINEAR;
MipFilter = NONE; //NONE; //LINEAR;
AddressU = Clamp;
AddressV = Clamp;
SRGBTexture = FALSE;
MaxMipLevel = 0;
MipMapLodBias = 0;
};
sampler2D s3 = sampler_state
{
Texture = <texs3>;
MinFilter = LINEAR;
MagFilter = LINEAR;
MipFilter = NONE; //NONE; //LINEAR;
AddressU = Clamp;
AddressV = Clamp;
SRGBTexture = FALSE;
MaxMipLevel = 0;
MipMapLodBias = 0;
};
/*
sampler2D s5 = sampler_state
{
Texture = <texs5>;
MinFilter = GaussianQuad;
MagFilter = GaussianQuad;
MipFilter = NONE;
AddressU = Wrap;
AddressV = wrap;
SRGBTexture = FALSE;
MaxMipLevel = 0;
MipMapLodBias = 0;
};
*/
sampler2D s13 = sampler_state
{
Texture = <texs13>;
MinFilter = LINEAR;
MagFilter = LINEAR;
MipFilter = NONE;
AddressU = Clamp;
AddressV = Clamp;
SRGBTexture = FALSE;
MaxMipLevel = 0;
MipMapLodBias = 0;
};
////////////////////////////////////////////
float4 PS_C215BE6E(VS_OUTPUT_POST IN) : COLOR
{
float4 _oC0 = 0.0; //output
float4 _c0 = float4(0, 0.212500006, 0.715399981, 0.0720999986);
float4 _c1 = float4(0.25, 1, 256, 0);
float4 _c2 = float4(0, 2, 4, 8);
float4 _c3 = float4(58.1640015, 47.1300011, 0, 0);
float4 _c4 = float4(-0.5, -1.5, 1.5, 0.5);
float4 _c5 = float4(2, -1, 0.125, 0);
float4 _c6 = float4(256, 2, 4, 8);
float4 _c7 = float4(1.0, 0.1, 0.8, 1.0);
float4 _c8 = float4(0.0, 0.1, 0.8, 0.333);
float4 _c9 = float4(0.06, 0.1, 0.8, 0.1);
float4 _c10 = float4(0.01, 1.4, 0.0, 0.32);
float4 _c11 = float4(0.333333, 1.0, 0.0, 0.0);
//float4 _c12 = float4(0.27, 0.67, 0.06, 0.0);
float4 _c12 = float4(0.299, 0.587, 0.114, 0.0);
float4 _c13 = float4(0.0, 0.0, 0.0, 0.00001);
float4 _c150 = float4(0.55, 0.9, 0.85, 0.9);
float4 _c195 = float4(0.0, 0.0, 0.0, 0.07);//0.7
float4 r0;
float4 r1;
float4 r2;
float4 r3;
float4 r4;
float4 r5;
float4 r6;
float4 r7;
float4 r8;
float4 r9;
float4 r10;
float4 r11;
float4 _v0 = 0.0;
_v0.xy=IN.txcoord0.xy;
r1 = tex2D(s2, _v0.xy); //HDRSampler
r2 = tex2D(s3, _v0.xy); //BloomSampler
////////////////////////////////////////////
// Depth of Field
#ifdef LOWQUALITYDOF
r0 = tex2D(s1, _v0.xy);
r0.y =- _c77.x + _c77.y; //-dofProj.x + dofProj.y
r0.y = 1.0 / r0.y;
r0.z = r0.y * _c77.y; //dofProj.y
r0.z = r0.z * -_c77.x; //dofProj.x
r0.x = _c77.y * -r0.y + r0.x;
r0.x = 1.0 / r0.x;
r0.y = r0.z * r0.x;
r1 = tex2D(s2, _v0.xy); //HDRSampler
r2 = tex2D(s3, _v0.xy); //BloomSampler
//r1 *= 10.0;
r0.w = abs(_c79.w);
r3 = _c4; //-0.5, -1.5, 1.5, 0.5
float2 center;
float distance;
float focus;
float farblur;
float dof;
distance = r0.z * r0.x - _c78.w; //dofDist.w
distance += _c78.y * -r3.w; //dofDist.y
distance += 400-DOFDistance;//offset
center.x = _v0.x - 0.5;
center.y = 0.5 - _v0.y;
focus = length(center.xy)*1.41;
focus = pow(focus,3) * 3.5;
focus = max(focus,0.0);
farblur = clamp(distance * 0.018, 0.2, 1.8);
if (distance * 0.1 > 2)
{
dof = 0.0;
}
else
{
dof = 0.0;
}
float2 off_c76 = _c76.xy*min(focus + farblur + dof, DOFBlurAmount*2);
r4.xy = off_c76.xy * r3.xy + _v0.xy; //TexelSize.xy
r4 = tex2D(s2, r4.xy); //HDRSampler
r5.xy = off_c76.xy * r3.zx + _v0.xy; //TexelSize.xy
r5 = tex2D(s2, r5.xy); //HDRSampler
r3.xz = off_c76.xy * r3.wz + _v0.xy; //TexelSize.xy
r6 = tex2D(s2, r3.xz); //HDRSampler
r3.xy = off_c76.xy * r3.yw + _v0; //TexelSize.xy
r7 = tex2D(s2, r3.xy); //HDRSampler
r1.w = dot(r4.xyz, r4.xyz);
r1.w = 1.0 / r1.w;
if (-r1.w < 0.0)
{
r3.xyz = r4.xyz;
}
else
{
r3.xyz = _c0.x;
}
r1.w = dot(r5.xyz, r5.xyz); //dp3
r1.w = 1.0 / r1.w;
if (-r1.w < 0.0)
{
r4.xyz = r5.xyz;
}
else
{
r4.xyz = _c0.x;
}
r1.w = dot(r6.xyz, r6.xyz); //dp3
r1.w = 1.0 / r1.w;
if (-r1.w < 0.0)
{
r5.xyz = r6.xyz;
}
else
{
r5.xyz = _c0.x;
}
r1.w = dot(r7.xyz, r7.xyz); //dp3
r1.w = 1.0 / r1.w;
if (-r1.w < 0.0)
{
r6.xyz = r7.xyz;
}
else
{
r6.xyz = _c0.x;
}
r1.w = dot(r1.xyz, r1.xyz); //dp3
r1.w = 1.0 / r1.w;
if (-r1.w < 0.0)
{
r7.xyz = r1.xyz;
}
else
{
r7.xyz = _c0.x;
}
#endif
#ifdef HIGHQUALITYDOF
float2 center;
float depth;
float focus;
r0 = tex2D(s1, _v0.xy); //GBufferTextureSampler3
r0.y = -_c77.x + _c77.y; //-dofProj.x + dofProj.y
r0.y = 1.0 / r0.y;
r0.z = r0.y * _c77.y; //dofProj.y
r0.z = r0.z * -_c77.x; //dofProj.x
r0.x = _c77.y * -r0.y + r0.x;
r0.x = 1.0 / r0.x;
r0.y = r0.z * r0.x;
r0.w = abs(_c79.w);
r3 = _c4; //-0.5, -1.5, 1.5, 0.5
depth = r0.z * r0.x - _c78.w; //dofDist.w
depth += _c78.y * -r3.w; //dofDist.y
depth += 148; //offset
center.x = _v0.x - 0.5;
center.y = 0.5 - _v0.y;
int DoF_TAPS = 60;
if (DoF_TAPS > 0)
{
depth = max(depth, 0);
float4 vDofParams = float4(2.5, 0, DOFDistance, 1.0);
float dist;
if (depth < vDofParams.y)
{
dist = (depth - vDofParams.y) / (vDofParams.y - vDofParams.x);
}
else
{
dist = (depth - vDofParams.y) / (vDofParams.z - vDofParams.y);
dist = clamp(dist, 0, vDofParams.w);
}
dist = dist * 0.5 + 0.5;
static float3 poisson[60] =
{
float3( 0.2165, 0.1250, 1.0000 ),
float3( 0.0000, 0.2500, 1.0000 ),
float3( -0.2165, 0.1250, 1.0000 ),
float3( -0.2165, -0.1250, 1.0000 ),
float3( -0.0000, -0.2500, 1.0000 ),
float3( 0.2165, -0.1250, 1.0000 ),
float3( 0.4330, 0.2500, 1.0000 ),
float3( 0.0000, 0.5000, 1.0000 ),
float3( -0.4330, 0.2500, 1.0000 ),
float3( -0.4330, -0.2500, 1.0000 ),
float3( -0.0000, -0.5000, 1.0000 ),
float3( 0.4330, -0.2500, 1.0000 ),
float3( 0.6495, 0.3750, 1.0000 ),
float3( 0.0000, 0.7500, 1.0000 ),
float3( -0.6495, 0.3750, 1.0000 ),
float3( -0.6495, -0.3750, 1.0000 ),
float3( -0.0000, -0.7500, 1.0000 ),
float3( 0.6495, -0.3750, 1.0000 ),
float3( 0.8660, 0.5000, 1.0000 ),
float3( 0.0000, 1.0000, 1.0000 ),
float3( -0.8660, 0.5000, 1.0000 ),
float3( -0.8660, -0.5000, 1.0000 ),
float3( -0.0000, -1.0000, 1.0000 ),
float3( 0.8660, -0.5000, 1.0000 ),
float3( 0.2163, 0.3754, 0.8670 ),
float3( -0.2170, 0.3750, 0.8670 ),
float3( -0.4333, -0.0004, 0.8670 ),
float3( -0.2163, -0.3754, 0.8670 ),
float3( 0.2170, -0.3750, 0.8670 ),
float3( 0.4333, 0.0004, 0.8670 ),
float3( 0.4328, 0.5004, 0.8847 ),
float3( -0.2170, 0.6250, 0.8847 ),
float3( -0.6498, 0.1246, 0.8847 ),
float3( -0.4328, -0.5004, 0.8847 ),
float3( 0.2170, -0.6250, 0.8847 ),
float3( 0.6498, -0.1246, 0.8847 ),
float3( 0.6493, 0.6254, 0.9065 ),
float3( -0.2170, 0.8750, 0.9065 ),
float3( -0.8663, 0.2496, 0.9065 ),
float3( -0.6493, -0.6254, 0.9065 ),
float3( 0.2170, -0.8750, 0.9065 ),
float3( 0.8663, -0.2496, 0.9065 ),
float3( 0.2160, 0.6259, 0.8851 ),
float3( -0.4340, 0.5000, 0.8851 ),
float3( -0.6500, -0.1259, 0.8851 ),
float3( -0.2160, -0.6259, 0.8851 ),
float3( 0.4340, -0.5000, 0.8851 ),
float3( 0.6500, 0.1259, 0.8851 ),
float3( 0.4325, 0.7509, 0.8670 ),
float3( -0.4340, 0.7500, 0.8670 ),
float3( -0.8665, -0.0009, 0.8670 ),
float3( -0.4325, -0.7509, 0.8670 ),
float3( 0.4340, -0.7500, 0.8670 ),
float3( 0.8665, 0.0009, 0.8670 ),
float3( 0.2158, 0.8763, 0.9070 ),
float3( -0.6510, 0.6250, 0.9070 ),
float3( -0.8668, -0.2513, 0.9070 ),
float3( -0.2158, -0.8763, 0.9070 ),
float3( 0.6510, -0.6250, 0.9070 ),
float3( 0.8668, 0.2513, 0.9070 )
};
float2 pixelSizeHigh;
float2 pixelSizeLow;
pixelSizeHigh.x = 1.0 / _c44.x;
pixelSizeHigh.y = 1.0 / _c44.y;
pixelSizeLow.xy = pixelSizeHigh.xy;
float2 vMaxCoC = float2(5.0, 10.0);
float radiusScale = DOFBlurAmount;
float discRadius;
float discRadiusLow;
float centerDepth;
float4 tdepth;
float4 tapHigh;
float4 tapLow;
centerDepth = dist;
discRadius = abs(centerDepth * vMaxCoC.y - vMaxCoC.x);
discRadiusLow = discRadius * radiusScale;
r1 = 0.0;
for(int t = 0; t < DoF_TAPS; t++)
{
float2 coordLow = _v0.xy + (pixelSizeLow.xy * poisson[t].xy * discRadiusLow);
float2 coordHigh = _v0.xy + (pixelSizeHigh.xy * poisson[t].xy * discRadius);
tapLow = tex2D(s2, coordLow.xy) * poisson[t].z;
tapHigh = tex2D(s2, coordHigh.xy) * poisson[t].z;
tdepth = tex2D(s1, coordHigh.xy); //GBufferTextureSampler3
tdepth.y = -_c77.x + _c77.y; //-dofProj.x + dofProj.y
tdepth.y = 1.0 / tdepth.y;
tdepth.z = tdepth.y * _c77.y; //dofProj.y
tdepth.z = tdepth.z * -_c77.x; //dofProj.x
tdepth.x = _c77.y * -tdepth.y + tdepth.x;
tdepth.x = 1.0 / tdepth.x;
tdepth.w = tdepth.z * tdepth.x - _c78.w; //dofDist.w
tdepth.w += _c78.y * -r3.w; //dofDist.y
tdepth.w += 148;//offset
tdepth.w = max(tdepth.w, 0); //fix zoom bug
if (tdepth.w < vDofParams.y)
{
tapHigh.w = (tdepth.w - vDofParams.y)/(vDofParams.y - vDofParams.x);
}
else
{
tapHigh.w = (tdepth.w - vDofParams.y)/(vDofParams.z - vDofParams.y);
tapHigh.w = clamp(tapHigh.w, 0, vDofParams.w);
}
tapHigh.w = tapHigh.w * 0.5 + 0.5;
tapLow.w = tapHigh.w;
float tapBlur = abs(tapHigh.w * 2.0 - 1.0);
float4 tap = lerp(tapHigh, tapLow, tapBlur);
if (tap.w >= centerDepth)
{
tap.w = 1.0;
}
else
{
tap.w = abs(tap.w * 2.0 - 1.0);
}
r1.xyz += tap.xyz * tap.w;
r1.w += tap.w;
}
r1.xyz /= r1.w;
float4 dofcolor = r1;
dofcolor.w = r1.w / DoF_TAPS;
}
r1.w=dot(r1.xyz, r1.xyz); //dp3
r1.w=1.0/r1.w;
//if (-r1.w<0.0)
//{
// r3 = r1;
//}
//else
//{
// r3 = _c0.x;
//}
r3 = lerp(_c0.x, r1, saturate(r1.w * 10000));
r4 = r3;
r5 = r3;
r6 = r3;
r7 = r3;
#endif //HIGHQUALITYDOF
r0.x = r0.z * r0.x - _c78.w; //dofDist.w
r0.x = _c78.y * -r3.w + r0.x; //dofDist.y
r1.w = max(r0.x, _c0.x); //0.0
r0.x = 1.0 / _c78.z; //dofDist.z
r0.x = r1.w * r0.x;
r1.w = lerp(_c79.y, _c79.z, r0.x);//dofBlur
r0.x = min(_c79.z, r1.w); //dofBlur.z
r0.z = dot(r7.xyz, _c0.yzw); //0.212500006, 0.715399981, 0.0720999986
r8.x = dot(r3.xyz, _c0.yzw); //0.212500006, 0.715399981, 0.0720999986
r8.y = dot(r4.xyz, _c0.yzw); //0.212500006, 0.715399981, 0.0720999986
r8.z = dot(r5.xyz, _c0.yzw); //0.212500006, 0.715399981, 0.0720999986
r8.w = dot(r6.xyz, _c0.yzw); //0.212500006, 0.715399981, 0.0720999986
r1.w = dot(r8, _c1.xxxx); //0.25
r8 = r8 - r1.w;
r2.w = dot(r8, r8);
r0.z = r0.z - r1.w;
r0.z = r0.z * r0.z - r2.w;
r0.x = r0.x * r0.x;
if (r0.z < 0.0)
{
r0.x = r0.x;
}
else
{
r0.x = _c1.y; //1.0
}
r8=tex2D(s0, _v0.xy); //GBufferTextureSampler2
r8.yz = _c1.yz; // 1.0, 256.0
r9 = r8.w * -r8.z + _c2; //0, 2, 4, 8
if (r9.w < 0.0) //r9<0.0
{
r9 = _c1.w; //0.0
}
else r9 = _c1.y; //1.0
//r9 is filtered sky mask
//r10 = r8.w + tempc6; //c6.yzwx; //256, 2, 4, 8
r10 = r8.w * - _c6.x + _c6.yzwx; //256, 2, 4, 8
if (r10.x<0.0)
{
r10.x =- _c1.w; //0.0
}
else
{
r10.x =- _c1.y; //1.0
}
if (r10.y < 0.0)
{
r10.y =- _c1.w; //0.0
}
else
{
r10.y =- _c1.y; //1.0
}
if (r10.z < 0.0)
{
r10.z =- _c1.w; //0.0
}
else
{
r10.z =- _c1.y; //1.0
}
if (r10.w < 0.0)
{
r10.w =- _c1.w; //0.0
}
else
{
r10.w =- _c1.y; //1.0
}
r9 = r9 + r10;
r9 = r9 * _c4.x; //-0.5
r0.z = dot(r9, _c1.yyyy); //1.0
r0.z = r0.z + _c4.w; //0.5
r0.z = 1.0 / r0.z;
r8.xzw = r3.xyz * r9.x;
r7.xyz = r7 * _c4.w + r8.xzw; //0.5
r7.xyz = r4 * r9.y + r7;
r7.xyz = r5 * r9.z + r7;
r7.xyz = r6 * r9.w + r7;
r7.xyz = r0.z * r7;
r0.z = -r0.x + _c1.y; //1.0
r1.w = r0.x * _c1.x; //0.25
r3.xyz = r3 * r1.w;
r3.xyz = r7 * r0.z + r3;
r3.xyz = r4 * r1.w + r3;
r3.xyz = r5 * r1.w + r3;
r3.xyz = r6 * r1.w + r3;
//r4.xyz = _v0.yxy * _c5.x + _c5.y; //2, -1
r4.x = _v0.y * _c5.x + _c5.y;
r4.y = _v0.x * _c5.x + _c5.y;
r4.z = _v0.y * _c5.x + _c5.y;
r0.z = r4.y * _c77.z; //dofProj.z
r0.z = r0.y * r0.z;
r1.w = -r4.x * _c77.w; //dofProj.w
r1.w = r0.y * r1.w;
r5.xyz = r1.w * _c73; //motionBlurMatrix.2
r5.xyz = r0.z * _c72 + r5; //motionBlurMatrix.1
r5.xyz = -r0.y * _c74 + r5; //motionBlurMatrix.3
r5.xyz = r5 + _c75; //motionBlurMatrix.4
r0.y = -r5.z * _c77.z; //dofProj.z
r0.y = 1.0/r0.y;
r6.x = r5.x * r0.y;
r0.y = r5.z * _c77.w; //dofProj.w
r0.y = 1.0/r0.y;
r6.y = r5.y * r0.y;
//r0.yz = -r4 + r6.xxyw;
r0.yz = -r4.yz + r6.xy;
//r0.yz = r0 * _c80.x; //gDirectionalMotionBlurLength.x
r0.y = r0.y * _c80.x;
r0.z = r0.z * _c80.x;
r4.xy = r0.yz * _c5.z; //0.125
r5 = tex2D(s6, _v0.xy); //StencilCopySampler
r1.w = r5.x - _c85.x; //PLAYER_MASK.x
r4.zw = r3.xy * _c2.w; //8.0
r4.zw = _v0.xy * _c3.xy + r4.zw; //58.1640015, 47.1300011
r5 = tex2D(s5, r4.zw); //JitterSampler
//r2.w = r5.x - 0.5; //-0.5
r4.zw = r4.xy * (r5.x - 4) + _v0.xy; //0.082 fixed
r5.xyz = r3.xyz;
r2.w = _c1.y; //1.0
r3.w = _c1.y; //1.0
////////////////////////////////////////////
// Motion blur
for (int iii=0; iii<10; iii++)
{
r6.x = r4.x * r3.w + r4.z; //v2
r6.y = r4.y * r3.w + r4.w; //v2
r7 = tex2D(s6, r6.xy);
r5.w = r7.x - _c85.x;
if (r5.w<-0.3)
{
r5.w = _c1.y; //1.0
}
else
{
r5.w = _c1.w; //0.0
}
r6 = tex2D(s2, r6.xy);
r5.xyz = r6.xyz * r5.w + r5.xyz;
r2.w = r2.w + r5.w;
r3.w = r3.w + _c1.y; //1.0
}
r2.w = 1.0 / r2.w;
//r0.yz = r0 * _c44.xxyw; //globalScreenSize
r0.y = r0.y * _c44.x; //globalScreenSize
r0.z = r0.z * _c44.y; //globalScreenSize
r0.y = dot(r0.yz, r0.yz) + _c0.x; //dp2
//r0.y = sqrt(r0.y);
//r0.y = 1.0 / r0.y;
r0.y = pow(r0.y, _c4.w); //0.5
r0.y = r0.y * _c4.w; //0.5
r0.x = r0.x + _c1.y; //1.0
r0.x = 1.0 / r0.x;
r0.x = saturate(r0.y * r0.x);
r4.xyz = r5 * r2.w - r3;
r0.xyz = r0.x * r4 + r3;
//_oC0.xyz = 0.5*r0.xyz;
if (-r1.w<0.0) r0.xyz = r3.xyz;
if (-r0.w<0.0) r0.xyz = r1.xyz;
////////////////////////////////////////////
// Bloom
r11 = r0;
float4 color = r11;
float4 origcolor = tex2D(s2, _v0.xy);
r5 = tex2D(s4, _c0.x);
r5.w = r5.x;
r5.w = 1.0/r5.w;
color.xyz = color.xyz * r5.w;
float4 colorbloom = tex2D(s3, _v0.xy);//0.5
colorbloom *= r5.w;
float bloomgray = dot(colorbloom.xyz, 0.333) * 0.01;
colorbloom.r *= 0.01;
colorbloom.g *= 0.01;
colorbloom.b *= 0.01;
color = colorbloom * BloomAmount + color;
color.xyz = lerp(color.xyz, color.xyz * 0.8+colorbloom.xyz * 0.3, saturate(bloomgray));
color.xyz = max(color.xyz, 0.0001);
float cgray = dot(color.xyz, 0.333);
float3 poweredcolor = pow(color.xyz, ColorSaturation);
float newgray = dot(poweredcolor.xyz, 0.333);
color.xyz = poweredcolor.xyz * cgray / (newgray + 0.0001);
color *= Brightness;
float4 curr = ((color * (0.1 * color + 0.1 * 0.5) + 0.2 * 0.02) / (color * (0.1 * color + 0.5) + 0.2 * 2.3)) - 0.02 / 2.3;
float4 whiteScale = ((11.2 * (0.1 * 11.2 + 0.1 * 0.5) + 0.2 * 0.02) / (11.2 * (0.1 * 11.2 + 0.5) + 0.2 * 2.3)) - 0.02 / 2.3;
color = curr * whiteScale;
color = pow(color, 1/2.2);
color.xyz = saturate(color.xyz);
float luma = dot(color.xyz, _c12.xyz);
float3 blend = luma.xxx;
float L = min(1, max(0, 10 * (luma - 0.45)));
float3 result1 = 2.0 * color.xyz * blend;
float3 result2 = 1.0 - 2.0 * (1.0 - blend) * (1.0 - color.xyz);
float3 newColor = lerp(result1.xyz, result2.xyz, L);
float3 mixRGB = 0.25 * newColor.xyz;
mixRGB += ((1.0f - 0.25) * color.xyz);
color.xyz = mixRGB;
color.xyz = lerp(color.xyz, 0.5 * (1 + sin((color.xyz - 0.5) * 3.1415926)), Contrast);
color = BloomAdd * colorbloom * r3.x + color;
////////////////////////////////////////////
// Pallete texture (0.082 version feature)
color.rgb = saturate(color.rgb);
float3 brightness = 0.001; //tex2D(s4, _c0.x);
float3 palette;
float4 uvsrc = 0.0;
uvsrc.y = brightness.r;
uvsrc.x = color.r;
palette.r = tex2Dlod(s13, uvsrc).r;
uvsrc.x = color.g;
uvsrc.y = brightness.g;
palette.g = tex2Dlod(s13, uvsrc).g;
uvsrc.x = color.b;
uvsrc.y = brightness.b;
palette.b = tex2Dlod(s13, uvsrc).b;
color.rgb = palette.rgb;
////////////////////////////////////////////
focus = length(center.xy) * 1.41421;
focus = pow(focus, 5);
color.xyz -= focus * VignetteAmount;
_oC0.xyz = color.xyz;
//_oC0.w = 1.0;
return _oC0;
}
technique Shader_C215BE6E
{
pass p0
{
PixelShader = compile ps_3_0 PS_C215BE6E();
}
}