diff --git a/enbseries.ini b/enbseries.ini index 301a215..b078ee9 100644 --- a/enbseries.ini +++ b/enbseries.ini @@ -277,9 +277,9 @@ AmbientLightingIntensitySunrise=0.61 AmbientLightingIntensityDay=0.87 AmbientLightingIntensitySunset=0.66 AmbientLightingIntensityDusk=0.44 -AmbientLightingIntensityNight=0.21 -AmbientLightingIntensityInteriorDay=0.22 -AmbientLightingIntensityInteriorNight=0.19 +AmbientLightingIntensityNight=0.13 +AmbientLightingIntensityInteriorDay=0.15 +AmbientLightingIntensityInteriorNight=0.12 [SSAO_SSIL] UseIndirectLighting=true ResolutionScale=1.0 diff --git a/enbseries/VERSION b/enbseries/VERSION index 0ea8df7..7a65452 100644 --- a/enbseries/VERSION +++ b/enbseries/VERSION @@ -1 +1 @@ -3.1.1 BETA "Stay FROSTy" +3.2.0 BETA "Let Go" diff --git a/enbseries/enbbloom.fx b/enbseries/enbbloom.fx index 805a739..13455ea 100644 --- a/enbseries/enbbloom.fx +++ b/enbseries/enbbloom.fx @@ -107,13 +107,6 @@ float bloomradiusy string UIWidget = "Spinner"; float UIMin = 0.0; > = {1.0}; -float bloomtheta -< - string UIName = "Bloom Angle"; - string UIWidget = "Spinner"; - float UIMin = 0.0; - float UIMax = 1.0; -> = {0.0}; /* bloom tint/blueshift parameters */ float3 blu_n < @@ -279,83 +272,21 @@ float bloommixs string UIName = "Bloom Single Pass Blend"; string UIWidget = "Spinner"; > = {1.0}; -string str_bloomdirt = "Lens Dirt"; -bool dirtenable -< - string UIName = "Enable Lens Dirt"; - string UIWidget = "Checkbox"; -> = {false}; -float dirtmix1 -< - string UIName = "Dirt Pass 1 Blend"; - string UIWidget = "Spinner"; -> = {0.0}; -float dirtmix2 -< - string UIName = "Dirt Pass 2 Blend"; - string UIWidget = "Spinner"; -> = {0.1}; -float dirtmix3 -< - string UIName = "Dirt Pass 3 Blend"; - string UIWidget = "Spinner"; -> = {1.2}; -float dirtmix4 -< - string UIName = "Dirt Pass 4 Blend"; - string UIWidget = "Spinner"; -> = {0.5}; -float dirtmix5 -< - string UIName = "Dirt Pass 5 Blend"; - string UIWidget = "Spinner"; -> = {0.25}; -float dirtmix6 -< - string UIName = "Dirt Pass 6 Blend"; - string UIWidget = "Spinner"; -> = {0.1}; -float dirtmixs -< - string UIName = "Dirt Single Pass Blend"; - string UIWidget = "Spinner"; -> = {1.0}; -float dirtsaturation -< - string UIName = "Dirt Saturation"; - string UIWidget = "Spinner"; -> = {1.0}; -float ldirtpow -< - string UIName = "Dirt Texture Contrast"; - string UIWidget = "Spinner"; -> = {1.25}; -float dirtpow -< - string UIName = "Dirt Contrast"; - string UIWidget = "Spinner"; -> = {1.25}; -float ldirtfactor -< - string UIName = "Dirt Factor"; - string UIWidget = "Spinner"; -> = {1.5}; - /* gaussian blur matrices */ /* radius: 4, std dev: 1.5 */ -/*static const float gauss4[4] = +static const float gauss4[4] = { 0.270682, 0.216745, 0.111281, 0.036633 -};*/ +}; /* radius: 8, std dev: 3 */ -static const float gauss8[8] = +/*static const float gauss8[8] = { 0.134598, 0.127325, 0.107778, 0.081638, 0.055335, 0.033562, 0.018216, 0.008847 -}; +};*/ /* radius: 40, std dev: 15 */ -/*static const float gauss40[40] = +static const float gauss40[40] = { 0.026823, 0.026763, 0.026585, 0.026291, 0.025886, 0.025373, 0.024760, 0.024055, @@ -367,9 +298,9 @@ static const float gauss8[8] = 0.004697, 0.004139, 0.003630, 0.003170, 0.002756, 0.002385, 0.002055, 0.001763, 0.001506, 0.001280, 0.001084, 0.000913 -};*/ +}; /* radius: 80, std dev: 30 */ -static const float gauss80[80] = +/*static const float gauss80[80] = { 0.013406, 0.013398, 0.013376, 0.013339, 0.013287, 0.013221, 0.013140, 0.013046, 0.012938, 0.012816, 0.012681, 0.012534, @@ -385,7 +316,7 @@ static const float gauss80[80] = 0.001192, 0.001107, 0.001027, 0.000952, 0.000881, 0.000815, 0.000753, 0.000694, 0.000640, 0.000589, 0.000542, 0.000497, 0.000456, 0.000418 -}; +};*/ /* mathematical constants */ static const float pi = 3.1415926535898; @@ -406,15 +337,6 @@ Texture2D RenderTarget64; Texture2D RenderTarget32; Texture2D RenderTargetRGBA64F; -Texture2D TextureLens -< -#ifdef LENSDIRT_DDS - string ResourceName = "menblens.dds"; -#else - string ResourceName = "menblens.png"; -#endif ->; - SamplerState Sampler { Filter = MIN_MAG_MIP_LINEAR; @@ -428,13 +350,6 @@ SamplerState Sampler2 AddressV = Clamp; }; -SamplerState SamplerLens -{ - Filter = MIN_MAG_MIP_LINEAR; - AddressU = Mirror; - AddressV = Mirror; -}; - struct VS_INPUT_POST { float3 pos : POSITION; @@ -533,14 +448,13 @@ float4 Anamorphic( float2 coord, Texture2D intex, float insz ) base = RenderTargetRGBA64F.Sample(Sampler,coord); int i; float sum = 0.0; + float inc = flen/insz; float2 pp; - float2 dir = float2(cos(bloomtheta*2*pi),sin(bloomtheta*2*pi)) - *flen/insz; - [unroll] for ( i=-79; i<=79; i++ ) + [unroll] for ( i=-39; i<=39; i++ ) { - pp = coord+dir*i; - res += gauss80[abs(i)]*intex.Sample(Sampler,pp); - sum += ((pp.x>=0.0)&&(pp.x<1.0))?gauss80[abs(i)]:0.0; + pp = coord+float2(i,0)*inc; + res += gauss40[abs(i)]*intex.Sample(Sampler,pp); + sum += ((pp.x>=0.0)&&(pp.x<1.0))?gauss40[abs(i)]:0.0; } res *= 1.0/sum; float3 flu = tod_ind(flu); @@ -562,14 +476,13 @@ float4 PS_HorizontalBlur( VS_OUTPUT_POST IN, float4 v0 : SV_Position0, float4 res = float4(0.0,0.0,0.0,0.0); int i; float sum = 0.0; + float inc = bloomradiusx/insz; float2 pp; - float2 dir = float2(cos(bloomtheta*2*pi),sin(bloomtheta*2*pi)) - *bloomradiusx/insz; - [unroll] for ( i=-7; i<=7; i++ ) + [unroll] for ( i=-3; i<=3; i++ ) { - pp = coord+dir*i; - res += gauss8[abs(i)]*intex.Sample(Sampler,pp); - sum += ((pp.x>=0.0)&&(pp.x<1.0))?gauss8[abs(i)]:0.0; + pp = coord+float2(i,0)*inc; + res += gauss4[abs(i)]*intex.Sample(Sampler,pp); + sum += ((pp.x>=0.0)&&(pp.x<1.0))?gauss4[abs(i)]:0.0; } res *= 1.0/sum; if ( alfenable ) res += Anamorphic(coord,intex,insz); @@ -588,14 +501,13 @@ float4 PS_VerticalBlur( VS_OUTPUT_POST IN, float4 v0 : SV_Position0, base = RenderTargetRGBA64F.Sample(Sampler,coord); int i; float sum = 0.0; + float inc = bloomradiusy/insz; float2 pp; - float2 dir = float2(sin(bloomtheta*2*pi),-cos(bloomtheta*2*pi)) - *bloomradiusy/insz; - [unroll] for ( i=-7; i<=7; i++ ) + [unroll] for ( i=-3; i<=3; i++ ) { - pp = coord+dir*i; - res += gauss8[abs(i)]*intex.Sample(Sampler,pp); - sum += ((pp.y>=0.0)&&(pp.y<1.0))?gauss8[abs(i)]:0.0; + pp = coord+float2(0,i)*inc; + res += gauss4[abs(i)]*intex.Sample(Sampler,pp); + sum += ((pp.y>=0.0)&&(pp.y<1.0))?gauss4[abs(i)]:0.0; } res *= 1.0/sum; float3 blu = tod_ind(blu); @@ -622,30 +534,6 @@ float4 PS_PostPass( VS_OUTPUT_POST IN, float4 v0 : SV_Position0 ) : SV_Target res.rgb /= 6.0; res.rgb = clamp(res.rgb,0.0,32768.0); res.a = 1.0; - if ( !dirtenable ) return res; - /* crappy lens filter, useful when playing characters with glasses */ - float2 ccoord = coord; -#ifdef ASPECT_LENSDIRT - ccoord.y = (coord.y-0.5)*ScreenSize.w+0.5; -#endif - float4 crap = TextureLens.Sample(SamplerLens,ccoord); - float4 mud = dirtmix1*RenderTarget1024.Sample(Sampler2,coord); - mud += dirtmix2*RenderTarget512.Sample(Sampler2,coord); - mud += dirtmix3*RenderTarget256.Sample(Sampler2,coord); - mud += dirtmix4*RenderTarget128.Sample(Sampler2,coord); - mud += dirtmix5*RenderTarget64.Sample(Sampler2,coord); - mud += dirtmix6*RenderTarget32.Sample(Sampler2,coord); - mud.rgb /= 6.0; - float3 hsv = rgb2hsv(mud.rgb); - hsv.y = clamp(hsv.y*dirtsaturation,0.0,1.0); - mud.rgb = clamp(hsv2rgb(hsv),0.0,32768.0); - mud.rgb = pow(mud.rgb,dirtpow); - float mudmax = luminance(mud.rgb); - float mudn = max(mudmax/(1.0+mudmax),0.0); - mudn = pow(mudn,max(ldirtpow-crap.a,0.0)); - mud.rgb *= mudn*ldirtfactor*crap.rgb; - res += max(mud,0.0); - res.a = 1.0; return res; } @@ -655,24 +543,6 @@ float4 PS_SPostPass( VS_OUTPUT_POST IN, float4 v0 : SV_Position0 ) : SV_Target float4 res = bloommixs*RenderTarget128.Sample(Sampler2,coord); res.rgb = clamp(res.rgb,0.0,32768.0); res.a = 1.0; - if ( !dirtenable ) return res; - /* crappy lens filter, useful when playing characters with glasses */ - float2 ccoord = coord; -#ifdef ASPECT_LENSDIRT - ccoord.y = (coord.y-0.5)*ScreenSize.w+0.5; -#endif - float4 crap = TextureLens.Sample(SamplerLens,ccoord); - float4 mud = dirtmixs*RenderTarget32.Sample(Sampler2,coord); - mud.rgb = pow(mud.rgb,dirtpow); - float3 hsv = rgb2hsv(mud.rgb); - hsv.y = clamp(hsv.y*dirtsaturation,0.0,1.0); - mud.rgb = clamp(hsv2rgb(hsv),0.0,32768.0); - float mudmax = luminance(mud.rgb); - float mudn = max(mudmax/(1.0+mudmax),0.0); - mudn = pow(mudn,max(ldirtpow-crap.a,0.0)); - mud.rgb *= mudn*ldirtfactor*crap.rgb; - res += max(mud,0.0); - res.a = 1.0; return res; } diff --git a/enbseries/enbbloom.fx.ini b/enbseries/enbbloom.fx.ini index d7a475b..bf740db 100644 --- a/enbseries/enbbloom.fx.ini +++ b/enbseries/enbbloom.fx.ini @@ -1,5 +1,5 @@ [ENBBLOOM.FX] -TECHNIQUE=1 +TECHNIQUE=2 Bloom Intensity Night=0.69 Bloom Intensity Day=0.38 Bloom Intensity Interior=0.53 @@ -80,12 +80,12 @@ Anamorphic Bloom Blue Shift Interior Night=1.86 Anamorphic Bloom Blue Shift Interior Day=1.86 Anamorphic Bloom Contrast Interior Night=1.12 Anamorphic Bloom Contrast Interior Day=1.22 -Bloom Pass 1 Blend=0.34 -Bloom Pass 2 Blend=0.59 -Bloom Pass 3 Blend=0.71 -Bloom Pass 4 Blend=0.79 -Bloom Pass 5 Blend=0.88 -Bloom Pass 6 Blend=0.94 +Bloom Pass 1 Blend=0.29 +Bloom Pass 2 Blend=0.57 +Bloom Pass 3 Blend=0.86 +Bloom Pass 4 Blend=1.14 +Bloom Pass 5 Blend=1.43 +Bloom Pass 6 Blend=1.71 Enable Lens Dirt=false Dirt Pass 1 Blend=0.08 Dirt Pass 2 Blend=0.25 diff --git a/enbseries/enbdepthoffield.fx b/enbseries/enbdepthoffield.fx index 8c00595..d496b15 100644 --- a/enbseries/enbdepthoffield.fx +++ b/enbseries/enbdepthoffield.fx @@ -266,12 +266,24 @@ bool frostalways string UIWidget = "Checkbox"; > = {false}; string str_focus = "Focusing Parameters"; -/* circle (triangle, actually) average focus */ -bool focuscircle +/* + focus modes: + -2 : mouse + -1 : manual + 0 : center spot + 1 : center + triangle + 2 : 8x8 grid average + TODO + 3 : 8x8 grid average of 8 closest points + 4 : 8x8 grid average of 8 farthest points +*/ +int focuscircle < - string UIName = "Enable Focus Triangle"; + string UIName = "Focus Mode"; string UIWidget = "Checkbox"; -> = {true}; + int UIMin = -2; + int UIMax = 2; +> = {1}; bool focusdisplay < string UIName = "Display Focus Points"; @@ -853,6 +865,7 @@ float EInteriorFactor; float4 TimeOfDay1; float4 TimeOfDay2; float4 DofParameters; +float4 tempInfo2; Texture2D TextureCurrent; Texture2D TexturePrevious; @@ -1239,11 +1252,26 @@ float4 PS_Aperture( VS_OUTPUT_POST IN, float4 v0 : SV_Position0 ) : SV_Target float4 PS_ReadFocus( VS_OUTPUT_POST IN, float4 v0 : SV_Position0 ) : SV_Target { if ( dofdisable ) return 0.0; - if ( focusmanual ) return focusmanualvalue; + if ( focuscircle == -2 ) + return TextureDepth.Sample(Sampler1,tempInfo2.zw).x; + if ( focuscircle < 0 ) return focusmanualvalue; float focusmax = tod_ind(focusmax); float cfocus = min(TextureDepth.Sample(Sampler1,focuscenter).x, focusmax*0.001); - if ( !focuscircle ) return cfocus; + if ( focuscircle == 0 ) return cfocus; + if ( focuscircle == 2 ) + { + int i, j; + float mfocus = 0.0; + float2 px; + [unroll] for( j=0; j<8; j++ ) [unroll] for( i=0; i<8; i++ ) + { + px = float2((i+0.5)/8.0,(j+0.5)/8.0); + mfocus += min(TextureDepth.Sample(Sampler1,px).x, + focusmax*0.001); + } + return mfocus/64.0; + } /* using polygons inscribed into a circle, in this case a triangle */ float focusradius = tod_ind(focusradius); float focusmix = tod_ind(focusmix); @@ -1385,7 +1413,7 @@ float4 PS_DoFBorkeh( VS_OUTPUT_POST IN, float4 v0 : SV_Position0 ) : SV_Target res /= tw; return res; } -float4 PS_DoFBorkehB( VS_OUTPUT_POST IN, float4 v0 : SV_Position0 ) : SV_Target +float4 PS_DoFPostBlur( VS_OUTPUT_POST IN, float4 v0 : SV_Position0 ) : SV_Target { float2 coord = IN.txcoord.xy; if ( dofdisable ) return TextureColor.Sample(Sampler1,coord); @@ -1474,8 +1502,27 @@ float4 PS_FrostPass( VS_OUTPUT_POST IN, float4 v0 : SV_Position0 ) : SV_Target res.rgb *= 1.0+bmp*dist; } else res = TextureColor.Sample(Sampler1,coord); - if ( !focusdisplay ) return res; + if ( !focusdisplay || (focuscircle == -1) ) return res; + if ( focuscircle == -2 ) + { + if ( distance(coord,tempInfo2.zw) < 0.01 ) + res.rgb = float3(1,0,0); + return res; + } + if ( focuscircle == 2 ) + { + int i, j; + float2 px; + [unroll] for( j=0; j<8; j++ ) [unroll] for( i=0; i<8; i++ ) + { + px = float2((i+0.5)/8.0,(j+0.5)/8.0); + if ( distance(coord,px) < 0.005 ) + res.rgb = float3(1,0,0); + } + return res; + } if ( distance(coord,focuscenter) < 0.01 ) res.rgb = float3(1,0,0); + if ( focuscircle == 0 ) return res; float cstep = (1.0/3.0); float2 tcoord; float focusradius = tod_ind(focusradius); @@ -1585,6 +1632,14 @@ technique11 Prepass7 } } technique11 Prepass8 +{ + pass p0 + { + SetVertexShader(CompileShader(vs_5_0,VS_Quad())); + SetPixelShader(CompileShader(ps_5_0,PS_DoFPostBlur())); + } +} +technique11 Prepass9 { pass p0 { @@ -1662,7 +1717,7 @@ technique11 PrepassB8 pass p0 { SetVertexShader(CompileShader(vs_5_0,VS_Quad())); - SetPixelShader(CompileShader(ps_5_0,PS_DoFBorkehB())); + SetPixelShader(CompileShader(ps_5_0,PS_DoFPostBlur())); } } technique11 PrepassB9 diff --git a/enbseries/enbdepthoffield.fx.ini b/enbseries/enbdepthoffield.fx.ini index 71009c2..ade6dd6 100644 --- a/enbseries/enbdepthoffield.fx.ini +++ b/enbseries/enbdepthoffield.fx.ini @@ -43,9 +43,9 @@ Focus Triangle Angle=0.5 Focus Triangle Radius Night=9.0 Focus Triangle Radius Day=12.0 Focus Triangle Radius Interior=10.5 -Focus Triangle Blending Night=0.6 -Focus Triangle Blending Day=0.7 -Focus Triangle Blending Interior=0.6 +Focus Triangle Blending Night=0.75 +Focus Triangle Blending Day=0.9 +Focus Triangle Blending Interior=0.8 Focus Maximum Depth Night=990.0 Focus Maximum Depth Day=994.0 Focus Maximum Depth Interior=988.0 @@ -70,19 +70,19 @@ DOF Fixed Focus Shift Interior=-0.01 DOF Fixed Focus Blend Night=1.0 DOF Fixed Focus Blend Day=1.0 DOF Fixed Focus Blend Interior=1.0 -DOF Fixed Unfocus Intensity Night=1.2 -DOF Fixed Unfocus Intensity Day=1.4 -DOF Fixed Unfocus Intensity Interior=1.3 +DOF Fixed Unfocus Intensity Night=1.49 +DOF Fixed Unfocus Intensity Day=1.39 +DOF Fixed Unfocus Intensity Interior=1.43 DOF Fixed Unfocus Contrast Night=125.0 DOF Fixed Unfocus Contrast Day=220.0 DOF Fixed Unfocus Contrast Interior=165.0 -DOF Fixed Unfocus Shift Night=-0.7 -DOF Fixed Unfocus Shift Day=-0.9 -DOF Fixed Unfocus Shift Interior=-0.8 +DOF Fixed Unfocus Shift Night=-1.06 +DOF Fixed Unfocus Shift Day=-1.1 +DOF Fixed Unfocus Shift Interior=-1.08 DOF Fixed Unfocus Blend Night=1.0 DOF Fixed Unfocus Blend Day=1.0 DOF Fixed Unfocus Blend Interior=1.0 -DOF Fixed Use Cutoff=false +DOF Fixed Use Cutoff=true Disable DOF=false DOF Gather Blur Radius=8.0 Debug Depth=false @@ -100,19 +100,19 @@ Edgevision Radius=1.0 Enable SSAO=false SSAO Radius=0.05 SSAO Noise=0 -SSAO Fade Contrast Night=0.9 -SSAO Fade Contrast Day=0.8 -SSAO Fade Contrast Interior=0.85 +SSAO Fade Contrast Night=0.6 +SSAO Fade Contrast Day=0.7 +SSAO Fade Contrast Interior=0.65 SSAO Fade Intensity Night=10.5 SSAO Fade Intensity Day=12.5 SSAO Fade Intensity Interior=11.5 -SSAO Intensity=3.0 -SSAO Contrast=1.5 +SSAO Intensity=1.25 +SSAO Contrast=0.65 SSAO Blending=0.8 SSAO Blur=true SSAO Bilateral Factor=1500.0 SSAO Range=20.0 -SSAO Range Min=0.0 +SSAO Range Min=1.0 SSAO Blur Radius=1.0 Debug SSAO=false SSAO Use Less Samples=true @@ -184,9 +184,10 @@ Frost Factor Night=1.16 Frost Factor Interior=0.27 DOF Bilateral Factor=20.0 DOF Bilateral Radius=1.0 -DOF Blur Radius=6.0 +DOF Blur Radius=10.0 DOF Blur Chromatic Aberration=1.5 Focus Plane Horizontal Tilt Center=0.5 Focus Plane Vertical Tilt Center=0.5 Focus Plane Horizontal Tilt=0.0 Focus Plane Vertical Tilt=0.0 +Focus Mode=1 diff --git a/enbseries/enbeffect.fx b/enbseries/enbeffect.fx index 901867f..fe791e7 100644 --- a/enbseries/enbeffect.fx +++ b/enbseries/enbeffect.fx @@ -431,12 +431,6 @@ int dither int UIMin = 0; int UIMax = 4; > = {4}; -string str_bloom = "Bloom Settings"; -bool bloomlighten -< - string UIName = "Use Lighten Blend"; - string UIWidget = "Checkbox"; -> = {false}; string str_debug = "Debugging"; bool bloomdebug < @@ -846,16 +840,13 @@ float4 PS_Draw( VS_OUTPUT_POST IN, float4 v0 : SV_Position0 ) : SV_Target float2 adapt = Adaptation(coord); if ( bloomdebug ) res.rgb *= 0; float3 bcol = mud.rgb*ENBParams01.x; - if ( bloomlighten ) - res.rgb = float3(max(res.r,bcol.r),max(res.g,bcol.g), - max(res.b,bcol.b)); - else res.rgb += bcol; + res.rgb += bcol; if ( aenable ) res.rgb *= adapt.x; if ( nbt && ne ) res.rgb = FilmGrain(res.rgb,coord); if ( vtmapenable ) res.rgb = TonemapGame(res.rgb); if ( vgradeenable ) res.rgb = GradingGame(res.rgb,adapt.y); #ifndef SKYRIMSE - res.rgb = pow(res.rgb,1.0/2.2); + res.rgb = pow(max(res.rgb,0.0),1.0/2.2); #endif if ( tmapenable ) res.rgb = Tonemap(res.rgb); if ( gradeenable1 ) res.rgb = GradingRGB(res.rgb); diff --git a/enbseries/enbeffect.fx.ini b/enbseries/enbeffect.fx.ini index 9e917fe..4303ad9 100644 --- a/enbseries/enbeffect.fx.ini +++ b/enbseries/enbeffect.fx.ini @@ -2,11 +2,11 @@ TECHNIQUE=1 Enable Grain=true Grain Speed=25.0 -Grain Intensity=1.34 +Grain Intensity=1.57 Grain Saturation=-0.64 Grain Two-Pass=true Grain Blending Mode=3 -Grain Dark Mask Contrast=24.369999 +Grain Dark Mask Contrast=29.74 Grain Two-Pass Factor=0.04 Grain Magnification=13.3, 19.6, 17.4 Grain Pass 1 Magnification=2.05, 3.11, 2.22 diff --git a/enbseries/enbeffectpostpass.fx b/enbseries/enbeffectpostpass.fx index 5133063..8c6b29a 100644 --- a/enbseries/enbeffectpostpass.fx +++ b/enbseries/enbeffectpostpass.fx @@ -34,25 +34,19 @@ float2 sres > = {0.0,0.0}; /* palette type: - -2 : Standard VGA 256-color palette -1 : disable 0 : CGA (320x200 4-color, or 640x200 monochrome) 1 : EGA (320x200, 16 colors) 2 : RGB2 (64-color quarter VGA palette, used in AOS) - 3 : RGB323 (8-bit RGB, I don't think this was a real thing) - 4 : VGA (256 colors, standard palette) - 5 : Doom (256 colors, does not cover a lot) - 6 : Quake I (256 colors, covers even less) - 7 : RGB4 (4bpc, I also don't think this was ever used in real hardware) - 8 : RGB565 (ol' 16-bit "true color") - 9 : RGB6 (typical screens incapable of 8bpc) + 3 : VGA (256 colors) + 4 : RGB565 (ol' 16-bit "true color") */ int paltype < string UIName = "Palette Type"; string UIWidget = "Spinner"; int UIMin = -1; - int UIMax = 9; + int UIMax = 4; > = {1}; /* CGA palette to use: @@ -83,6 +77,32 @@ int egapal int UIMin = 0; int UIMax = 1; > = {0}; +/* + VGA palette to use: + 0 : Standard VGA + 1 : Amulets & Armor + 2 : Blood + 3 : Doom + 4 : Duke Nukem 3D + 5 : Hacx 2.0 + 6 : Heretic + 7 : Hexen + 8 : Hexen 2 + 9 : Quake + 10 : Quake 2 + 11 : Rise of the Triad + 12 : Shadow Warrior + 13 : Strife + 14 : Wolfenstein 3D + TODO Project .Blank palette (when the design is finished) +*/ +int vgapal +< + string UIName = "VGA Palette"; + string UIWidget = "Spinner"; + int UIMin = 0; + int UIMax = 14; +> = {0}; /* Dithering mode: -1 : No dithering, just raw banding @@ -333,94 +353,6 @@ static const float ordered8[64] = d(42),d(26),d(38),d(22),d(41),d(25),d(37),d(21) }; #undef d -/* - palettes - don't touch unless you know what you're doing -*/ -#define d(x) x/3.0 -static const float3 cga1l[4] = -{ - float3(d(0),d(0),d(0)), - float3(d(0),d(2),d(2)), - float3(d(2),d(0),d(2)), - float3(d(2),d(2),d(2)) -}; -static const float3 cga1h[4] = -{ - float3(d(0),d(0),d(0)), - float3(d(1),d(3),d(3)), - float3(d(3),d(1),d(3)), - float3(d(3),d(3),d(3)) -}; -static const float3 cga2l[4] = -{ - float3(d(0),d(0),d(0)), - float3(d(0),d(2),d(0)), - float3(d(2),d(0),d(0)), - float3(d(2),d(1),d(0)) -}; -static const float3 cga2h[4] = -{ - float3(d(0),d(0),d(0)), - float3(d(1),d(3),d(1)), - float3(d(3),d(1),d(1)), - float3(d(3),d(2),d(1)) -}; -static const float3 cga3l[4] = -{ - float3(d(0),d(0),d(0)), - float3(d(0),d(2),d(2)), - float3(d(2),d(0),d(0)), - float3(d(2),d(2),d(2)) -}; -static const float3 cga3h[4] = -{ - float3(d(0),d(0),d(0)), - float3(d(1),d(3),d(3)), - float3(d(3),d(1),d(1)), - float3(d(3),d(3),d(3)) -}; -static const float3 stdega[16] = -{ - float3(d(0),d(0),d(0)), - float3(d(2),d(0),d(0)), - float3(d(0),d(2),d(0)), - float3(d(2),d(1),d(0)), - float3(d(0),d(0),d(2)), - float3(d(2),d(0),d(2)), - float3(d(0),d(2),d(2)), - float3(d(2),d(2),d(2)), - float3(d(1),d(1),d(1)), - float3(d(3),d(1),d(1)), - float3(d(1),d(3),d(1)), - float3(d(3),d(3),d(1)), - float3(d(1),d(1),d(3)), - float3(d(3),d(1),d(3)), - float3(d(1),d(3),d(3)), - float3(d(3),d(3),d(3)) -}; -#undef d -#define d(x) x/256.0 -static const float3 aosega[16] = -{ - float3(d( 0),d( 0),d( 0)), - float3(d(128),d( 0),d( 0)), - float3(d( 32),d(128),d( 0)), - float3(d(160),d( 64),d( 32)), - float3(d( 0),d( 32),d( 88)), - float3(d( 60),d( 0),d( 88)), - float3(d( 16),d(160),d(208)), - float3(d( 88),d( 88),d( 88)), - float3(d( 32),d( 32),d( 32)), - float3(d(256),d( 64),d( 64)), - float3(d( 72),d(256),d( 64)), - float3(d(256),d(224),d( 60)), - float3(d( 48),d(128),d(256)), - float3(d(192),d( 48),d(256)), - float3(d( 72),d(224),d(256)), - float3(d(256),d(256),d(256)), -}; -#undef d /* gauss stuff */ float gauss3[3] = { @@ -439,13 +371,13 @@ Texture2D TextureDots < string ResourceName = "menbdots.png"; >; -Texture2D TextureDoom +Texture2D TextureCGA < - string ResourceName = "menbdoomlut.png"; + string ResourceName = "menbcgalut.png"; >; -Texture2D TextureQuake +Texture2D TextureEGA < - string ResourceName = "menbquakelut.png"; + string ResourceName = "menbegalut.png"; >; Texture2D TextureVGA < @@ -559,75 +491,10 @@ float4 ReducePrepass( in float4 col, in float2 coord ) */ float4 ReduceCGA( in float4 color, in float2 coord ) { - float4 dac = ReducePrepass(color,coord); - if ( cgapal == 0 ) - { - dac.a = (dac.r+dac.g+dac.b)/3.0; - return (dac.a>0.5); - } - float dist = 2.0; - int idx = 0; - if ( cgapal == 1 ) - { - [unroll] for ( int i=0; i<4; i++ ) - if ( distance(dac.rgb,cga1l[i]) < dist ) - { - idx = i; - dist = distance(dac.rgb,cga1l[i]); - } - color.rgb = cga1l[idx]; - } - else if ( cgapal == 2 ) - { - [unroll] for ( int i=0; i<4; i++ ) - if ( distance(dac.rgb,cga1h[i]) < dist ) - { - idx = i; - dist = distance(dac.rgb,cga1h[i]); - } - color.rgb = cga1h[idx]; - } - else if ( cgapal == 3 ) - { - [unroll] for ( int i=0; i<4; i++ ) - if ( distance(dac.rgb,cga2l[i]) < dist ) - { - idx = i; - dist = distance(dac.rgb,cga2l[i]); - } - color.rgb = cga2l[idx]; - } - else if ( cgapal == 4 ) - { - [unroll] for ( int i=0; i<4; i++ ) - if ( distance(dac.rgb,cga2h[i]) < dist ) - { - idx = i; - dist = distance(dac.rgb,cga2h[i]); - } - color.rgb = cga2h[idx]; - } - else if ( cgapal == 5 ) - { - [unroll] for ( int i=0; i<4; i++ ) - if ( distance(dac.rgb,cga3l[i]) < dist ) - { - idx = i; - dist = distance(dac.rgb,cga3l[i]); - } - color.rgb = cga3l[idx]; - } - else if ( cgapal == 6 ) - { - [unroll] for ( int i=0; i<4; i++ ) - if ( distance(dac.rgb,cga3h[i]) < dist ) - { - idx = i; - dist = distance(dac.rgb,cga3h[i]); - } - color.rgb = cga3h[idx]; - } - return color; + float4 dac = clamp(ReducePrepass(color,coord)+0.005,0.005,0.995); + float2 lc = float2((dac.r+cgapal)/7.0, + dac.g/64.0+floor(dac.b*64.0)/64.0); + return TextureCGA.Sample(SamplerLUT,lc); } /* EGA technically only had the 320x200 16-colour graphic mode, but when VGA @@ -637,30 +504,10 @@ float4 ReduceCGA( in float4 color, in float2 coord ) */ float4 ReduceEGA( in float4 color, in float2 coord ) { - float4 dac = ReducePrepass(color,coord); - float dist = 2.0; - int idx = 0; - if ( egapal == 0 ) - { - [unroll] for ( int i=0; i<16; i++ ) - if ( distance(dac.rgb,stdega[i]) < dist ) - { - idx = i; - dist = distance(dac.rgb,stdega[i]); - } - color.rgb = stdega[idx]; - } - else - { - [unroll] for ( int i=0; i<16; i++ ) - if ( distance(dac.rgb,aosega[i]) < dist ) - { - idx = i; - dist = distance(dac.rgb,aosega[i]); - } - color.rgb = aosega[idx]; - } - return color; + float4 dac = clamp(ReducePrepass(color,coord)+0.005,0.005,0.995); + float2 lc = float2((dac.r+egapal)/2.0, + dac.g/64.0+floor(dac.b*64.0)/64.0); + return TextureEGA.Sample(SamplerLUT,lc); } /* A two bits per channel mode that can usually fit VGA mode 13h and mode x */ float4 ReduceRGB2( in float4 color, in float2 coord ) @@ -669,20 +516,6 @@ float4 ReduceRGB2( in float4 color, in float2 coord ) color.rgb = trunc(dac.rgb*4.0)/4.0; return color; } -/* Effectively has 256 colours, with a magenta tint due to precision loss */ -float4 ReduceRGB323( in float4 color, in float2 coord ) -{ - float4 dac = ReducePrepass(color,coord); - color.rgb = trunc(dac.rgb*float3(8.0,4.0,8.0))/float3(8.0,4.0,8.0); - return color; -} -/* 4096 colours, no actual graphics hardware existed that used 4bpc, though */ -float4 ReduceRGB4( in float4 color, in float2 coord ) -{ - float4 dac = ReducePrepass(color,coord); - color.rgb = trunc(dac.rgb*16.0)/16.0; - return color; -} /* The classic 16-bit colour mode everyone from my generation would remember, especially that subtle green tint and the banding due to lack of dithering @@ -695,38 +528,12 @@ float4 ReduceRGB565( in float4 color, in float2 coord ) /float3(32.0,64.0,32.0); return color; } -/* - If you see no difference when using this, then it could be because your - own screen is already 6bpc. This is the case for a lot of LCDs, both old - and modern. 8bpc tends to be the norm on IPS, though. 10bpc is the next - step, but for now it's only used internally in video codecs for more - efficient compression with lower quality loss. I seem to recall that in - most *nix systems such as Linux it's possible to have 10bpc already with - NVIDIA, but it causes compatibility issues with a lot of programs. -*/ -float4 ReduceRGB6( in float4 color, in float2 coord ) -{ - float4 dac = ReducePrepass(color,coord); - color.rgb = trunc(dac.rgb*64.0)/64.0; - return color; -} -/* Various VGA 256-colour palettes: Doom, Quake I, and the standard. */ -float4 ReduceDoom( in float4 color, in float2 coord ) -{ - float4 dac = clamp(ReducePrepass(color,coord)+0.005,0.005,0.995); - float2 lc = float2(dac.r,dac.g/64.0+floor(dac.b*64.0)/64.0); - return TextureDoom.Sample(SamplerLUT,lc); -} -float4 ReduceQuake( in float4 color, in float2 coord ) -{ - float4 dac = clamp(ReducePrepass(color,coord)+0.005,0.005,0.995); - float2 lc = float2(dac.r,dac.g/64.0+floor(dac.b*64.0)/64.0); - return TextureQuake.Sample(SamplerLUT,lc); -} +/* Various VGA 256-colour palettes */ float4 ReduceVGA( in float4 color, in float2 coord ) { float4 dac = clamp(ReducePrepass(color,coord)+0.005,0.005,0.995); - float2 lc = float2(dac.r,dac.g/64.0+floor(dac.b*64.0)/64.0); + float2 lc = float2((dac.r+vgapal)/15.0, + dac.g/64.0+floor(dac.b*64.0)/64.0); return TextureVGA.Sample(SamplerLUT,lc); } @@ -758,13 +565,8 @@ float4 PS_Retro( VS_OUTPUT_POST IN, float4 v0 : SV_Position0 ) : SV_Target if ( paltype == 0 ) res = ReduceCGA(tcol,(coord*rresl)/sresl); else if ( paltype == 1 ) res = ReduceEGA(tcol,(coord*rresl)/sresl); else if ( paltype == 2 ) res = ReduceRGB2(tcol,(coord*rresl)/sresl); - else if ( paltype == 3 ) res = ReduceRGB323(tcol,(coord*rresl)/sresl); - else if ( paltype == 4 ) res = ReduceVGA(tcol,(coord*rresl)/sresl); - else if ( paltype == 5 ) res = ReduceDoom(tcol,(coord*rresl)/sresl); - else if ( paltype == 6 ) res = ReduceQuake(tcol,(coord*rresl)/sresl); - else if ( paltype == 7 ) res = ReduceRGB4(tcol,(coord*rresl)/sresl); - else if ( paltype == 8 ) res = ReduceRGB565(tcol,(coord*rresl)/sresl); - else if ( paltype == 9 ) res = ReduceRGB6(tcol,(coord*rresl)/sresl); + else if ( paltype == 3 ) res = ReduceVGA(tcol,(coord*rresl)/sresl); + else if ( paltype == 4 ) res = ReduceRGB565(tcol,(coord*rresl)/sresl); else res = tcol; if ( ncoord.x < 0 || ncoord.x >= 1 || ncoord.y < 0 || ncoord.y >= 1 ) res *= 0; diff --git a/enbseries/enbeffectpostpass.fx.ini b/enbseries/enbeffectpostpass.fx.ini index af0448d..6c03d98 100644 --- a/enbseries/enbeffectpostpass.fx.ini +++ b/enbseries/enbeffectpostpass.fx.ini @@ -27,17 +27,17 @@ Curve Chromatic Aberration=0.7 Curve Zooming=50.200008 Curve Distortion=0.0 Curve Sampling Soften=0.0 -Enable Blur=false +Enable Blur=true Blur Sampling Range=0.15 -Enable Sharp=false -Sharp Sampling Range=0.35 -Sharpening Amount=3.0 +Enable Sharp=true +Sharp Sampling Range=0.38 +Sharpening Amount=1.37 Enable Shift=false Shift Sampling Range=0.6 Luma Sharpen Enable=true Luma Sharpen Radius=0.8 -Luma Sharpen Clamp=0.1 -Luma Sharpen Blending=6.0 +Luma Sharpen Clamp=0.05 +Luma Sharpen Blending=8.0 Emulated Resolution Width=0.0 Emulated Resolution Height=0.0 Zoom Factor X=0.0 @@ -45,3 +45,4 @@ Zoom Factor Y=0.0 Chroma Key Red=0, 1, 0 Chroma Key Green=1.0 Chroma Key Blue=0.0 +VGA Palette=0 diff --git a/enbseries/menbcgalut.png b/enbseries/menbcgalut.png new file mode 100644 index 0000000..55cccbc Binary files /dev/null and b/enbseries/menbcgalut.png differ diff --git a/enbseries/menbdoomlut.png b/enbseries/menbdoomlut.png deleted file mode 100644 index b2c3c45..0000000 Binary files a/enbseries/menbdoomlut.png and /dev/null differ diff --git a/enbseries/menbegalut.png b/enbseries/menbegalut.png new file mode 100644 index 0000000..9615797 Binary files /dev/null and b/enbseries/menbegalut.png differ diff --git a/enbseries/menblens.png b/enbseries/menblens.png deleted file mode 100644 index 61f8955..0000000 Binary files a/enbseries/menblens.png and /dev/null differ diff --git a/enbseries/menbquakelut.png b/enbseries/menbquakelut.png deleted file mode 100644 index 44f172a..0000000 Binary files a/enbseries/menbquakelut.png and /dev/null differ diff --git a/enbseries/menbvgalut.png b/enbseries/menbvgalut.png index 9e752b2..b7d5e90 100644 Binary files a/enbseries/menbvgalut.png and b/enbseries/menbvgalut.png differ