/* enbeffect.fx : MariENB3 base shader. (C)2016-2017 Marisa Kirisame, UnSX Team. Part of MariENB3, the personal ENB of Marisa for Fallout 4. Released under the GNU GPLv3 (or later). */ #include "menbglobaldefs.fx" string str_noise = "Film Grain"; bool ne < string UIName = "Enable Grain"; string UIWidget = "Checkbox"; > = {false}; /* speed of grain */ float nf < string UIName = "Grain Speed"; string UIWidget = "Spinner"; > = {2500.0}; /* intensity of grain */ float ni < string UIName = "Grain Intensity"; string UIWidget = "Spinner"; > = {0.05}; /* saturation of grain */ float ns < string UIName = "Grain Saturation"; string UIWidget = "Spinner"; > = {0.0}; /* use two-pass grain (double the texture fetches, but looks less uniform) */ bool np < string UIName = "Grain Two-Pass"; string UIWidget = "Checkbox"; > = {true}; /* blending mode for grain: 0 -> normal 1 -> add 2 -> overlay 3 -> "dark mask", a personal invention */ int nb < string UIName = "Grain Blending Mode"; string UIWidget = "Spinner"; int UIMin = 0; int UIMax = 3; > = {1}; /* dark mask blend mode contrast for mask image */ float bnp < string UIName = "Grain Dark Mask Contrast"; string UIWidget = "Spinner"; float UIMin = 0.0; > = {2.5}; /* two-pass distortion factor (0 = look just like one-pass grain) */ float nk < string UIName = "Grain Two-Pass Factor"; string UIWidget = "Spinner"; > = {0.04}; /* zoom factors for each component of each noise texture */ float3 nm < string UIName = "Grain Magnification"; string UIWidget = "Vector"; > = {13.25,19.64,17.35}; float3 nm1 < string UIName = "Grain Pass 1 Magnification"; string UIWidget = "Vector"; > = {2.05,3.11,2.22}; float3 nm2 < string UIName = "Grain Pass 2 Magnification"; string UIWidget = "Vector"; > = {4.25,0.42,6.29}; /* contrast of grain */ float nj < string UIName = "Grain Contrast"; string UIWidget = "Spinner"; float UIMin = 0.0; > = {2.0}; bool nbt < string UIName = "Apply Grain Before Tone Mapping"; string UIWidget = "Checkbox"; > = {true}; /* eye adaptation */ string str_adaptation = "Eye Adaptation"; bool aenable < string UIName = "Enable Adaptation"; string UIWidget = "Checkbox"; > = {false}; /* tone mapping */ string str_tonemap = "Tone Mapping"; /* algorithms: -1 : Disabled 0 : Vanilla 1 : Linear 2 : Reinhard 3 : Uncharted 2 4 : Hejl Dawson 5 : Haarm-Peter Duiker 6 : SweetFX */ int tmapenable < string UIName = "Tonemapping Method"; string UIWidget = "Spinner"; int UIMin = -1; int UIMax = 6; > = {3}; float tmapexposure_n < string UIName = "Tonemap Exposure Night"; string UIWidget = "Spinner"; float UIMin = 0.0; > = {1.0}; float tmapexposure_d < string UIName = "Tonemap Exposure Day"; string UIWidget = "Spinner"; float UIMin = 0.0; > = {1.0}; float tmapexposure_i < string UIName = "Tonemap Exposure Interior"; string UIWidget = "Spinner"; float UIMin = 0.0; > = {1.0}; float tmapblend_n < string UIName = "Tonemap Blend Night"; string UIWidget = "Spinner"; float UIMin = 0.0; float UIMax = 1.0; > = {1.0}; float tmapblend_d < string UIName = "Tonemap Blend Day"; string UIWidget = "Spinner"; float UIMin = 0.0; float UIMax = 1.0; > = {1.0}; float tmapblend_i < string UIName = "Tonemap Blend Interior"; string UIWidget = "Spinner"; float UIMin = 0.0; float UIMax = 1.0; > = {1.0}; float unA_n < string UIName = "Uncharted2 Shoulder Strength Night"; string UIWidget = "Spinner"; > = {0.5}; float unA_d < string UIName = "Uncharted2 Shoulder Strength Day"; string UIWidget = "Spinner"; > = {0.5}; float unA_i < string UIName = "Uncharted2 Shoulder Strength Interior"; string UIWidget = "Spinner"; > = {0.5}; float unB_n < string UIName = "Uncharted2 Linear Strength Night"; string UIWidget = "Spinner"; > = {1.0}; float unB_d < string UIName = "Uncharted2 Linear Strength Day"; string UIWidget = "Spinner"; > = {1.0}; float unB_i < string UIName = "Uncharted2 Linear Strength Interior"; string UIWidget = "Spinner"; > = {1.0}; float unC_n < string UIName = "Uncharted2 Linear Angle Night"; string UIWidget = "Spinner"; > = {0.2}; float unC_d < string UIName = "Uncharted2 Linear Angle Day"; string UIWidget = "Spinner"; > = {0.2}; float unC_i < string UIName = "Uncharted2 Linear Angle Interior"; string UIWidget = "Spinner"; > = {0.2}; float unD_n < string UIName = "Uncharted2 Toe Strength Night"; string UIWidget = "Spinner"; > = {0.75}; float unD_d < string UIName = "Uncharted2 Toe Strength Day"; string UIWidget = "Spinner"; > = {0.75}; float unD_i < string UIName = "Uncharted2 Toe Strength Interior"; string UIWidget = "Spinner"; > = {0.75}; float unE_n < string UIName = "Uncharted2 Toe Numerator Night"; string UIWidget = "Spinner"; > = {0.02}; float unE_d < string UIName = "Uncharted2 Toe Numerator Day"; string UIWidget = "Spinner"; > = {0.02}; float unE_i < string UIName = "Uncharted2 Toe Numerator Interior"; string UIWidget = "Spinner"; > = {0.02}; float unF_n < string UIName = "Uncharted2 Toe Denominator Night"; string UIWidget = "Spinner"; > = {0.30}; float unF_d < string UIName = "Uncharted2 Toe Denominator Day"; string UIWidget = "Spinner"; > = {0.30}; float unF_i < string UIName = "Uncharted2 Toe Denominator Interior"; string UIWidget = "Spinner"; > = {0.30}; float unW_n < string UIName = "Uncharted2 Linear White Night"; string UIWidget = "Spinner"; > = {10.0}; float unW_d < string UIName = "Uncharted2 Linear White Day"; string UIWidget = "Spinner"; > = {10.0}; float unW_i < string UIName = "Uncharted2 Linear White Interior"; string UIWidget = "Spinner"; > = {10.0}; float sfxgamma_n < string UIName = "SweetFX Gamma Night"; string UIWidget = "Spinner"; float UIMin = 0.0; float UIMax = 2.0; > = {1.0}; float sfxgamma_d < string UIName = "SweetFX Gamma Day"; string UIWidget = "Spinner"; float UIMin = 0.0; float UIMax = 2.0; > = {1.0}; float sfxgamma_i < string UIName = "SweetFX Gamma Interior"; string UIWidget = "Spinner"; float UIMin = 0.0; float UIMax = 2.0; > = {1.0}; float sfxexposure_n < string UIName = "SweetFX Exposure Night"; string UIWidget = "Spinner"; float UIMin = -1.0; float UIMax = 1.0; > = {0.0}; float sfxexposure_d < string UIName = "SweetFX Exposure Day"; string UIWidget = "Spinner"; float UIMin = -1.0; float UIMax = 1.0; > = {0.0}; float sfxexposure_i < string UIName = "SweetFX Exposure Interior"; string UIWidget = "Spinner"; float UIMin = -1.0; float UIMax = 1.0; > = {0.0}; float sfxsaturation_n < string UIName = "SweetFX Saturation Night"; string UIWidget = "Spinner"; float UIMin = -1.0; float UIMax = 1.0; > = {0.0}; float sfxsaturation_d < string UIName = "SweetFX Saturation Day"; string UIWidget = "Spinner"; float UIMin = -1.0; float UIMax = 1.0; > = {0.0}; float sfxsaturation_i < string UIName = "SweetFX Saturation Interior"; string UIWidget = "Spinner"; float UIMin = -1.0; float UIMax = 1.0; > = {0.0}; float sfxbleach_n < string UIName = "SweetFX Bleach Night"; string UIWidget = "Spinner"; float UIMin = 0.0; float UIMax = 1.0; > = {0.0}; float sfxbleach_d < string UIName = "SweetFX Bleach Day"; string UIWidget = "Spinner"; float UIMin = 0.0; float UIMax = 1.0; > = {0.0}; float sfxbleach_i < string UIName = "SweetFX Bleach Interior"; string UIWidget = "Spinner"; float UIMin = 0.0; float UIMax = 1.0; > = {0.0}; float sfxdefog_n < string UIName = "SweetFX Defog Night"; string UIWidget = "Spinner"; float UIMin = 0.0; float UIMax = 1.0; > = {0.0}; float sfxdefog_d < string UIName = "SweetFX Defog Day"; string UIWidget = "Spinner"; float UIMin = 0.0; float UIMax = 1.0; > = {0.0}; float sfxdefog_i < string UIName = "SweetFX Defog Interior"; string UIWidget = "Spinner"; float UIMin = 0.0; float UIMax = 1.0; > = {0.0}; float3 sfxfogcolor_n < string UIName = "SweetFX Defog Color Night"; string UIWidget = "Color"; > = {0.0,0.0,1.0}; float3 sfxfogcolor_d < string UIName = "SweetFX Defog Color Day"; string UIWidget = "Color"; > = {0.0,0.0,1.0}; float3 sfxfogcolor_i < string UIName = "SweetFX Defog Color Interior"; string UIWidget = "Color"; > = {0.0,0.0,1.0}; /* Color grading */ string str_grade = "Color Grading Suite"; bool gradeenable1 < string UIName = "Enable RGB Grading"; string UIWidget = "Checkbox"; > = {false}; /* color component multipliers */ float3 grademul_n < string UIName = "Grading Intensity Night"; string UIWidget = "Vector"; > = {1.0,1.0,1.0}; float3 grademul_d < string UIName = "Grading Intensity Day"; string UIWidget = "Vector"; > = {1.0,1.0,1.0}; float3 grademul_i < string UIName = "Grading Intensity Interior"; string UIWidget = "Vector"; > = {1.0,1.0,1.0}; /* color component contrasts */ float3 gradepow_n < string UIName = "Grading Contrast Night"; string UIWidget = "Vector"; > = {1.0,1.0,1.0}; float3 gradepow_d < string UIName = "Grading Contrast Day"; string UIWidget = "Vector"; > = {1.0,1.0,1.0}; float3 gradepow_i < string UIName = "Grading Contrast Interior"; string UIWidget = "Vector"; > = {1.0,1.0,1.0}; /* colorization factors */ bool gradeenable2 < string UIName = "Enable Vibrance Grading"; string UIWidget = "Checkbox"; > = {false}; float3 gradecol_n < string UIName = "Grading Color Night"; string UIWidget = "Vector"; > = {1.0,1.0,1.0}; float3 gradecol_d < string UIName = "Grading Color Day"; string UIWidget = "Vector"; > = {1.0,1.0,1.0}; float3 gradecol_i < string UIName = "Grading Color Interior"; string UIWidget = "Vector"; > = {1.0,1.0,1.0}; /* blend factor for colorization (negative values are quite fancy) */ float gradecolfact_n < string UIName = "Grading Color Factor Night"; string UIWidget = "Spinner"; > = {0.0}; float gradecolfact_d < string UIName = "Grading Color Factor Day"; string UIWidget = "Spinner"; > = {0.0}; float gradecolfact_i < string UIName = "Grading Color Factor Interior"; string UIWidget = "Spinner"; > = {0.0}; /* HSV grading */ bool gradeenable3 < string UIName = "Enable HSV Grading"; string UIWidget = "Checkbox"; > = {false}; /* saturation multiplier */ float gradesatmul_n < string UIName = "Grading Saturation Intensity Night"; string UIWidget = "Spinner"; > = {1.0}; float gradesatmul_d < string UIName = "Grading Saturation Intensity Day"; string UIWidget = "Spinner"; > = {1.0}; float gradesatmul_i < string UIName = "Grading Saturation Intensity Interior"; string UIWidget = "Spinner"; > = {1.0}; /* saturation power */ float gradesatpow_n < string UIName = "Grading Saturation Contrast Night"; string UIWidget = "Spinner"; > = {1.0}; float gradesatpow_d < string UIName = "Grading Saturation Contrast Day"; string UIWidget = "Spinner"; > = {1.0}; float gradesatpow_i < string UIName = "Grading Saturation Contrast Interior"; string UIWidget = "Spinner"; > = {1.0}; /* value multiplier */ float gradevalmul_n < string UIName = "Grading Value Intensity Night"; string UIWidget = "Spinner"; > = {1.0}; float gradevalmul_d < string UIName = "Grading Value Intensity Day"; string UIWidget = "Spinner"; > = {1.0}; float gradevalmul_i < string UIName = "Grading Value Intensity Interior"; string UIWidget = "Spinner"; > = {1.0}; /* value power */ float gradevalpow_n < string UIName = "Grading Value Contrast Night"; string UIWidget = "Spinner"; > = {1.0}; float gradevalpow_d < string UIName = "Grading Value Contrast Day"; string UIWidget = "Spinner"; > = {1.0}; float gradevalpow_i < string UIName = "Grading Value Contrast Interior"; string UIWidget = "Spinner"; > = {1.0}; bool colorizeafterhsv < string UIName = "Colorize After HSV"; string UIWidget = "Checkbox"; > = {true}; /* LUT grading */ string str_lut = "RGB Lookup Table Grading"; bool lutenable < string UIName = "Enable LUT Grading"; string UIWidget = "Checkbox"; > = {false}; float lutblend_n < string UIName = "LUT Blend Night"; string UIWidget = "Spinner"; > = {1.0}; float lutblend_d < string UIName = "LUT Blend Day"; string UIWidget = "Spinner"; > = {1.0}; float lutblend_i < string UIName = "LUT Blend Interior"; string UIWidget = "Spinner"; > = {1.0}; #ifdef LUTMODE_LEGACY int clut_n < string UIName = "LUT Preset Night"; string UIWidget = "Spinner"; int UIMin = 0; int UIMax = 63; > = {1}; int clut_d < string UIName = "LUT Preset Day"; string UIWidget = "Spinner"; int UIMin = 0; int UIMax = 63; > = {1}; int clut_i < string UIName = "LUT Preset Interior"; string UIWidget = "Spinner"; int UIMin = 0; int UIMax = 63; > = {1}; #endif /* technicolor shader */ string str_tech = "Technicolor"; bool techenable < string UIName = "Enable Technicolor"; string UIWidget = "Checkbox"; > = {false}; float techblend < string UIName = "Technicolor Blend"; string UIWidget = "Spinner"; float UIMin = 0.0; float UIMax = 1.0; > = {1.0}; /* vanilla */ string str_vanilla = "Vanilla Processing"; bool vgradeenable < string UIName = "Enable Vanilla Imagespace"; string UIWidget = "Checkbox"; > = {true}; float vtintpow < string UIName = "Vanilla Tint Contrast"; string UIWidget = "Spinner"; float UIMin = 0.0; > = {1.0}; float vtintmul < string UIName = "Vanilla Tint Strength"; string UIWidget = "Spinner"; float UIMin = 0.0; > = {1.0}; float vtintblend < string UIName = "Vanilla Tint Blend"; string UIWidget = "Spinner"; float UIMin = 0.0; float UIMax = 1.0; > = {1.0}; float vsatpow < string UIName = "Vanilla Vibrance Contrast"; string UIWidget = "Spinner"; float UIMin = 0.0; > = {1.0}; float vsatmul < string UIName = "Vanilla Vibrance Strength"; string UIWidget = "Spinner"; float UIMin = 0.0; > = {1.0}; float vsatblend < string UIName = "Vanilla Vibrance Blend"; string UIWidget = "Spinner"; float UIMin = 0.0; float UIMax = 1.0; > = {1.0}; float vconblend < string UIName = "Vanilla Contrast Blend"; string UIWidget = "Spinner"; float UIMin = 0.0; float UIMax = 1.0; > = {1.0}; string str_debug = "Debugging"; bool bloomdebug < string UIName = "Display Bloom"; string UIWidget = "Checkbox"; > = {false}; bool adaptdebug < string UIName = "Display Adaptation"; string UIWidget = "Checkbox"; > = {false}; float4 Timer; float4 ScreenSize; float ENightDayFactor; float EInteriorFactor; float4 TimeOfDay1; float4 TimeOfDay2; #ifdef SKYRIMSE float4 Params01[7]; #else float4 Params01[6]; #endif float4 ENBParams01; Texture2D TextureColor; Texture2D TextureBloom; Texture2D TextureAdaptation; Texture2D TextureNoise2 < string ResourceName = "menbnoise1.png"; >; Texture2D TextureNoise3 < string ResourceName = "menbnoise2.png"; >; #ifdef LUTMODE_LEGACY Texture2D TextureLUT < string ResourceName = "menblutpreset.png"; >; #else Texture2D TextureLUTN < #ifdef LUTMODE_16 string ResourceName = "menblut16_night.png"; #endif #ifdef LUTMODE_64 string ResourceName = "menblut64_night.png"; #endif >; Texture2D TextureLUTD < #ifdef LUTMODE_16 string ResourceName = "menblut16_day.png"; #endif #ifdef LUTMODE_64 string ResourceName = "menblut64_day.png"; #endif >; Texture2D TextureLUTI < #ifdef LUTMODE_16 string ResourceName = "menblut16_interior.png"; #endif #ifdef LUTMODE_64 string ResourceName = "menblut64_interior.png"; #endif >; #endif Texture2D TextureTonemap < string ResourceName = "menbfilmlut.png"; >; SamplerState Sampler0 { Filter = MIN_MAG_MIP_POINT; AddressU = Clamp; AddressV = Clamp; }; SamplerState Sampler1 { Filter = MIN_MAG_MIP_LINEAR; AddressU = Clamp; AddressV = Clamp; }; SamplerState SamplerLUT { Filter = MIN_MAG_MIP_LINEAR; AddressU = Wrap; AddressV = Wrap; MaxLOD = 0; MinLOD = 0; }; SamplerState SamplerNoise2 { Filter = MIN_LINEAR_MAG_MIP_POINT; AddressU = Wrap; AddressV = Wrap; MaxLOD = 0; MinLOD = 0; }; SamplerState SamplerNoise3 { Filter = MIN_MAG_MIP_LINEAR; AddressU = Wrap; AddressV = Wrap; MaxLOD = 0; MinLOD = 0; }; struct VS_INPUT_POST { float3 pos : POSITION; float2 txcoord : TEXCOORD0; }; struct VS_OUTPUT_POST { float4 pos : SV_POSITION; float2 txcoord0 : TEXCOORD0; }; VS_OUTPUT_POST VS_Draw( VS_INPUT_POST IN ) { VS_OUTPUT_POST OUT; OUT.pos = float4(IN.pos.x,IN.pos.y,IN.pos.z,1.0); OUT.txcoord0.xy = IN.txcoord.xy; return OUT; } /* helper functions */ /* photometric */ #define luminance(x) dot(x,float3(0.2126,0.7152,0.0722)) /* CCIR601 */ //#define luminance(x) dot(x,float3(0.299,0.587,0.114)) /* overlay blend */ #define overlay(a,b) (a<0.5)?(2.0*a*b):(1.0-(2.0*(1.0-a)*(1.0-b))) /* "dark mask" blending is something I came up with and can't really explain */ #define darkmask(a,b) (a>0.5)?(2.0*a*(0.5+b)):(1.0-2.0*(1.0-a)*(1.0-((0.5+b)))) float3 rgb2hsv( float3 c ) { float4 K = float4(0.0,-1.0/3.0,2.0/3.0,-1.0); float4 p = (c.g 0.5 ) r1.xy = IN.txcoord0.xy; r1.xyz = TextureBloom.Sample(Sampler1,r1.xy).xyz; r2.xy = TextureAdaptation.Sample(Sampler1,IN.txcoord0.xy).xy; r0.w = dot(float3(0.2125,0.7154,0.0721),r0.xyz); r0.w = max(r0.w,0.00001); r1.w = r2.y/r2.x; r2.y = r0.w*r1.w; if ( Params01[2].z >= 0.5 ) r2.z = 0xffffffff; else r2.z = 0; r3.xy = r1.w*r0.w+float2(-0.004,1.0); r1.w = max(r3.x, 0.0); r3.xz = r1.w*6.2+float2(0.5,1.7); r2.w = r1.w*r3.x; r1.w = r1.w*r3.z+0.06; r1.w = r2.w/r1.w; r1.w = pow(r1.w,2.2); r1.w = r1.w*Params01[2].y; r2.w = r2.y*Params01[2].y+1.0; r2.y = r2.w*r2.y; r2.y = r2.y/r3.y; if (r2.z == 0) r1.w = r2.y; else r1.w = r1.w; r0.w = r1.w/r0.w; r1.w = saturate(Params01[2].x-r1.w); r1.xyz = r1*r1.w; r0.xyz = r0*r0.w+r1; r1.x = dot(r0.xyz,float3(0.2125,0.7154,0.0721)); r0.w = 1.0; r0 = r0-r1.x; r0 = Params01[3].x*r0+r1.x; r1 = Params01[4]*r1.x-r0; r0 = Params01[4].w*r1+r0; r0 = Params01[3].w*r0-r2.x; r0 = Params01[3].z*r0+r2.x; r0.xyz = saturate(r0); r1.xyz = pow(r1.xyz,Params01[6].w); r1 = Params01[5]-r0; res = Params01[5].w*r1+r0; #else r0.xyz = color.xyz; r1.xy = Params01[4].zw*IN.txcoord0.xy; r1.xyz = TextureBloom.Sample(Sampler1,r1.xy).xyz; r0.w = TextureAdaptation.Sample(Sampler0,IN.txcoord0.xy).x; r1.w = Params01[1].z/(0.001+r0.w); r2.x = r1.w { pass p0 { SetVertexShader(CompileShader(vs_5_0, VS_Draw())); SetPixelShader(CompileShader(ps_5_0, PS_Draw())); } } technique11 ORIGINALPOSTPROCESS { pass p0 { SetVertexShader(CompileShader(vs_5_0, VS_Draw())); SetPixelShader(CompileShader(ps_5_0, PS_DrawOriginal())); } }