/* enbeffect.fx : MariENB3 base shader. (C)2016 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}; /* tone mapping */ string str_tonemap = "Filmic Tone Mapping"; bool tmapenable < string UIName = "Enable Tonemapping"; string UIWidget = "Checkbox"; > = {false}; float unA_n < string UIName = "Tonemap Shoulder Strength Night"; string UIWidget = "Spinner"; > = {0.5}; float unA_d < string UIName = "Tonemap Shoulder Strength Day"; string UIWidget = "Spinner"; > = {0.5}; float unA_i < string UIName = "Tonemap Shoulder Strength Interior"; string UIWidget = "Spinner"; > = {0.5}; float unB_n < string UIName = "Tonemap Linear Strength Night"; string UIWidget = "Spinner"; > = {1.0}; float unB_d < string UIName = "Tonemap Linear Strength Day"; string UIWidget = "Spinner"; > = {1.0}; float unB_i < string UIName = "Tonemap Linear Strength Interior"; string UIWidget = "Spinner"; > = {1.0}; float unC_n < string UIName = "Tonemap Linear Angle Night"; string UIWidget = "Spinner"; > = {0.2}; float unC_d < string UIName = "Tonemap Linear Angle Day"; string UIWidget = "Spinner"; > = {0.2}; float unC_i < string UIName = "Tonemap Linear Angle Interior"; string UIWidget = "Spinner"; > = {0.2}; float unD_n < string UIName = "Tonemap Toe Strength Night"; string UIWidget = "Spinner"; > = {0.75}; float unD_d < string UIName = "Tonemap Toe Strength Day"; string UIWidget = "Spinner"; > = {0.75}; float unD_i < string UIName = "Tonemap Toe Strength Interior"; string UIWidget = "Spinner"; > = {0.75}; float unE_n < string UIName = "Tonemap Toe Numerator Night"; string UIWidget = "Spinner"; > = {0.02}; float unE_d < string UIName = "Tonemap Toe Numerator Day"; string UIWidget = "Spinner"; > = {0.02}; float unE_i < string UIName = "Tonemap Toe Numerator Interior"; string UIWidget = "Spinner"; > = {0.02}; float unF_n < string UIName = "Tonemap Toe Denominator Night"; string UIWidget = "Spinner"; > = {0.30}; float unF_d < string UIName = "Tonemap Toe Denominator Day"; string UIWidget = "Spinner"; > = {0.30}; float unF_i < string UIName = "Tonemap Toe Denominator Interior"; string UIWidget = "Spinner"; > = {0.30}; float unW_n < string UIName = "Tonemap Linear White Night"; string UIWidget = "Spinner"; > = {10.0}; float unW_d < string UIName = "Tonemap Linear White Day"; string UIWidget = "Spinner"; > = {10.0}; float unW_i < string UIName = "Tonemap Linear White Interior"; string UIWidget = "Spinner"; > = {10.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 < string UIName = "LUT Preset"; string UIWidget = "Spinner"; int UIMin = 0; int UIMax = 63; > = {1}; #endif string str_dither = "Dithering"; bool dodither < string UIName = "Enable Post Dither"; string UIWidget = "Checkbox"; > = {true}; int dither < string UIName = "Dither Pattern"; string UIWidget = "Spinner"; int UIMin = 0; int UIMax = 4; > = {4}; string str_debug = "Debugging"; bool bloomdebug < string UIName = "Display Bloom"; string UIWidget = "Checkbox"; > = {false}; /* dithering threshold maps don't touch unless you know what you're doing */ static const float checkers[4] = { 1.0,0.0, 0.0,1.0 }; #define d(x) x/4.0 static const float ordered2[4] = { d(0),d(2), d(4),d(2) }; #undef d #define d(x) x/9.0 static const float ordered3[9] = { d(2),d(6),d(3), d(5),d(0),d(8), d(1),d(7),d(4) }; #undef d #define d(x) x/16.0 static const float ordered4[16] = { d( 0),d( 8),d( 2),d(10), d(12),d( 4),d(14),d( 6), d( 3),d(11),d( 1),d( 9), d(15),d( 7),d(13),d( 5) }; #undef d #define d(x) x/64.0 static const float ordered8[64] = { d( 0),d(48),d(12),d(60),d( 3),d(51),d(15),d(63), d(32),d(16),d(44),d(28),d(35),d(19),d(47),d(31), d( 8),d(56),d( 4),d(52),d(11),d(59),d( 7),d(55), d(40),d(24),d(36),d(20),d(43),d(27),d(39),d(23), d( 2),d(50),d(14),d(62),d( 1),d(49),d(13),d(61), d(34),d(18),d(46),d(30),d(33),d(17),d(45),d(29), d(10),d(58),d( 6),d(54),d( 9),d(57),d( 5),d(53), d(42),d(26),d(38),d(22),d(41),d(25),d(37),d(21) }; #undef d float4 Timer; float4 ScreenSize; float ENightDayFactor; float EInteriorFactor; float4 TimeOfDay1; float4 TimeOfDay2; float4 Params01[6]; float4 ENBParams01; Texture2D TextureColor; Texture2D TextureBloom; Texture2D TextureAdaptation; Texture2D TextureNoise2 < string ResourceName = "menbnoise1.png"; >; Texture2D TextureNoise3 < string ResourceName = "menbnoise2.png"; >; Texture2D TextureLUT < #ifdef LUTMODE_LEGACY string ResourceName = "menblutpreset.png"; #endif #ifdef LUTMODE_16 string ResourceName = "menblut16.png"; #endif #ifdef LUTMODE_64 string ResourceName = "menblut64.png"; #endif >; SamplerState Sampler0 { Filter = MIN_MAG_MIP_POINT; AddressU = Clamp; AddressV = Clamp; MaxLOD = 0; MinLOD = 0; }; SamplerState Sampler1 { Filter = MIN_MAG_MIP_LINEAR; AddressU = Clamp; AddressV = Clamp; MaxLOD = 0; MinLOD = 0; }; 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 { 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())); } }