1
Fork 0
This repository has been archived on 2026-03-09. You can view files and clone it, but you cannot make any changes to its state, such as pushing and creating new issues, pull requests or comments.
MariENB/effect.txt

1187 lines
No EOL
29 KiB
Text

/*
effect.txt : MariENB additional filters.
(C)2013 Marisa Kirisame, UnSX Team.
Part of MariENB, the personal ENB of Marisa.
Released under the MIT License.
*/
/* FXAA */
bool fxaaenable
<
string UIName = "EnableFXAA";
string UIWidget = "Checkbox";
> = {false};
float fxaaspanmax
<
string UIName = "FXAASpanMax";
string UIWidget = "Checkbox";
> = {4.0};
float fxaareducemul
<
string UIName = "FXAAReduceMul";
string UIWidget = "Checkbox";
> = {16.0};
float fxaareducemin
<
string UIName = "FXAAReduceMin";
string UIWidget = "Checkbox";
> = {128.0};
/* border blurring */
bool bbenable
<
string UIName = "BlurEnable";
string UIWidget = "Checkbox";
> = {true};
/* border blur sampling range */
float bbsamp
<
string UIName = "BlurSample";
string UIWidget = "Spinner";
> = {1.0};
/* border blur level */
int bblevel
<
string UIName = "BlurLevel";
string UIWidget = "Spinner";
> = {1};
/* blend power of blur */
float bbpow
<
string UIName = "BlurPower";
string UIWidget = "Spinner";
> = {15.46};
/* falloff curve of blur towards center of screen */
float bbcurve
<
string UIName = "BlurCurve";
string UIWidget = "Spinner";
> = {1.2};
/* blur falloff radius */
float bbradius
<
string UIName = "BlurRadius";
string UIWidget = "Spinner";
> = {0.69};
/* border darkening */
bool dkenable
<
string UIName = "DarkEnable";
string UIWidget = "Checkbox";
> = {true};
/* radius of darkening (relative to screen width) */
float dkradius
<
string UIName = "DarkRadius";
string UIWidget = "Spinner";
> = {0.37};
/* falloff of darkening */
float dkcurve
<
string UIName = "DarkCurve";
string UIWidget = "Spinner";
> = {1.94};
/* bump of darkening */
float dkbump
<
string UIName = "DarkBump";
string UIWidget = "Spinner";
> = {0.79};
/* shine/bloom compensation */
bool compenable
<
string UIName = "EnableCompensate";
string UIWidget = "Checkbox";
> = {true};
/* compensation factor */
float compfactor
<
string UIName = "CompensateFactor";
string UIWidget = "Spinner";
> = {0.19};
/* compensation power */
float comppow
<
string UIName = "CompensatePower";
string UIWidget = "Spinner";
> = {1.05};
/* compensation saturation */
float compsat
<
string UIName = "CompensateSaturation";
string UIWidget = "Spinner";
> = {0.3};
/* brightness bump for compensation */
float compbump
<
string UIName = "CompensateBump";
string UIWidget = "Spinner";
> = {0.0};
bool gradeenable
<
string UIName = "EnableGrading";
string UIWidget = "Checkbox";
> = {true};
/* miscellaneous color grading parameters */
float gradeadd_r
<
string UIName = "GradingAddR";
string UIWidget = "Spinner";
> = {0.0};
float gradeadd_g
<
string UIName = "GradingAddG";
string UIWidget = "Spinner";
> = {0.0};
float gradeadd_b
<
string UIName = "GradingAddB";
string UIWidget = "Spinner";
> = {0.0};
float grademul_r
<
string UIName = "GradingMulR";
string UIWidget = "Spinner";
> = {1.02};
float grademul_g
<
string UIName = "GradingMulG";
string UIWidget = "Spinner";
> = {1.08};
float grademul_b
<
string UIName = "GradingMulB";
string UIWidget = "Spinner";
> = {1.04};
float gradepow_r
<
string UIName = "GradingPowR";
string UIWidget = "Spinner";
> = {1.07};
float gradepow_g
<
string UIName = "GradingPowG";
string UIWidget = "Spinner";
> = {1.12};
float gradepow_b
<
string UIName = "GradingPowB";
string UIWidget = "Spinner";
> = {1.08};
float gradecol_r
<
string UIName = "GradingColR";
string UIWidget = "Spinner";
> = {0.04};
float gradecol_g
<
string UIName = "GradingColG";
string UIWidget = "Spinner";
> = {0.07};
float gradecol_b
<
string UIName = "GradingColB";
string UIWidget = "Spinner";
> = {0.59};
float gradecolfact
<
string UIName = "GradingColFactor";
string UIWidget = "Spinner";
> = {-0.24};
/* Soft grain */
bool ne
<
string UIName = "EnableSoftGrain";
string UIWidget = "Checkbox";
> = {true};
/* soft grain speed */
float nf
<
string UIName = "SoftGrainSpeed";
string UIWidget = "Spinner";
> = {2.68};
/* soft grain intensity */
float ni
<
string UIName = "SoftGrainIntensity";
string UIWidget = "Spinner";
> = {0.04};
/* soft grain saturation */
float ns
<
string UIName = "SoftGrainSaturation";
string UIWidget = "Spinner";
> = {0.09};
/* Two-pass noise */
bool np
<
string UIName = "SoftGrainTwopass";
string UIWidget = "Checkbox";
> = {true};
/* grain blend function: 0 normal, 1 add, 2 overlay, 3 multiply */
int nb
<
string UIName = "SoftGrainBlendfunc";
string UIWidget = "Spinner";
> = {1};
/* grain deviation */
float nk
<
string UIName = "SoftGrainDeviation";
string UIWidget = "Spinner";
> = {0.05};
/* grain magnification */
float nm1
<
string UIName = "SoftGrainMagnification1";
string UIWidget = "Spinner";
> = {1.25};
float nm2
<
string UIName = "SoftGrainMagnification2";
string UIWidget = "Spinner";
> = {0.64};
float nm3
<
string UIName = "SoftGrainMagnification3";
string UIWidget = "Spinner";
> = {0.35};
/* grain magnification pass 1 */
float nm11
<
string UIName = "SoftGrainMagnification11";
string UIWidget = "Spinner";
> = {2.05};
float nm12
<
string UIName = "SoftGrainMagnification12";
string UIWidget = "Spinner";
> = {3.11};
float nm13
<
string UIName = "SoftGrainMagnification13";
string UIWidget = "Spinner";
> = {2.22};
/* grain magnification pass 2 */
float nm21
<
string UIName = "SoftGrainMagnification21";
string UIWidget = "Spinner";
> = {4.25};
float nm22
<
string UIName = "SoftGrainMagnification22";
string UIWidget = "Spinner";
> = {0.42};
float nm23
<
string UIName = "SoftGrainMagnification23";
string UIWidget = "Spinner";
> = {6.29};
/* grain power */
float nj
<
string UIName = "SoftGrainPower";
string UIWidget = "Spinner";
> = {2.93};
/* Block graphics filter with palette reduction */
bool benable
<
string UIName = "EnableBlockGFX";
string UIWidget = "Checkbox";
> = {false};
/* emulated resolution for block graphics (0 or less for real resolution) */
float bresw
<
string UIName = "BlockGFXResolutionW";
string UIWidget = "Spinner";
> = {1.0};
float bresh
<
string UIName = "BlockGFXResolutionH";
string UIWidget = "Spinner";
> = {1.0};
/* do not scale */
bool bnoscale
<
string UIName = "BlockGFXNoScale";
string UIWidget = "Checkbox";
> = {false};
/* perform aspect ratio correction on emulated screen (ignored if no scale) */
bool bratio
<
string UIName = "BlockGFXAspect";
string UIWidget = "Checkbox";
> = {false};
/* extra border factor (negative values for overscan) */
float bborderf
<
string UIName = "BlockGFXBorder";
string UIWidget = "Spinner";
> = {0.00};
/* palette type for block graphics */
int bpaltype
<
string UIName = "BlockGFXpalette";
string UIWidget = "Spinner";
> = {5};
/* CGA subpalette */
int bcganum
<
string UIName = "BlockGFXcgamode";
string UIWidget = "Spinner";
> = {0};
/* Dirty screen effect (static noise) */
bool dirtenable
<
string UIName = "EnableDirt";
string UIWidget = "Checkbox";
> = {true};
/* dirt amount */
float dirtcfactor
<
string UIName = "DirtCoordFactor";
string UIWidget = "Spinner";
> = {0.09};
float dirtlfactor
<
string UIName = "DirtLuminanceFactor";
string UIWidget = "Spinner";
> = {0.0};
float dirtmc
<
string UIName = "DirtCoordMagnification";
string UIWidget = "Spinner";
> = {3.04};
float dirtml
<
string UIName = "DirtLuminanceMagnification";
string UIWidget = "Spinner";
> = {1.0};
/* Letterbox */
bool boxe
<
string UIName = "EnableBox";
string UIWidget = "Checkbox";
> = {true};
/* horizontal factor */
float boxh
<
string UIName = "BoxHorizontal";
string UIWidget = "Spinner";
> = {1.5};
/* vertical factor */
float boxv
<
string UIName = "BoxVertical";
string UIWidget = "Spinner";
> = {1.0};
/* softening */
float boxb
<
string UIName = "BoxSoften";
string UIWidget = "Spinner";
> = {0.02};
/* box alpha */
float boxa
<
string UIName = "BoxAlpha";
string UIWidget = "Spinner";
> = {6.07};
/* Use CRT curvature shader */
bool crtenable
<
string UIName = "EnableCurvature";
string UIWidget = "Checkbox";
> = {false};
/* chromatic aberration on CRT: fancy effect that isn't really realistic */
float chromaab
<
string UIName = "CurveChromaticAberration";
string UIWidget = "Spinner";
> = {0.93};
/* curvature lens zoom (0.5 = none) */
float lenszoom
<
string UIName = "CurveZoom";
string UIWidget = "Spinner";
> = {50.0};
/* curvature lens distortion */
float lensdist
<
string UIName = "CurveLens";
string UIWidget = "Spinner";
> = {0.0};
/* curvature CUBIC lens distortion */
float lensdistc
<
string UIName = "CurveLensCubic";
string UIWidget = "Spinner";
> = {0.0};
/* do not touch this! */
#define E_SHADER_3_0
/* texture sizes */
#define NOISERES 256.0
/* gaussian blur matrices */
const float2x2 gauss3 =
{
0.16,0.12,
0.12,0.09
};
const float3x3 gauss5 =
{
0.0865051903114,0.0692041522491,0.0346020761246,
0.0692041522491,0.0553633217993,0.0276816609,
0.0346020761246,0.0276816609,0.01384083045
};
const float4x4 gauss7 =
{
0.0632507440209,0.0527089533508,0.0301194019147,0.011294775718,
0.0527089533508,0.0439241277923,0.0250995015956,0.00941231309835,
0.0301194019147,0.0250995015956,0.01434257234,0.00537846462763,
0.011294775718,0.00941231309835,0.00537846462763,0.00201692423536
};
/* standard stuff (not all used) */
float tempF1;
float tempF2;
float tempF3;
float tempF4;
float tempF5;
float tempF6;
float tempF7;
float tempF8;
float tempF9;
float tempF0;
float4 ScreenSize;
float ENightDayFactor;
float EInteriorFactor;
float4 Timer;
float FieldOfView;
/* samplers and textures (some not yet used) */
texture2D texColor;
texture2D texDepth;
texture2D texPalette;
sampler2D SamplerColor = sampler_state
{
Texture = <texColor>;
MinFilter = LINEAR;
MagFilter = LINEAR;
MipFilter = NONE;
AddressU = Clamp;
AddressV = Clamp;
SRGBTexture = FALSE;
MaxMipLevel = 0;
MipMapLodBias = 0;
};
sampler2D SamplerDepth = sampler_state
{
Texture = <texDepth>;
MinFilter = LINEAR;
MagFilter = LINEAR;
MipFilter = NONE;
AddressU = Clamp;
AddressV = Clamp;
SRGBTexture = FALSE;
MaxMipLevel = 0;
MipMapLodBias = 0;
};
sampler2D SamplerPalette = sampler_state
{
Texture = <texPalette>;
MinFilter = LINEAR;
MagFilter = LINEAR;
MipFilter = NONE;
AddressU = Clamp;
AddressV = Clamp;
SRGBTexture = FALSE;
MaxMipLevel = 0;
MipMapLodBias = 0;
};
texture2D texNoise1
<
string ResourceName = "menbnoise1.png";
>;
texture2D texNoise2
<
string ResourceName = "menbnoise2.png";
>;
texture2D texNoise3
<
string ResourceName = "menbnoise3.png";
>;
sampler2D SamplerNoise1 = sampler_state
{
Texture = <texNoise1>;
MinFilter = LINEAR;
MagFilter = POINT;
MipFilter = NONE;
AddressU = Wrap;
AddressV = Wrap;
SRGBTexture = FALSE;
MaxMipLevel = 0;
MipMapLodBias = 0;
};
sampler2D SamplerNoise2 = sampler_state
{
Texture = <texNoise2>;
MinFilter = LINEAR;
MagFilter = POINT;
MipFilter = NONE;
AddressU = Wrap;
AddressV = Wrap;
SRGBTexture = FALSE;
MaxMipLevel = 0;
MipMapLodBias = 0;
};
sampler2D SamplerNoise3 = sampler_state
{
Texture = <texNoise3>;
MinFilter = LINEAR;
MagFilter = LINEAR;
MipFilter = NONE;
AddressU = Wrap;
AddressV = Wrap;
SRGBTexture = FALSE;
MaxMipLevel = 0;
MipMapLodBias = 0;
};
/* whatever */
struct VS_OUTPUT_POST
{
float4 vpos : POSITION;
float2 txcoord : TEXCOORD0;
};
struct VS_INPUT_POST
{
float3 pos : POSITION;
float2 txcoord : TEXCOORD0;
};
/* Shader routines */
VS_OUTPUT_POST VS_Process(VS_INPUT_POST IN)
{
VS_OUTPUT_POST OUT;
float4 pos = float4(IN.pos.x,IN.pos.y,IN.pos.z,1);
OUT.vpos = pos;
OUT.txcoord.xy = IN.txcoord.xy;
return OUT;
}
float4 PS_Process(VS_OUTPUT_POST IN, float2 vPos : VPOS) : COLOR
{
float2 coord = float2(IN.txcoord.x,IN.txcoord.y);
float4 res = tex2D(SamplerColor,coord);
return res;
}
float4 PS_ProcessPass1(VS_OUTPUT_POST IN, float2 vPos : VPOS) : COLOR
{
float2 coord = float2(IN.txcoord.x,IN.txcoord.y);
float4 res = tex2D(SamplerColor,coord);
if ( fxaaenable )
{
float fxaareducemul_ = 1.0/max(abs(fxaareducemul),1.0);
float fxaareducemin_ = 1.0/max(abs(fxaareducemin),1.0);
float2 bresl = float2(ScreenSize.x,ScreenSize.x*ScreenSize.w);
float2 bof = float2(1.0/bresl.x,1.0/bresl.y);
float3 rgbNW = tex2D(SamplerColor,coord+float2(-1,-1)*bof).rgb;
float3 rgbNE = tex2D(SamplerColor,coord+float2(1,-1)*bof).rgb;
float3 rgbSW = tex2D(SamplerColor,coord+float2(-1,1)*bof).rgb;
float3 rgbSE = tex2D(SamplerColor,coord+float2(1,1)*bof).rgb;
float3 rgbM = tex2D(SamplerColor,coord).rgb;
float3 luma = float3(0.299,0.587,0.114);
float lumaNW = dot(rgbNW,luma);
float lumaNE = dot(rgbNE,luma);
float lumaSW = dot(rgbSW,luma);
float lumaSE = dot(rgbSE,luma);
float lumaM = dot(rgbM,luma);
float lumaMin = min(lumaM,min(min(lumaNW,lumaNE),min(lumaSW,lumaSE)));
float lumaMax = max(lumaM,max(max(lumaNW,lumaNE),max(lumaSW,lumaSE)));
float2 dir = float2(-((lumaNW+lumaNE)-(lumaSW+lumaSE)),((lumaNW+lumaSW)
-(lumaNE+lumaSE)));
float dirReduce = max((lumaNW+lumaNE+lumaSW+lumaSE)*(0.25
*fxaareducemul_),fxaareducemin_);
float rcpDirMin = 1.0/(min(abs(dir.x),abs(dir.y))+dirReduce);
dir = min(float2(fxaaspanmax,fxaaspanmax),max(float2(-fxaaspanmax,
-fxaaspanmax),dir*rcpDirMin))/bresl;
float3 rgbA = (1.0/2.0)*(tex2D(SamplerColor,coord+dir*(1.0/3.0-0.5))
.rgb+tex2D(SamplerColor,coord+dir*(2.0/3.0-0.5)).rgb);
float3 rgbB = rgbA*(1.0/2.0)+(1.0/4.0)*(tex2D(SamplerColor,coord+dir
*(0.0/3.0-0.5)).rgb+tex2D(SamplerColor,coord+dir*(3.0/3.0
-0.5)).rgb);
float lumaB = dot(rgbB,luma);
if ( (lumaB < lumaMin) || (lumaB > lumaMax) )
res.rgb = rgbA;
else
res.rgb = rgbB;
}
return res;
}
float4 PS_ProcessPass2(VS_OUTPUT_POST IN, float2 vPos : VPOS) : COLOR
{
float2 coord = float2(IN.txcoord.x,IN.txcoord.y);
float4 res = tex2D(SamplerColor,coord);
if ( bbenable )
{
float4 origcolor = res;
float4 tcol = float4(0,0,0,0);
float2 bresl = float2(ScreenSize.x,ScreenSize.x*ScreenSize.w);
float2 bof = float2(1.0/bresl.x,1.0/bresl.y)*bbsamp;
int i, j;
if ( bblevel == 1 )
{
for ( i=-2; i<=2; i++ )
for ( j=-2; j<=2; j++ )
tcol += gauss5[abs(i)][abs(j)]
*tex2D(SamplerColor,coord+float2(i,j)*bof);
}
else if ( bblevel == 2 )
{
for ( i=-3; i<=3; i++ )
for ( j=-3; j<=3; j++ )
tcol += gauss7[abs(i)][abs(j)]
*tex2D(SamplerColor,coord+float2(i,j)*bof);
}
else
{
for ( i=-1; i<=1; i++ )
for ( j=-1; j<=1; j++ )
tcol += gauss3[abs(i)][abs(j)]
*tex2D(SamplerColor,coord+float2(i,j)*bof);
}
float2 uv = (coord.xy-0.5)*bbradius;
float vig = clamp(pow(saturate(dot(uv.xy,uv.xy)),bbcurve),0.0,1.0);
res.rgb = lerp(origcolor.rgb,tcol.rgb,clamp(vig*bbpow,0.0,1.0));
}
if ( dkenable )
{
float2 bresl = float2(1.0,ScreenSize.w);
float2 bof = bresl*dkradius;
float val = 0.0;
if ( coord.x < bof.x )
val = lerp(val,1,1.0-coord.x/bof.x);
if ( coord.y < bof.y )
val = lerp(val,1,1.0-coord.y/bof.y);
if ( 1.0-coord.x < bof.x )
val = lerp(val,1,1.0-(1.0-coord.x)/bof.x);
if ( 1.0-coord.y < bof.y )
val = lerp(val,1,1.0-(1.0-coord.y)/bof.y);
val = clamp(val*dkbump,0,1);
res.rgb = lerp(res.rgb,float3(0,0,0),pow(val,dkcurve));
}
if ( ne )
{
float ts = Timer.x*nf;
ts *= 1000.0;
float2 tcs = coord;
float2 s1 = tcs+float2(0,ts);
float2 s2 = tcs+float2(ts,0);
float2 s3 = tcs+float2(ts,ts);
float n1, n2, n3;
float2 nr = float2(ScreenSize.x,ScreenSize.x*ScreenSize.w)/NOISERES;
if ( np )
{
n1 = tex2D(SamplerNoise2,s1*nm11*nr).r;
n2 = tex2D(SamplerNoise2,s2*nm12*nr).g;
n3 = tex2D(SamplerNoise2,s3*nm13*nr).b;
s1 = tcs+float2(ts+n1*nk,n2*nk);
s2 = tcs+float2(n2,ts+n3*nk);
s3 = tcs+float2(ts+n3*nk,ts+n1*nk);
n1 = tex2D(SamplerNoise2,s1*nm21*nr).r;
n2 = tex2D(SamplerNoise2,s2*nm22*nr).g;
n3 = tex2D(SamplerNoise2,s3*nm23*nr).b;
}
else
{
n1 = tex2D(SamplerNoise3,s1*nm1*nr).r;
n2 = tex2D(SamplerNoise3,s2*nm2*nr).g;
n3 = tex2D(SamplerNoise3,s3*nm3*nr).b;
}
float n4 = (n1+n2+n3)/3;
float3 ng = float3(n4,n4,n4);
float3 nc = float3(n1,n2,n3);
float3 nt = pow(clamp(lerp(ng,nc,ns),0.0,1.0),nj);
if ( nb == 1 )
res.rgb += nt*ni;
else if ( nb == 2 )
{
res.r = (res.r<0.5)?(2.0*res.r*(0.5+(nt.r*ni)))
:(1.0-2.0*(1.0-res.r)*(1.0-((0.5+(nt.r*ni)))));
res.g = (res.g<0.5)?(2.0*res.g*(0.5+(nt.g*ni)))
:(1.0-2.0*(1.0-res.g)*(1.0-((0.5+(nt.g*ni)))));
res.b = (res.b<0.5)?(2.0*res.b*(0.5+(nt.b*ni)))
:(1.0-2.0*(1.0-res.b)*(1.0-((0.5+(nt.b*ni)))));
}
else if ( nb == 3 )
res.rgb *= 1.0+(nt*ni);
else
res.rgb = lerp(res.rgb,nt,ni);
}
if ( compenable )
{
float4 ovr = pow(saturate(res+compbump),comppow);
float ovrs = (ovr.r+ovr.g+ovr.b)/3.0;
ovr = ovr*compsat+ovrs*(1.0-compsat);
res.rgb -= ovr.rgb*compfactor;
}
if ( gradeenable )
{
float3 gradeadd = float3(gradeadd_r,gradeadd_g,gradeadd_b);
float3 grademul = float3(grademul_r,grademul_g,grademul_b);
float3 gradepow = float3(gradepow_r,gradepow_g,gradepow_b);
float3 gradecol = float3(gradecol_r,gradecol_g,gradecol_b);
res.rgb = saturate(res.rgb+gradeadd);
res.rgb = saturate(res.rgb*grademul);
res.rgb = saturate(pow(res.rgb,gradepow));
float tonev = (res.r+res.g+res.b)/3.0;
float3 tonecolor = gradecol*tonev;
res.rgb = res.rgb*(1.0-gradecolfact)+tonecolor*gradecolfact;
}
if ( dirtenable )
{
float2 r = float2(ScreenSize.x,ScreenSize.x*ScreenSize.w)/NOISERES;
float4 ncolc = tex2D(SamplerNoise1,coord*dirtmc*r);
float2 ds = float2(res.r+res.g,res.g+res.b)/2.0;
float4 ncoll = tex2D(SamplerNoise1,ds*dirtml);
res = lerp(res,(ncolc.r+1)*res,
dirtcfactor*saturate(1-(ds.x+ds.y)*0.25));
res = lerp(res,(ncoll.r+1)*res,
dirtlfactor*saturate(1-(ds.x+ds.y)*0.25));
}
if ( boxe )
{
float boxf = pow(clamp(boxh-abs(2.0*coord.x-1.0),0.0,1.0),boxb)
*pow(clamp(boxv-abs(2.0*coord.y-1.0),0.0,1.0),boxb);
res.rgb = lerp(res.rgb*(1.0-boxa),res.rgb,boxf);
}
return res;
}
float4 PS_ProcessPass3(VS_OUTPUT_POST IN, float2 vPos : VPOS) : COLOR
{
float2 coord = float2(IN.txcoord.x,IN.txcoord.y);
float4 res = tex2D(SamplerColor,coord);
if ( !benable )
return res;
float2 rresl = float2(ScreenSize.x,ScreenSize.x*ScreenSize.w);
float2 bresl = float2(1,1);
float2 dresl;
if ( bresw <= 0 || bresh <= 0 )
bresl = rresl;
else
{
if ( bresw <= 1.0 )
bresl.x = rresl.x*bresw;
else
bresl.x = bresw;
if ( bresh <= 1.0 )
bresl.y = rresl.y*bresh;
else
bresl.y = bresh;
}
float2 rratio = rresl/bresl;
float2 ncoord = coord;
if ( !bnoscale )
{
if ( bratio )
rratio /= min(rratio.x,rratio.y);
else
rratio /= rratio;
rratio *= 1+bborderf;
dresl = bresl*rratio;
ncoord = ((coord-float2(0.5,0.5))*rratio)+float2(0.5,0.5);
ncoord = floor(ncoord*bresl)/bresl;
}
else
{
rratio = float2(1.0,1.0);
dresl = rresl;
}
if ( bresw <= 0 || bresh <= 0 )
ncoord = coord;
float4 tcol = tex2D(SamplerColor,ncoord);
/* clamp */
if ( ncoord.x < 0 || ncoord.x >= 1 || ncoord.y < 0 || ncoord.y >= 1 )
tcol *= 0;
if ( bpaltype == 0 )
{
float4 dac;
if ( bcganum == 0 )
{
/* brighten shadows */
tcol.rgb = pow(tcol.rgb,0.35);
/* dither */
bool evx = (coord.x*dresl.x)%2 < 1;
bool evy = (coord.y*dresl.y)%2 < 1;
tcol -= 0.1;
if ( evx != evy )
tcol += 0.25;
/* oversaturate components */
dac.a = (tcol.r+tcol.g+tcol.b)/3.0;
dac.r = dac.a+(tcol.r-dac.a)*5.0;
dac.g = dac.a+(tcol.g-dac.a)*5.0;
dac.b = dac.a+(tcol.b-dac.a)*5.0;
}
else if ( bcganum%2 == 0 )
{
/* brighten shadows */
tcol.rgb = pow(tcol.rgb,0.4);
/* dither */
bool evx = (coord.x*dresl.x)%2 < 1;
bool evy = (coord.y*dresl.y)%2 < 1;
tcol -= 0.1;
if ( evx != evy )
tcol += 0.225;
/* oversaturate components */
dac.a = (tcol.r+tcol.g+tcol.b)/3.0;
dac.r = dac.a+(tcol.r-dac.a)*4.5;
dac.g = dac.a+(tcol.g-dac.a)*4.5;
dac.b = dac.a+(tcol.b-dac.a)*4.5;
}
else
{
/* brighten shadows */
tcol.rgb = pow(tcol.rgb,0.45);
/* dither */
bool evx = (coord.x*dresl.x)%2 < 1;
bool evy = (coord.y*dresl.y)%2 < 1;
tcol -= 0.1;
if ( evx != evy )
tcol += 0.2;
/* oversaturate components */
dac.a = (tcol.r+tcol.g+tcol.b)/3.0;
dac.r = dac.a+(tcol.r-dac.a)*4.0;
dac.g = dac.a+(tcol.g-dac.a)*4.0;
dac.b = dac.a+(tcol.b-dac.a)*4.0;
}
/* color lookup */
float3 cgapal[4] =
{
float3(0.000,0.000,0.000),
float3(1.000,1.000,1.000),
float3(0.000,0.000,0.000),
float3(0.000,0.000,0.000),
};
if ( bcganum == 1 )
{
cgapal[1] = float3(0.000,0.666,0.666);
cgapal[2] = float3(0.666,0.000,0.666);
cgapal[3] = float3(0.666,0.666,0.666);
}
else if ( bcganum == 2 )
{
cgapal[1] = float3(0.333,1.000,1.000);
cgapal[2] = float3(1.000,0.333,1.000);
cgapal[3] = float3(1.000,1.000,1.000);
}
else if ( bcganum == 3 )
{
cgapal[1] = float3(0.000,0.666,0.000);
cgapal[2] = float3(0.666,0.000,0.000);
cgapal[3] = float3(0.666,0.333,0.000);
}
else if ( bcganum == 4 )
{
cgapal[1] = float3(0.333,1.000,0.333);
cgapal[2] = float3(1.000,0.333,0.333);
cgapal[3] = float3(0.333,1.000,0.333);
}
else if ( bcganum == 5 )
{
cgapal[1] = float3(0.000,0.666,0.666);
cgapal[2] = float3(0.666,0.000,0.000);
cgapal[3] = float3(0.666,0.666,0.666);
}
else if ( bcganum == 6 )
{
cgapal[1] = float3(0.333,1.000,1.000);
cgapal[2] = float3(1.000,0.333,0.333);
cgapal[3] = float3(1.000,1.000,1.000);
}
float dist = 2.0;
int idx = 0;
for ( int i=0; i<4; i++ )
{
if ( distance(dac.rgb,cgapal[i]) < dist )
{
idx = i;
dist = distance(dac.rgb,cgapal[i]);
}
}
res.rgb = cgapal[idx];
}
else if ( bpaltype == 1 )
{
float4 dac;
/* brighten shadows */
tcol.rgb = pow(tcol.rgb,0.5);
/* dither */
bool evx = (coord.x*dresl.x)%2 < 1;
bool evy = (coord.y*dresl.y)%2 < 1;
tcol -= 0.04;
if ( evx != evy )
tcol += 0.08;
/* oversaturate components */
dac.a = (tcol.r+tcol.g+tcol.b)/3.0;
dac.r = dac.a+(tcol.r-dac.a)*3.0;
dac.g = dac.a+(tcol.g-dac.a)*3.0;
dac.b = dac.a+(tcol.b-dac.a)*3.0;
float3 egapal[16] =
{
float3(0.000,0.000,0.000),
float3(0.666,0.000,0.000),
float3(0.000,0.666,0.000),
float3(0.666,0.333,0.000),
float3(0.000,0.000,0.666),
float3(0.666,0.000,0.666),
float3(0.000,0.666,0.666),
float3(0.666,0.666,0.666),
float3(0.333,0.333,0.333),
float3(1.000,0.333,0.333),
float3(0.333,1.000,0.333),
float3(1.000,1.000,0.333),
float3(0.333,0.333,1.000),
float3(1.000,0.333,1.000),
float3(0.333,1.000,1.000),
float3(1.000,1.000,1.000),
};
float dist = 2.0;
int idx = 0;
for ( int i=0; i<16; i++ )
{
if ( distance(dac.rgb,egapal[i]) < dist )
{
idx = i;
dist = distance(dac.rgb,egapal[i]);
}
}
res.rgb = egapal[idx];
}
else if ( bpaltype == 2 )
{
float4 dac;
/* brighten shadows */
tcol.rgb = pow(tcol.rgb,0.5);
/* dither */
bool evx = (coord.x*dresl.x)%2 < 1;
bool evy = (coord.y*dresl.y)%2 < 1;
tcol -= 0.04;
if ( evx != evy )
tcol += 0.08;
/* oversaturate components */
dac.a = (tcol.r+tcol.g+tcol.b)/3.0;
dac.r = dac.a+(tcol.r-dac.a)*3.0;
dac.g = dac.a+(tcol.g-dac.a)*3.0;
dac.b = dac.a+(tcol.b-dac.a)*3.0;
/* color lookup */
float3 egapal[16] =
{
float3(0.000000,0.000000,0.000000),
float3(0.500000,0.000000,0.000000),
float3(0.125000,0.500000,0.000000),
float3(0.625000,0.250000,0.125000),
float3(0.000000,0.125000,0.343750),
float3(0.234375,0.000000,0.343750),
float3(0.062500,0.625000,0.812500),
float3(0.343750,0.343750,0.343750),
float3(0.125000,0.125000,0.125000),
float3(1.000000,0.250000,0.250000),
float3(0.281250,1.000000,0.250000),
float3(1.000000,0.875000,0.234375),
float3(0.187500,0.500000,1.000000),
float3(0.750000,0.187500,1.000000),
float3(0.281250,0.875000,1.000000),
float3(1.000000,1.000000,1.000000),
};
float dist = 2.0;
int idx = 0;
for ( int i=0; i<16; i++ )
{
if ( distance(dac.rgb,egapal[i]) < dist )
{
idx = i;
dist = distance(dac.rgb,egapal[i]);
}
}
res.rgb = egapal[idx];
}
else if ( bpaltype == 3 )
{
float4 dac;
/* brighten shadows */
tcol.rgb = pow(tcol.rgb,0.5);
/* dither */
bool evx = (coord.x*dresl.x)%2 < 1;
bool evy = (coord.y*dresl.y)%2 < 1;
tcol.rgb += 0.02;
if ( evx != evy )
tcol.rgb += 0.04;
/* oversaturate components */
dac.a = (tcol.r+tcol.g+tcol.b)/3.0;
dac.r = dac.a+(tcol.r-dac.a)*2.5;
dac.g = dac.a+(tcol.g-dac.a)*2.5;
dac.b = dac.a+(tcol.b-dac.a)*2.5;
/* truncate */
res.rgb = trunc(dac.rgb*4.0)/4.0;
}
else if ( bpaltype == 4 )
{
float4 dac;
/* brighten shadows */
tcol.rgb = pow(tcol.rgb,0.7);
/* dither */
bool evx = (coord.x*dresl.x)%2 < 1;
bool evy = (coord.y*dresl.y)%2 < 1;
tcol.rgb += 0.01;
if ( evx != evy )
tcol.rgb += 0.02;
/* oversaturate components */
dac.a = (tcol.r+tcol.g+tcol.b)/3.0;
dac.r = dac.a+(tcol.r-dac.a)*1.5;
dac.g = dac.a+(tcol.g-dac.a)*1.5;
dac.b = dac.a+(tcol.b-dac.a)*1.5;
/* truncate */
res.r = trunc(dac.r*8.0)/8.0;
res.g = trunc(dac.g*4.0)/4.0;
res.b = trunc(dac.b*8.0)/8.0;
}
else if ( bpaltype == 5 )
{
/* dither */
bool evx = (coord.x*dresl.x)%2 < 1;
bool evy = (coord.y*dresl.y)%2 < 1;
tcol.rgb += 0.01;
if ( evx != evy )
tcol.rgb += 0.02;
/* truncate */
res.rgb = trunc(tcol.rgb*16.0)/16.0;
}
else if ( bpaltype == 6 )
{
/* dither */
bool evx = (coord.x*dresl.x)%2 < 1;
bool evy = (coord.y*dresl.y)%2 < 1;
if ( evx == evy )
tcol.rgb -= 0.002;
/* truncate */
res.r = trunc(tcol.r*32.0)/32.0;
res.g = trunc(tcol.g*64.0)/64.0;
res.b = trunc(tcol.b*32.0)/32.0;
}
else if ( bpaltype == 7 )
{
/* dither */
bool evx = (coord.x*dresl.x)%2 < 1;
bool evy = (coord.y*dresl.y)%2 < 1;
if ( evx == evy )
tcol.rgb -= 0.001;
/* truncate */
res.rgb = trunc(tcol.rgb*64.0)/64.0;
}
else
return tcol;
return res;
}
float4 PS_ProcessPass4(VS_OUTPUT_POST IN, float2 vPos : VPOS) : COLOR
{
float2 coord = float2(IN.txcoord.x,IN.txcoord.y);
float4 res = tex2D(SamplerColor,coord);
if ( crtenable )
{
float4 tcol = res;
float3 eta = float3(1+chromaab*0.09,1+chromaab*0.06,1+chromaab*0.03);
float2 center = float2(coord.x-0.5,coord.y-0.5);
float zfact = 100.0/lenszoom;
float r2 = center.x*center.x+center.y*center.y;
float f = 0;
if( lensdistc == 0.0)
f = 1+r2*lensdist*0.1;
else
f = 1+r2*(lensdist*0.1+lensdistc*0.1*sqrt(r2));
float x = f*zfact*center.x+0.5;
float y = f*zfact*center.y+0.5;
float2 rcoord = (f*eta.r)*zfact*(center.xy*0.5)+0.5;
float2 gcoord = (f*eta.g)*zfact*(center.xy*0.5)+0.5;
float2 bcoord = (f*eta.b)*zfact*(center.xy*0.5)+0.5;
float4 idist = float4(tex2D(SamplerColor,rcoord).r,
tex2D(SamplerColor,gcoord).g,
tex2D(SamplerColor,bcoord).b,
tex2D(SamplerColor,float2(x,y)).a);
res.rgb = idist.rgb;
}
return res;
}
technique PostProcess
{
pass P0
{
VertexShader = compile vs_3_0 VS_Process();
PixelShader = compile ps_3_0 PS_ProcessPass1();
AlphaBlendEnable = TRUE;
SrcBlend = ONE;
DestBlend = ONE;
DitherEnable = FALSE;
ZEnable = FALSE;
CullMode = NONE;
ALPHATESTENABLE = FALSE;
SEPARATEALPHABLENDENABLE = FALSE;
AlphaBlendEnable = FALSE;
StencilEnable = FALSE;
FogEnable = FALSE;
SRGBWRITEENABLE = FALSE;
}
}
technique PostProcess2
{
pass P0
{
VertexShader = compile vs_3_0 VS_Process();
PixelShader = compile ps_3_0 PS_ProcessPass2();
AlphaBlendEnable = TRUE;
SrcBlend = ONE;
DestBlend = ONE;
DitherEnable = FALSE;
ZEnable = FALSE;
CullMode = NONE;
ALPHATESTENABLE = FALSE;
SEPARATEALPHABLENDENABLE = FALSE;
AlphaBlendEnable = FALSE;
StencilEnable = FALSE;
FogEnable = FALSE;
SRGBWRITEENABLE = FALSE;
}
}
technique PostProcess3
{
pass P0
{
VertexShader = compile vs_3_0 VS_Process();
PixelShader = compile ps_3_0 PS_ProcessPass3();
AlphaBlendEnable = TRUE;
SrcBlend = ONE;
DestBlend = ONE;
DitherEnable = FALSE;
ZEnable = FALSE;
CullMode = NONE;
ALPHATESTENABLE = FALSE;
SEPARATEALPHABLENDENABLE = FALSE;
AlphaBlendEnable = FALSE;
StencilEnable = FALSE;
FogEnable = FALSE;
SRGBWRITEENABLE = FALSE;
}
}
technique PostProcess4
{
pass P0
{
VertexShader = compile vs_3_0 VS_Process();
PixelShader = compile ps_3_0 PS_ProcessPass4();
AlphaBlendEnable = TRUE;
SrcBlend = ONE;
DestBlend = ONE;
DitherEnable = FALSE;
ZEnable = FALSE;
CullMode = NONE;
ALPHATESTENABLE = FALSE;
SEPARATEALPHABLENDENABLE = FALSE;
AlphaBlendEnable = FALSE;
StencilEnable = FALSE;
FogEnable = FALSE;
SRGBWRITEENABLE = FALSE;
}
}