From 0651e45460703f398d4f8802d0ee2e90ef30fdca Mon Sep 17 00:00:00 2001 From: "Asmodean.pcsx2" Date: Tue, 11 Feb 2014 04:27:32 +0000 Subject: [PATCH] GSdx: Just some cleaning. Reformatted fx files that were causing issues on certain text editors. They should now display correctly in those editors. git-svn-id: http://pcsx2.googlecode.com/svn/trunk@5897 96395faa-99c1-11dd-bbfe-3dabce05a288 --- bin/GSdx_FX_Settings.ini | 205 ++++--- bin/shader.fx | 1213 ++++++++++++++++++-------------------- plugins/GSdx/res/fxaa.fx | 256 ++++---- 3 files changed, 798 insertions(+), 876 deletions(-) diff --git a/bin/GSdx_FX_Settings.ini b/bin/GSdx_FX_Settings.ini index 37ef63ca5b..d375d068ed 100644 --- a/bin/GSdx_FX_Settings.ini +++ b/bin/GSdx_FX_Settings.ini @@ -1,136 +1,135 @@ /*===============================================================================*\ -|######################### [GSdx FX 2.00 Revised] ########################| -|########################### By Asmodean ##########################| -|| || -|| This program is free software; you can redistribute it and/or || -|| modify it under the terms of the GNU General Public License || -|| as published by the Free Software Foundation; either version 2 || -|| of the License, or (at your option) any later version. || -|| || -|| This program is distributed in the hope that it will be useful, || -|| but WITHOUT ANY WARRANTY; without even the implied warranty of || -|| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the || -|| GNU General Public License for more details. (c)2014 || -|| || +|######################## [GSdx FX 2.00 Revised] ########################| +|########################## By Asmodean ##########################| +|| || +|| This program is free software; you can redistribute it and/or || +|| modify it under the terms of the GNU General Public License || +|| as published by the Free Software Foundation; either version 2 || +|| of the License, or (at your option) any later version. || +|| || +|| This program is distributed in the hope that it will be useful, || +|| but WITHOUT ANY WARRANTY; without even the implied warranty of || +|| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the || +|| GNU General Public License for more details. (c)2014 || +|| || |#################################################################################| \*===============================================================================*/ -//NOTICE: This shader suite requires DirectX 10, or higher. -//If this file looks messy and/or text is misaligned: use another text editor instead of regular MS Notepad. -//Recommended: Notepad++ http://notepad-plus-plus.org/download/v6.5.3.html +//NOTICE: This shader suite requires DirectX 10 (Shader Model 4.0), or higher. + /*------------------------------------------------------------------------------ - [DEFINITIONS & ON/OFF OPTIONS] + [DEFINITIONS & ON/OFF OPTIONS] ------------------------------------------------------------------------------*/ //---------------------------#[CHOOSE EFFECTS]#--------------------------------\\ //-#[ANTIALIASING TECHNIQUES] [1=ON|0=OFF] #READ: For best results: Use post antialiasing OR FS filtering. Not both. Postfix [2D/3D] after descriptions indicates if it's typically better for 2D, or 3D. -#define UHQ_FXAA 0 //#High Quality Fast Approximate Anti Aliasing. Adapted for GSdx from Timothy Lottes FXAA 3.11. If using GSdx's internal FXAA, this will act as a second pass, for increased quality & coverage. [3D] +#define UHQ_FXAA 0 //#High Quality Fast Approximate Anti Aliasing. Adapted for GSdx from Timothy Lottes FXAA 3.11. If using GSdx's internal FXAA, this will act as a second pass, for increased quality & coverage. [3D] //-#[FS FILTERING TECHNIQUES] [1=ON|0=OFF] #READ: For best results: Only enable one type of filtering at one time. Use post antialiasing OR FS filtering, not both. -#define BILINEAR_FILTERING 0 //#BiLinear Fullscreen Texture Filtering. BiLinear filtering - light to medium filtering of textures. [2D] -#define BICUBIC_FILTERING 0 //#BiCubic Fullscreen Texture Filtering. BiCubic filtering - medium to strong filtering of textures. [2D] -#define GAUSSIAN_FILTERING 0 //#Gaussian Fullscreen Texture Filtering. BiLinear filtering - strong to extra strong filtering of textures. [2D] +#define BILINEAR_FILTERING 0 //#BiLinear Fullscreen Texture Filtering. BiLinear filtering - light to medium filtering of textures. [2D] +#define BICUBIC_FILTERING 0 //#BiCubic Fullscreen Texture Filtering. BiCubic filtering - medium to strong filtering of textures. [2D] +#define GAUSSIAN_FILTERING 0 //#Gaussian Fullscreen Texture Filtering. BiLinear filtering - strong to extra strong filtering of textures. [2D] -//-#[LIGHTING & COLOUR] [1=ON|0=OFF] #READ: These can all be turned on & off independently of each other. [For High Dynamic Range(HDR) - use Bloom, Tonemapping, & Gamma Correction together] -#define BLENDED_BLOOM 1 //#High Quality Bloom, using blend techniques. Blooms naturally, per environment. [For best results: use bloom, tone mapping, & gamma together]. -#define SCENE_TONEMAPPING 1 //#Scene Tonemapping & RGB Colour Correction. [For best results: use bloom, tone mapping, & gamma together]. -#define GAMMA_CORRECTION 1 //#RGB Post Gamma Correction Curve. [For best results: use bloom, tone mapping, & gamma together]. -#define S_CURVE_CONTRAST 1 //#S-Curve Scene Contrast Enhancement. Naturally adjusts contrast using S-curves. -#define TEXTURE_SHARPENING 1 //#HQ Luma-Based Texture Sharpen, looks similar to a negative mip LOD Bias, enhances texture fidelity. -#define PIXEL_VIBRANCE 0 //#Pixel Vibrance. Intelligently adjusts pixel vibrance depending on original saturation. -#define COLOR_GRADING 0 //#Post-Complement Colour Grading. Alters individual colour components on a scene, to enhance selected colour tones. -#define CEL_SHADING 0 //#Cel Shaded toon look, simulates the look of animation/toon. Typically best suited for animated-style games. (cel edges interfere with post AA.) +//-#[LIGHTING & COLOUR] [1=ON|0=OFF] #READ: These can all be turned on & off independently of each other. [For High Dynamic Range(HDR) - use Bloom, Tonemapping, & Gamma Correction together] +#define BLENDED_BLOOM 1 //#High Quality Bloom, using blend techniques. Blooms naturally, per environment. [For best results: use bloom, tone mapping, & gamma together]. +#define SCENE_TONEMAPPING 1 //#Scene Tonemapping & RGB Colour Correction. [For best results: use bloom, tone mapping, & gamma together]. +#define GAMMA_CORRECTION 1 //#RGB Post Gamma Correction Curve. [For best results: use bloom, tone mapping, & gamma together]. +#define S_CURVE_CONTRAST 1 //#S-Curve Scene Contrast Enhancement. Naturally adjusts contrast using S-curves. +#define TEXTURE_SHARPENING 1 //#HQ Luma-Based Texture Sharpen, looks similar to a negative mip LOD Bias, enhances texture fidelity. +#define PIXEL_VIBRANCE 0 //#Pixel Vibrance. Intelligently adjusts pixel vibrance depending on original saturation. +#define COLOR_GRADING 0 //#Post-Complement Colour Grading. Alters individual colour components on a scene, to enhance selected colour tones. +#define CEL_SHADING 0 //#Cel Shaded toon look, simulates the look of animation/toon. Typically best suited for animated-style games. (cel edges interfere with post AA.) -//-#[TV EMU TECHNIQUES] [1=ON|0=OFF] #READ: These can all be turned on & off independently of each other. These effects are typically used to simulated older TVs/CRT etc. -#define SCANLINES 0 //#Scanlines to simulate the look of a CRT TV. Typically best suited for 2D/sprite games. -#define VIGNETTE 0 //#Darkens the edges of the screen, to make it look more like it was shot with a camera lens. -#define DITHERING 0 //#Subpixel Dithering to simulate more colors than your monitor can display. Smoothes gradiants, this can reduce color banding. +//-#[TV EMU TECHNIQUES] [1=ON|0=OFF] #READ: These can all be turned on & off independently of each other. These effects are typically used to simulated older TVs/CRT etc. +#define SCANLINES 0 //#Scanlines to simulate the look of a CRT TV. Typically best suited for 2D/sprite games. +#define VIGNETTE 0 //#Darkens the edges of the screen, to make it look more like it was shot with a camera lens. +#define DITHERING 0 //#Subpixel Dithering to simulate more colors than your monitor can display. Smoothes gradiants, this can reduce color banding. /*------------------------------------------------------------------------------ - [SHADER FX CONFIG OPTIONS] + [SHADER FX CONFIG OPTIONS] ------------------------------------------------------------------------------*/ -//-[FXAA OPTIONS] -#define FxaaSubpixMax 0.25 //[0.00 to 1.00] Amount of subpixel aliasing removal. Higher values: more subpixel antialiasing(softer). Lower values: less subpixel antialiasing(sharper). 0.00: Edge only antialiasing (no blurring) -#define FxaaQuality 4 //[1|2|3|4] Overall Fxaa quality preset (pixel coverage). 1: Low, 2: Medium, 3: High, 4: Ultra. I use these labels lightly, as even the 'low coverage' preset is in fact, still pretty high quality. -#define FxaaEarlyExit 1 //[0 or 1] Use Fxaa early exit pathing. This basically tells the algorithm to offset only luma-edge detected pixels. When disabled, the entire scene is antialiased(FSAA). 0 is off, 1 is on. +//-#[FXAA OPTIONS] +#define FxaaSubpixMax 0.25 //[0.00 to 1.00] Amount of subpixel aliasing removal. Higher values: more subpixel antialiasing(softer). Lower values: less subpixel antialiasing(sharper). 0.00: Edge only antialiasing (no blurring) +#define FxaaQuality 4 //[1|2|3|4] Overall Fxaa quality preset (pixel coverage). 1: Low, 2: Medium, 3: High, 4: Ultra. I use these labels lightly, as even the 'low coverage' preset is in fact, still pretty high quality. +#define FxaaEarlyExit 1 //[0 or 1] Use Fxaa early exit pathing. This basically tells the algorithm to offset only luma-edge detected pixels. When disabled, the entire scene is antialiased(FSAA). 0 is off, 1 is on. -//-[BILINEAR OPTIONS] -#define FilterStrength 1.00 //[0.10 to 1.50] Bilinear filtering strength. Controls the overall strength of the filtering. -#define OffsetAmount 0.0 //[0.0 to 1.5] Pixel offset amount. If you want to use an st offset, 0.5 is generally recommended. 0.0 is off. +//-#[BILINEAR OPTIONS] +#define FilterStrength 1.00 //[0.10 to 1.50] Bilinear filtering strength. Controls the overall strength of the filtering. +#define OffsetAmount 0.0 //[0.0 to 1.5] Pixel offset amount. If you want to use an st offset, 0.5 is generally recommended. 0.0 is off. -//-[BICUBIC OPTIONS] -#define Interpolation Triangular //[CatMullRom, Bell, BSpline, Triangular, Cubic] Type of interpolation to use. From left to right is lighter<-->stronger filtering. Try them out, and use what you prefer. -#define BicubicStrength 0.75 //[0.10 to 1.50] Bicubic filtering strength. Controls the overall strength of the filtering. -#define PixelOffset 0.0 //[0.0 to 1.5] Pixel offset amount. If you want to use an st offset, 0.5 is generally recommended. 0.0 is off. +//-#[BICUBIC OPTIONS] +#define Interpolation Triangular //[CatMullRom, Bell, BSpline, Triangular, Cubic] Type of interpolation to use. From left to right is lighter<-->stronger filtering. Try them out, and use what you prefer. +#define BicubicStrength 0.75 //[0.10 to 1.50] Bicubic filtering strength. Controls the overall strength of the filtering. +#define PixelOffset 0.0 //[0.0 to 1.5] Pixel offset amount. If you want to use an st offset, 0.5 is generally recommended. 0.0 is off. -//-[GAUSSIAN OPTIONS] -#define FilterAmount 1.00 //[0.10 to 1.50] Gaussian filtering strength. Controls the overall strength of the filtering. -#define GaussianSpread 0.75 //[0.50 to 4.00] The filtering spread & offset levels. Controls the sampling spread of the filtering. +//-#[GAUSSIAN OPTIONS] +#define FilterAmount 1.00 //[0.10 to 1.50] Gaussian filtering strength. Controls the overall strength of the filtering. +#define GaussianSpread 0.75 //[0.50 to 4.00] The filtering spread & offset levels. Controls the sampling spread of the filtering. -//-[BLOOM OPTIONS] -#define BloomType BlendBloom //[BlendBloom, BlendScreen, BlendOverlay, BlendAddLight] The type of blend for the bloom (Default: BlendScreen). If using BlendOverlay set ToneAmount to 2.20, or it may be too dark. -#define BloomPower 0.200 //[0.000 to 2.000] Strength of the bloom. You may need to readjust for each blend type. -#define BlendPower 1.000 //[0.000 to 1.500] Strength of the bloom blend. Lower for less blending, higher for more. Default is 1.000. -#define BlendSpread 4.000 //[0.000 to 8.000] Width of the bloom glow spread. Scales with BloomPower. Raising SharpenClamp affects this. 0.000 = off. -#define BloomMixType 1 //[1|2|3] The interpolation mix type between the base colour, and bloom. (Default is 1) BloomPower/BlendSpread may need re-adjusting depending on type. +//-#[BLOOM OPTIONS] +#define BloomType BlendBloom //[BlendBloom, BlendScreen, BlendOverlay, BlendAddLight] The type of blend for the bloom (Default: BlendScreen). If using BlendOverlay set ToneAmount to 2.20, or it may be too dark. +#define BloomPower 0.200 //[0.000 to 2.000] Strength of the bloom. You may need to readjust for each blend type. +#define BlendPower 1.000 //[0.000 to 1.500] Strength of the bloom blend. Lower for less blending, higher for more. Default is 1.000. +#define BlendSpread 4.000 //[0.000 to 8.000] Width of the bloom glow spread. Scales with BloomPower. Raising SharpenClamp affects this. 0.000 = off. +#define BloomMixType 1 //[1|2|3] The interpolation mix type between the base colour, and bloom. (Default is 1) BloomPower/BlendSpread may need re-adjusting depending on type. -//-[TONEMAP OPTIONS] -#define TonemapType 1 //[1 or 2] Type of tone mapping. 1 is Natural(default), 2 is Filmic(cinematic) You might want to increase/decrease ToneAmount to compensate for diff types. -#define ToneAmount 2.15 //[1.00 to 4.00] Tonemapping & Gamma curve (Tonemapping/Shadow correction). Lower values for darker tones, Higher values for lighter tones. Default: 2.20 -#define Luminance 1.00 //[0.10 to 2.00] Luminance Average (luminance correction) Higher values to decrease luminance average, lower values to increase luminance. Adjust by small amounts, eg: increments of 0.1 -#define Exposure 1.00 //[0.10 to 2.00] White Correction (brightness) Higher values = more Exposure, lower = less Exposure. Adjust by small amounts, eg: increments of 0.1 -#define WhitePoint 1.00 //[0.10 to 2.00] Whitepoint Avg (lum correction) Adjust by small amounts, eg: increments of 0.01. Generally it's best left at 1.00. -#define RedCurve 1.00 //[1.00 to 8.00] Red channel component of the RGB correction curve. Use this to reduce/correct the red colour component. Higher values equals more red reduction. 1.00 is default. -#define GreenCurve 1.00 //[1.00 to 8.00] Green channel component of the RGB correction curve. Use this to reduce/correct the green colour component. Higher values equals more green reduction. 1.00 is default. -#define BlueCurve 1.00 //[1.00 to 8.00] Blue channel component of the RGB correction curve. Use this to reduce/correct the blue colour component. Higher values equals more blue reduction. 1.00 is default. +//-#[TONEMAP OPTIONS] +#define TonemapType 1 //[1 or 2] Type of tone mapping. 1 is Natural(default), 2 is Filmic(cinematic) You might want to increase/decrease ToneAmount to compensate for diff types. +#define ToneAmount 2.15 //[1.00 to 4.00] Tonemapping & Gamma curve (Tonemapping/Shadow correction). Lower values for darker tones, Higher values for lighter tones. Default: 2.20 +#define Luminance 1.00 //[0.10 to 2.00] Luminance Average (luminance correction) Higher values to decrease luminance average, lower values to increase luminance. Adjust by small amounts, eg: increments of 0.1 +#define Exposure 1.00 //[0.10 to 2.00] White Correction (brightness) Higher values = more Exposure, lower = less Exposure. Adjust by small amounts, eg: increments of 0.1 +#define WhitePoint 1.00 //[0.10 to 2.00] Whitepoint Avg (lum correction) Adjust by small amounts, eg: increments of 0.01. Generally it's best left at 1.00. +#define RedCurve 1.00 //[1.00 to 8.00] Red channel component of the RGB correction curve. Use this to reduce/correct the red colour component. Higher values equals more red reduction. 1.00 is default. +#define GreenCurve 1.00 //[1.00 to 8.00] Green channel component of the RGB correction curve. Use this to reduce/correct the green colour component. Higher values equals more green reduction. 1.00 is default. +#define BlueCurve 1.00 //[1.00 to 8.00] Blue channel component of the RGB correction curve. Use this to reduce/correct the blue colour component. Higher values equals more blue reduction. 1.00 is default. -//-[CONTRAST OPTIONS] -#define CurveType 0 //[0|1|2] Choose what to apply contrast to. 0 = Luma, 1 = Chroma, 2 = both Luma and Chroma. Default is 0 (Luma) -#define CurvesContrast 0.50 //[0.00 to 2.00] The amount of contrast you want. Controls the overall strength of the texture sharpening. +//-#[CONTRAST OPTIONS] +#define CurveType 0 //[0|1|2] Choose what to apply contrast to. 0 = Luma, 1 = Chroma, 2 = both Luma and Chroma. Default is 0 (Luma) +#define CurvesContrast 0.50 //[0.00 to 2.00] The amount of contrast you want. Controls the overall strength of the texture sharpening. -//-[SHARPEN OPTIONS] -#define SharpeningType 2 //[1 or 2] The type of sharpening to use. Type 1 is the original High Pass Gaussian, and type 2 is a new Bicubic Sampling type. -#define SharpenStrength 0.75 //[0.10 to 2.00] Strength of the texture sharpening effect. This is the maximum strength that will be used. The clamp below limits the minimum, and maximum that is allowed per pixel. -#define SharpenClamp 0.015 //[0.005 to 0.500] Reduces the clamping/limiting on the maximum amount of sharpening each pixel recieves. Raise this to reduce the clamping. -#define SharpenBias 1.50 //[1.00 to 4.00] Sharpening edge bias. Lower values for clean subtle sharpen, and higher values for a deeper textured sharpen. For SharpeningType 2, best stay under ~2.00, or it may look odd. -#define DebugSharpen 0 //[0 or 1] Visualize the sharpening effect. Useful for fine-tuning. +//-#[SHARPEN OPTIONS] +#define SharpeningType 2 //[1 or 2] The type of sharpening to use. Type 1 is the original High Pass Gaussian, and type 2 is a new Bicubic Sampling type. +#define SharpenStrength 0.75 //[0.10 to 2.00] Strength of the texture sharpening effect. This is the maximum strength that will be used. The clamp below limits the minimum, and maximum that is allowed per pixel. +#define SharpenClamp 0.015 //[0.005 to 0.500] Reduces the clamping/limiting on the maximum amount of sharpening each pixel recieves. Raise this to reduce the clamping. +#define SharpenBias 1.50 //[1.00 to 4.00] Sharpening edge bias. Lower values for clean subtle sharpen, and higher values for a deeper textured sharpen. For SharpeningType 2, best stay under ~2.00, or it may look odd. +#define DebugSharpen 0 //[0 or 1] Visualize the sharpening effect. Useful for fine-tuning. -//-[VIBRANCE OPTIONS] -#define Vibrance 0.10 //[-1.00 to 1.00] Intelligently saturates (or desaturates with negative values) pixels depending on their original saturation. 0.00 is original vibrance. +//-#[VIBRANCE OPTIONS] +#define Vibrance 0.10 //[-1.00 to 1.00] Intelligently saturates (or desaturates with negative values) pixels depending on their original saturation. 0.00 is original vibrance. -//-[GAMMA OPTIONS] -#define Gamma 2.2 //Lower values for more Gamma toning(darker), higher Values for brighter (2.2 correction is generally recommended) +//-#[GAMMA OPTIONS] +#define Gamma 2.2 //Lower values for more Gamma toning(darker), higher Values for brighter (2.2 correction is generally recommended) -//-[GRADING OPTIONS] -#define RedGrading 1.02 //[0.0 to 3.0] Red colour grading coefficient. Adjust to influence the red channel coefficients of the grading, and highlight tones. -#define GreenGrading 0.96 //[0.0 to 3.0] Green colour grading coefficient. Adjust to influence the Green channel coefficients of the grading, and highlight tones. -#define BlueGrading 0.88 //[0.0 to 3.0] Blue colour grading coefficient. Adjust to influence the Blue channel coefficients of the grading, and highlight tones. -#define GradingStrength 0.40 //[0.00 to 1.00] The overall max strength of the colour grading effect. Raise to increase, lower to decrease the amount. -#define Correlation 0.50 //[0.10 to 1.00] Correlation between the base colour, and the grading influence. Lower = more of the scene is graded, Higher = less of the scene is graded. +//-#[GRADING OPTIONS] +#define RedGrading 1.02 //[0.0 to 3.0] Red colour grading coefficient. Adjust to influence the red channel coefficients of the grading, and highlight tones. +#define GreenGrading 0.96 //[0.0 to 3.0] Green colour grading coefficient. Adjust to influence the Green channel coefficients of the grading, and highlight tones. +#define BlueGrading 0.88 //[0.0 to 3.0] Blue colour grading coefficient. Adjust to influence the Blue channel coefficients of the grading, and highlight tones. +#define GradingStrength 0.40 //[0.00 to 1.00] The overall max strength of the colour grading effect. Raise to increase, lower to decrease the amount. +#define Correlation 0.50 //[0.10 to 1.00] Correlation between the base colour, and the grading influence. Lower = more of the scene is graded, Higher = less of the scene is graded. -//-[TOON OPTIONS] -#define EdgeStrength 1.40 //[0.00 to 4.00] Strength of the cel edge outline effect. 0.00 = no outlines. -#define EdgeFilter 0.60 //[0.10 to 2.00] Raise this to filter out fainter cel edges. You might need to increase the power to compensate, when raising this. -#define EdgeThickness 1.25 //[0.50 to 4.00] Thickness of the cel edges. Decrease for thinner outlining, Increase for thicker outlining. 1.00 is default. -#define PaletteType 2 //[1|2|3] The colour palette to use. 1 is Original, 2 is Animated Shading, 3 is Water Painting (Default is 2: Animated Shading). Below options don't affect palette 1. -#define UseYuvLuma 0 //[0 or 1] Uses YUV luma calculations, or base colour luma calculations. 0 is base luma, 1 is Yuv luma. Color luma can be more accurate. Yuv luma can be better for a shaded look. -#define LumaConversion 1 //[0 or 1] Uses BT.601, or BT.709, RGB<-YUV->RGB conversions. Some games prefer 601, but most prefer 709. BT.709 is typically recommended. -#define ColorRounding 0 //[0 or 1] Uses rounding methods on colors. This can emphasise shaded toon colors. Looks good in some games, and odd in others. Try it in-game and see. +//-#[TOON OPTIONS] +#define EdgeStrength 1.40 //[0.00 to 4.00] Strength of the cel edge outline effect. 0.00 = no outlines. +#define EdgeFilter 0.60 //[0.10 to 2.00] Raise this to filter out fainter cel edges. You might need to increase the power to compensate, when raising this. +#define EdgeThickness 1.25 //[0.50 to 4.00] Thickness of the cel edges. Decrease for thinner outlining, Increase for thicker outlining. 1.00 is default. +#define PaletteType 2 //[1|2|3] The colour palette to use. 1 is Original, 2 is Animated Shading, 3 is Water Painting (Default is 2: Animated Shading). Below options don't affect palette 1. +#define UseYuvLuma 0 //[0 or 1] Uses YUV luma calculations, or base colour luma calculations. 0 is base luma, 1 is Yuv luma. Color luma can be more accurate. Yuv luma can be better for a shaded look. +#define LumaConversion 1 //[0 or 1] Uses BT.601, or BT.709, RGB<-YUV->RGB conversions. Some games prefer 601, but most prefer 709. BT.709 is typically recommended. +#define ColorRounding 0 //[0 or 1] Uses rounding methods on colors. This can emphasise shaded toon colors. Looks good in some games, and odd in others. Try it in-game and see. -//-[SCANLINE OPTIONS] -#define ScanlineType 0 //[0|1|2|3] The type & orientation of the scanlines. 0 is x(horizontal), 1 is y(vertical), 2 is both(xy), ScanlineType 3 is a different algorithm, to work around PCSX2's IR scaling. -#define ScanlineScale 0.50 //[0.20 to 2.00] The scaling & thickness of the scanlines. Changing this can help with PCSX2 IR scaling problems. Defaults: 0.50 for ScanlineType 0|1|2, (1.20 for ScanlineType 3, use 1.0 with low IR (lower than 3x)). -#define ScanlineIntensity 0.18 //[0.10 to 1.00] The intensity of the scanlines. Defaults: 0.20 for ScanlineType 0|1|2, 0.50 for ScanlineType 3. -#define ScanlineBrightness 2.00 //[0.50 to 2.00] The brightness of the scanlines. Defaults: 1.75 for ScanlineType 0|1|2, 1.50 for ScanlineType 3. +//-#[SCANLINE OPTIONS] +#define ScanlineType 0 //[0|1|2|3] The type & orientation of the scanlines. 0 is x(horizontal), 1 is y(vertical), 2 is both(xy), ScanlineType 3 is a different algorithm, to work around PCSX2's IR scaling. +#define ScanlineScale 0.50 //[0.20 to 2.00] The scaling & thickness of the scanlines. Changing this can help with PCSX2 IR scaling problems. Defaults: 0.50 for ScanlineType 0|1|2, (1.20 for ScanlineType 3, use 1.0 with low IR (lower than 3x)). +#define ScanlineIntensity 0.18 //[0.10 to 1.00] The intensity of the scanlines. Defaults: 0.20 for ScanlineType 0|1|2, 0.50 for ScanlineType 3. +#define ScanlineBrightness 2.00 //[0.50 to 2.00] The brightness of the scanlines. Defaults: 1.75 for ScanlineType 0|1|2, 1.50 for ScanlineType 3. -//-[VIGNETTE OPTIONS] -#define VignetteRatio 1.77 //[0.15 to 6.00] Sets the espect ratio of the vignette. 1.77 for 16:9, 1.60 for 16:10, 1.33 for 4:3, 1.00 for 1:1. -#define VignetteRadius 1.00 //[0.50 to 3.00] Radius of the vignette effect. Lower values for stronger radial effect from center -#define VignetteAmount 0.25 //[0.00 to 1.00] Strength of black edge occlusion. Increase for higher strength, decrease for lower. -#define VignetteSlope 12 //[2|4|8|10|12|16] How far away from the center the vignetting will start. +//-#[VIGNETTE OPTIONS] +#define VignetteRatio 1.77 //[0.15 to 6.00] Sets the espect ratio of the vignette. 1.77 for 16:9, 1.60 for 16:10, 1.33 for 4:3, 1.00 for 1:1. +#define VignetteRadius 1.00 //[0.50 to 3.00] Radius of the vignette effect. Lower values for stronger radial effect from center +#define VignetteAmount 0.25 //[0.00 to 1.00] Strength of black edge occlusion. Increase for higher strength, decrease for lower. +#define VignetteSlope 12 //[2|4|8|10|12|16] How far away from the center the vignetting will start. -//-[DITHERING OPTIONS] -#define DitherMethod 2 //[1 or 2] 1 is Ordering dithering(faster, lower quality), 2 is Random dithering (better dithering, but not as fast) +//-#[DITHERING OPTIONS] +#define DitherMethod 2 //[1 or 2] 1 is Ordering dithering(faster, lower quality), 2 is Random dithering (better dithering, but not as fast) //-[END OF USER OPTIONS] \ No newline at end of file diff --git a/bin/shader.fx b/bin/shader.fx index 9e1784e71c..5ab1c0fb7c 100644 --- a/bin/shader.fx +++ b/bin/shader.fx @@ -1,27 +1,26 @@ /*===============================================================================*\ -|######################### [GSdx FX 2.00 Revised] #########################| -|########################### By Asmodean ##########################| -|| || -|| This program is free software; you can redistribute it and/or || -|| modify it under the terms of the GNU General Public License || -|| as published by the Free Software Foundation; either version 2 || -|| of the License, or (at your option) any later version. || -|| || -|| This program is distributed in the hope that it will be useful, || -|| but WITHOUT ANY WARRANTY; without even the implied warranty of || -|| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the || -|| GNU General Public License for more details. (c)2014 || -|| || +|######################## [GSdx FX 2.00 Revised] ########################| +|########################## By Asmodean ##########################| +|| || +|| This program is free software; you can redistribute it and/or || +|| modify it under the terms of the GNU General Public License || +|| as published by the Free Software Foundation; either version 2 || +|| of the License, or (at your option) any later version. || +|| || +|| This program is distributed in the hope that it will be useful, || +|| but WITHOUT ANY WARRANTY; without even the implied warranty of || +|| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the || +|| GNU General Public License for more details. (c)2014 || +|| || |#################################################################################| \*===============================================================================*/ #include "GSdx_FX_Settings.ini" /*------------------------------------------------------------------------------ - [GLOBALS|FUNCTIONS] + [GLOBALS|FUNCTIONS] ------------------------------------------------------------------------------*/ Texture2D Texture : register(t0); - SamplerState TextureSampler : register(s0); SamplerState BloomSampler : register(s1); @@ -70,7 +69,7 @@ float TrueLuminance(float3 color) if (b <= r) { minRGB = b; } if (b <= g) { minRGB = b; } - float lumin = ((maxRGB + minRGB)/2); + float lumin = ((maxRGB + minRGB) / 2); return lumin; } @@ -84,13 +83,13 @@ float3 RGBGammaToLinear(float3 color, float gamma) { color = abs(color); - color.r = (color.r <= 0.0404482362771082) ? saturate(color.r / 12.92) : + color.r = (color.r <= 0.0404482362771082) ? saturate(color.r / 12.92) : saturate(pow((color.r + 0.055) / 1.055, gamma)); - color.g = (color.g <= 0.0404482362771082) ? saturate(color.g / 12.92) : + color.g = (color.g <= 0.0404482362771082) ? saturate(color.g / 12.92) : saturate(pow((color.g + 0.055) / 1.055, gamma)); - color.b = (color.b <= 0.0404482362771082) ? saturate(color.b / 12.92) : + color.b = (color.b <= 0.0404482362771082) ? saturate(color.b / 12.92) : saturate(pow((color.b + 0.055) / 1.055, gamma)); return color; @@ -100,13 +99,13 @@ float3 LinearToRGBGamma(float3 color, float gamma) { color = abs(color); - color.r = (color.r <= 0.00313066844250063) ? saturate(color.r * 12.92) : 1.055 * + color.r = (color.r <= 0.00313066844250063) ? saturate(color.r * 12.92) : 1.055 * saturate(pow(color.r, 1.0 / gamma)) - 0.055; - color.g = (color.g <= 0.00313066844250063) ? saturate(color.g * 12.92) : 1.055 * + color.g = (color.g <= 0.00313066844250063) ? saturate(color.g * 12.92) : 1.055 * saturate(pow(color.g, 1.0 / gamma)) - 0.055; - color.b = (color.b <= 0.00313066844250063) ? saturate(color.b * 12.92) : 1.055 * + color.b = (color.b <= 0.00313066844250063) ? saturate(color.b * 12.92) : 1.055 * saturate(pow(color.b, 1.0 / gamma)) - 0.055; return color; @@ -117,25 +116,11 @@ float3 LinearToRGBGamma(float3 color, float gamma) #define InverseGammaCorrection(color, gamma) pow(color, 1.0/gamma) /*------------------------------------------------------------------------------ - [VERTEX CODE SECTION] -------------------------------------------------------------------------------*/ - -VS_OUTPUT vs_main(VS_INPUT input) -{ - VS_OUTPUT output; - - output.p = input.p; - output.t = input.t; - - return output; -} - -/*------------------------------------------------------------------------------ - [GAMMA PREPASS CODE SECTION] + [GAMMA PREPASS CODE SECTION] ------------------------------------------------------------------------------*/ float4 PreGammaPass(float4 color, float2 uv0) -{ +{ color = Texture.Sample(TextureSampler, uv0); color.rgb = RGBGammaToLinear(color.rgb, GammaConst); color.rgb = LinearToRGBGamma(color.rgb, GammaConst); @@ -145,112 +130,76 @@ float4 PreGammaPass(float4 color, float2 uv0) } /*------------------------------------------------------------------------------ - [FXAA CODE SECTION] + [FXAA CODE SECTION] ------------------------------------------------------------------------------*/ #if (UHQ_FXAA == 1) #if (SHADER_MODEL >= 0x500) - #define FXAA_HLSL_5 1 - #define FXAA_GATHER4_ALPHA 1 +#define FXAA_HLSL_5 1 +#define FXAA_GATHER4_ALPHA 1 #elif (SHADER_MODEL >= 0x400) - #define FXAA_HLSL_4 1 - #define FXAA_GATHER4_ALPHA 0 +#define FXAA_HLSL_4 1 +#define FXAA_GATHER4_ALPHA 0 #endif #if (FxaaQuality == 4) - #define FxaaEdgeThreshold 0.033 - #define FxaaEdgeThresholdMin 0.0 - #define FXAA_QUALITY__PS 14 - #define FXAA_QUALITY__P0 1.0 - #define FXAA_QUALITY__P1 1.0 - #define FXAA_QUALITY__P2 1.0 - #define FXAA_QUALITY__P3 1.0 - #define FXAA_QUALITY__P4 1.0 - #define FXAA_QUALITY__P5 1.5 - #define FXAA_QUALITY__P6 2.0 - #define FXAA_QUALITY__P7 2.0 - #define FXAA_QUALITY__P8 2.0 - #define FXAA_QUALITY__P9 2.0 - #define FXAA_QUALITY__P10 4.0 - #define FXAA_QUALITY__P11 8.0 - #define FXAA_QUALITY__P12 8.0 - +#define FxaaEdgeThreshold 0.033 +#define FxaaEdgeThresholdMin 0.0 #elif (FxaaQuality == 3) - #define FxaaEdgeThreshold 0.125 - #define FxaaEdgeThresholdMin 0.0312 - #define FXAA_QUALITY__PS 12 - #define FXAA_QUALITY__P0 1.0 - #define FXAA_QUALITY__P1 1.5 - #define FXAA_QUALITY__P2 2.0 - #define FXAA_QUALITY__P3 2.0 - #define FXAA_QUALITY__P4 2.0 - #define FXAA_QUALITY__P5 2.0 - #define FXAA_QUALITY__P6 2.0 - #define FXAA_QUALITY__P7 2.0 - #define FXAA_QUALITY__P8 2.0 - #define FXAA_QUALITY__P9 2.0 - #define FXAA_QUALITY__P10 4.0 - #define FXAA_QUALITY__P11 8.0 - +#define FxaaEdgeThreshold 0.125 +#define FxaaEdgeThresholdMin 0.0312 #elif (FxaaQuality == 2) - #define FxaaEdgeThreshold 0.166 - #define FxaaEdgeThresholdMin 0.0625 - #define FXAA_QUALITY__PS 10 - #define FXAA_QUALITY__P0 1.0 - #define FXAA_QUALITY__P1 1.5 - #define FXAA_QUALITY__P2 2.0 - #define FXAA_QUALITY__P3 2.0 - #define FXAA_QUALITY__P4 2.0 - #define FXAA_QUALITY__P5 2.0 - #define FXAA_QUALITY__P6 2.0 - #define FXAA_QUALITY__P7 2.0 - #define FXAA_QUALITY__P8 4.0 - #define FXAA_QUALITY__P9 8.0 - +#define FxaaEdgeThreshold 0.166 +#define FxaaEdgeThresholdMin 0.0625 #elif (FxaaQuality == 1) - #define FxaaEdgeThreshold 0.250 - #define FxaaEdgeThresholdMin 0.0833 - #define FXAA_QUALITY__PS 8 - #define FXAA_QUALITY__P0 1.0 - #define FXAA_QUALITY__P1 1.5 - #define FXAA_QUALITY__P2 2.0 - #define FXAA_QUALITY__P3 2.0 - #define FXAA_QUALITY__P4 2.0 - #define FXAA_QUALITY__P5 2.0 - #define FXAA_QUALITY__P6 4.0 - #define FXAA_QUALITY__P7 12.0 +#define FxaaEdgeThreshold 0.250 +#define FxaaEdgeThresholdMin 0.0833 #endif #if (FXAA_HLSL_5 == 1) - struct FxaaTex { SamplerState smpl; Texture2D tex; }; - #define FxaaTexTop(t, p) t.tex.SampleLevel(t.smpl, p, 0.0) - #define FxaaTexOff(t, p, o, r) t.tex.SampleLevel(t.smpl, p, 0.0, o) - #define FxaaTexAlpha4(t, p) t.tex.GatherAlpha(t.smpl, p) - #define FxaaTexOffAlpha4(t, p, o) t.tex.GatherAlpha(t.smpl, p, o) - #define FxaaDiscard clip(-1) - #define FxaaSat(x) saturate(x) +struct FxaaTex { SamplerState smpl; Texture2D tex; }; +#define FxaaTexTop(t, p) t.tex.SampleLevel(t.smpl, p, 0.0) +#define FxaaTexOff(t, p, o, r) t.tex.SampleLevel(t.smpl, p, 0.0, o) +#define FxaaTexAlpha4(t, p) t.tex.GatherAlpha(t.smpl, p) +#define FxaaTexOffAlpha4(t, p, o) t.tex.GatherAlpha(t.smpl, p, o) +#define FxaaDiscard clip(-1) +#define FxaaSat(x) saturate(x) #elif (FXAA_HLSL_4 == 1) - struct FxaaTex { SamplerState smpl; Texture2D tex; }; - #define FxaaTexTop(t, p) t.tex.SampleLevel(t.smpl, p, 0.0) - #define FxaaTexOff(t, p, o, r) t.tex.SampleLevel(t.smpl, p, 0.0, o) - #define FxaaDiscard clip(-1) - #define FxaaSat(x) saturate(x) +struct FxaaTex { SamplerState smpl; Texture2D tex; }; +#define FxaaTexTop(t, p) t.tex.SampleLevel(t.smpl, p, 0.0) +#define FxaaTexOff(t, p, o, r) t.tex.SampleLevel(t.smpl, p, 0.0, o) +#define FxaaDiscard clip(-1) +#define FxaaSat(x) saturate(x) #endif +#define FXAA_QUALITY__P0 1.0 +#define FXAA_QUALITY__P1 1.0 +#define FXAA_QUALITY__P2 1.0 +#define FXAA_QUALITY__P3 1.0 +#define FXAA_QUALITY__P4 1.0 +#define FXAA_QUALITY__P5 1.5 +#define FXAA_QUALITY__P6 2.0 +#define FXAA_QUALITY__P7 2.0 +#define FXAA_QUALITY__P8 2.0 +#define FXAA_QUALITY__P9 2.0 +#define FXAA_QUALITY__P10 4.0 +#define FXAA_QUALITY__P11 8.0 +#define FXAA_QUALITY__P12 8.0 + float FxaaLuma(float4 rgba) -{ +{ rgba.w = RGBLuminance(rgba.xyz); - return rgba.w; + return rgba.w; } float4 FxaaPixelShader(float2 pos, FxaaTex tex, float2 fxaaRcpFrame, float fxaaSubpix, float fxaaEdgeThreshold, float fxaaEdgeThresholdMin) { - float2 posM; - posM.x = pos.x; - posM.y = pos.y; + float2 posM; + posM.x = pos.x; + posM.y = pos.y; - #if (FXAA_GATHER4_ALPHA == 1) + #if (FXAA_GATHER4_ALPHA == 1) float4 rgbyM = FxaaTexTop(tex, posM); float4 luma4A = FxaaTexAlpha4(tex, posM); float4 luma4B = FxaaTexOffAlpha4(tex, posM, int2(-1, -1)); @@ -263,8 +212,8 @@ float4 FxaaPixelShader(float2 pos, FxaaTex tex, float2 fxaaRcpFrame, float fxaaS #define lumaNW luma4B.w #define lumaN luma4B.z #define lumaW luma4B.x - #else - + + #else float4 rgbyM = FxaaTexTop(tex, posM); rgbyM.w = RGBLuminance(rgbyM.xyz); #define lumaM rgbyM.w @@ -273,27 +222,27 @@ float4 FxaaPixelShader(float2 pos, FxaaTex tex, float2 fxaaRcpFrame, float fxaaS float lumaE = FxaaLuma(FxaaTexOff(tex, posM, int2( 1, 0), fxaaRcpFrame.xy)); float lumaN = FxaaLuma(FxaaTexOff(tex, posM, int2( 0,-1), fxaaRcpFrame.xy)); float lumaW = FxaaLuma(FxaaTexOff(tex, posM, int2(-1, 0), fxaaRcpFrame.xy)); - #endif - - float maxSM = max(lumaS, lumaM); - float minSM = min(lumaS, lumaM); - float maxESM = max(lumaE, maxSM); - float minESM = min(lumaE, minSM); - float maxWN = max(lumaN, lumaW); - float minWN = min(lumaN, lumaW); - float rangeMax = max(maxWN, maxESM); - float rangeMin = min(minWN, minESM); - float range = rangeMax - rangeMin; - float rangeMaxScaled = rangeMax * fxaaEdgeThreshold; - float rangeMaxClamped = max(fxaaEdgeThresholdMin, rangeMaxScaled); - - bool earlyExit = range < rangeMaxClamped; - #if (FxaaEarlyExit == 1) - if(earlyExit) - { return rgbyM; } #endif - #if (FXAA_GATHER4_ALPHA == 0) + float maxSM = max(lumaS, lumaM); + float minSM = min(lumaS, lumaM); + float maxESM = max(lumaE, maxSM); + float minESM = min(lumaE, minSM); + float maxWN = max(lumaN, lumaW); + float minWN = min(lumaN, lumaW); + + float rangeMax = max(maxWN, maxESM); + float rangeMin = min(minWN, minESM); + float range = rangeMax - rangeMin; + float rangeMaxScaled = rangeMax * fxaaEdgeThreshold; + float rangeMaxClamped = max(fxaaEdgeThresholdMin, rangeMaxScaled); + + bool earlyExit = range < rangeMaxClamped; + #if (FxaaEarlyExit == 1) + if(earlyExit) { return rgbyM; } + #endif + + #if (FXAA_GATHER4_ALPHA == 0) float lumaNW = FxaaLuma(FxaaTexOff(tex, posM, int2(-1,-1), fxaaRcpFrame.xy)); float lumaSE = FxaaLuma(FxaaTexOff(tex, posM, int2( 1, 1), fxaaRcpFrame.xy)); float lumaNE = FxaaLuma(FxaaTexOff(tex, posM, int2( 1,-1), fxaaRcpFrame.xy)); @@ -303,79 +252,78 @@ float4 FxaaPixelShader(float2 pos, FxaaTex tex, float2 fxaaRcpFrame, float fxaaS float lumaSW = FxaaLuma(FxaaTexOff(tex, posM, int2(-1, 1), fxaaRcpFrame.xy)); #endif - float lumaNS = lumaN + lumaS; - float lumaWE = lumaW + lumaE; - float subpixRcpRange = 1.0/range; - float subpixNSWE = lumaNS + lumaWE; - float edgeHorz1 = (-2.0 * lumaM) + lumaNS; - float edgeVert1 = (-2.0 * lumaM) + lumaWE; + float lumaNS = lumaN + lumaS; + float lumaWE = lumaW + lumaE; + float subpixRcpRange = 1.0/range; + float subpixNSWE = lumaNS + lumaWE; + float edgeHorz1 = (-2.0 * lumaM) + lumaNS; + float edgeVert1 = (-2.0 * lumaM) + lumaWE; + float lumaNESE = lumaNE + lumaSE; + float lumaNWNE = lumaNW + lumaNE; + float edgeHorz2 = (-2.0 * lumaE) + lumaNESE; + float edgeVert2 = (-2.0 * lumaN) + lumaNWNE; - float lumaNESE = lumaNE + lumaSE; - float lumaNWNE = lumaNW + lumaNE; - float edgeHorz2 = (-2.0 * lumaE) + lumaNESE; - float edgeVert2 = (-2.0 * lumaN) + lumaNWNE; + float lumaNWSW = lumaNW + lumaSW; + float lumaSWSE = lumaSW + lumaSE; + float edgeHorz4 = (abs(edgeHorz1) * 2.0) + abs(edgeHorz2); + float edgeVert4 = (abs(edgeVert1) * 2.0) + abs(edgeVert2); + float edgeHorz3 = (-2.0 * lumaW) + lumaNWSW; + float edgeVert3 = (-2.0 * lumaS) + lumaSWSE; + float edgeHorz = abs(edgeHorz3) + edgeHorz4; + float edgeVert = abs(edgeVert3) + edgeVert4; - float lumaNWSW = lumaNW + lumaSW; - float lumaSWSE = lumaSW + lumaSE; - float edgeHorz4 = (abs(edgeHorz1) * 2.0) + abs(edgeHorz2); - float edgeVert4 = (abs(edgeVert1) * 2.0) + abs(edgeVert2); - float edgeHorz3 = (-2.0 * lumaW) + lumaNWSW; - float edgeVert3 = (-2.0 * lumaS) + lumaSWSE; - float edgeHorz = abs(edgeHorz3) + edgeHorz4; - float edgeVert = abs(edgeVert3) + edgeVert4; + float subpixNWSWNESE = lumaNWSW + lumaNESE; + float lengthSign = fxaaRcpFrame.x; + bool horzSpan = edgeHorz >= edgeVert; + float subpixA = subpixNSWE * 2.0 + subpixNWSWNESE; + if(!horzSpan) lumaN = lumaW; + if(!horzSpan) lumaS = lumaE; + if(horzSpan) lengthSign = fxaaRcpFrame.y; + float subpixB = (subpixA * (1.0/12.0)) - lumaM; - float subpixNWSWNESE = lumaNWSW + lumaNESE; - float lengthSign = fxaaRcpFrame.x; - bool horzSpan = edgeHorz >= edgeVert; - float subpixA = subpixNSWE * 2.0 + subpixNWSWNESE; + float gradientN = lumaN - lumaM; + float gradientS = lumaS - lumaM; + float lumaNN = lumaN + lumaM; + float lumaSS = lumaS + lumaM; + bool pairN = abs(gradientN) >= abs(gradientS); + float gradient = max(abs(gradientN), abs(gradientS)); + if(pairN) lengthSign = -lengthSign; + float subpixC = FxaaSat(abs(subpixB) * subpixRcpRange); - if(!horzSpan) lumaN = lumaW; - if(!horzSpan) lumaS = lumaE; - if(horzSpan) lengthSign = fxaaRcpFrame.y; - float subpixB = (subpixA * (1.0/12.0)) - lumaM; + float2 posB; + posB.x = posM.x; + posB.y = posM.y; + float2 offNP; + offNP.x = (!horzSpan) ? 0.0 : fxaaRcpFrame.x; + offNP.y = ( horzSpan) ? 0.0 : fxaaRcpFrame.y; + if(!horzSpan) posB.x += lengthSign * 0.5; + if( horzSpan) posB.y += lengthSign * 0.5; - float gradientN = lumaN - lumaM; - float gradientS = lumaS - lumaM; - float lumaNN = lumaN + lumaM; - float lumaSS = lumaS + lumaM; - bool pairN = abs(gradientN) >= abs(gradientS); - float gradient = max(abs(gradientN), abs(gradientS)); - if(pairN) lengthSign = -lengthSign; - float subpixC = FxaaSat(abs(subpixB) * subpixRcpRange); + float2 posN; + posN.x = posB.x - offNP.x * FXAA_QUALITY__P0; + posN.y = posB.y - offNP.y * FXAA_QUALITY__P0; + float2 posP; + posP.x = posB.x + offNP.x * FXAA_QUALITY__P0; + posP.y = posB.y + offNP.y * FXAA_QUALITY__P0; + float subpixD = ((-2.0)*subpixC) + 3.0; + float lumaEndN = FxaaLuma(FxaaTexTop(tex, posN)); + float subpixE = subpixC * subpixC; + float lumaEndP = FxaaLuma(FxaaTexTop(tex, posP)); - float2 posB; - posB.x = posM.x; - posB.y = posM.y; - float2 offNP; - offNP.x = (!horzSpan) ? 0.0 : fxaaRcpFrame.x; - offNP.y = ( horzSpan) ? 0.0 : fxaaRcpFrame.y; - if(!horzSpan) posB.x += lengthSign * 0.5; - if( horzSpan) posB.y += lengthSign * 0.5; - float2 posN; - posN.x = posB.x - offNP.x * FXAA_QUALITY__P0; - posN.y = posB.y - offNP.y * FXAA_QUALITY__P0; - float2 posP; - posP.x = posB.x + offNP.x * FXAA_QUALITY__P0; - posP.y = posB.y + offNP.y * FXAA_QUALITY__P0; - float subpixD = ((-2.0)*subpixC) + 3.0; - float lumaEndN = FxaaLuma(FxaaTexTop(tex, posN)); - float subpixE = subpixC * subpixC; - float lumaEndP = FxaaLuma(FxaaTexTop(tex, posP)); - - if(!pairN) lumaNN = lumaSS; - float gradientScaled = gradient * 1.0/4.0; - float lumaMM = lumaM - lumaNN * 0.5; - float subpixF = subpixD * subpixE; - bool lumaMLTZero = lumaMM < 0.0; - lumaEndN -= lumaNN * 0.5; - lumaEndP -= lumaNN * 0.5; - bool doneN = abs(lumaEndN) >= gradientScaled; - bool doneP = abs(lumaEndP) >= gradientScaled; - if(!doneN) posN.x -= offNP.x * FXAA_QUALITY__P1; - if(!doneN) posN.y -= offNP.y * FXAA_QUALITY__P1; - bool doneNP = (!doneN) || (!doneP); - if(!doneP) posP.x += offNP.x * FXAA_QUALITY__P1; - if(!doneP) posP.y += offNP.y * FXAA_QUALITY__P1; + if(!pairN) lumaNN = lumaSS; + float gradientScaled = gradient * 1.0/4.0; + float lumaMM = lumaM - lumaNN * 0.5; + float subpixF = subpixD * subpixE; + bool lumaMLTZero = lumaMM < 0.0; + lumaEndN -= lumaNN * 0.5; + lumaEndP -= lumaNN * 0.5; + bool doneN = abs(lumaEndN) >= gradientScaled; + bool doneP = abs(lumaEndP) >= gradientScaled; + if(!doneN) posN.x -= offNP.x * FXAA_QUALITY__P1; + if(!doneN) posN.y -= offNP.y * FXAA_QUALITY__P1; + bool doneNP = (!doneN) || (!doneP); + if(!doneP) posP.x += offNP.x * FXAA_QUALITY__P1; + if(!doneP) posP.y += offNP.y * FXAA_QUALITY__P1; if(doneNP) { if(!doneN) lumaEndN = FxaaLuma(FxaaTexTop(tex, posN.xy)); @@ -390,7 +338,6 @@ float4 FxaaPixelShader(float2 pos, FxaaTex tex, float2 fxaaRcpFrame, float fxaaS if(!doneP) posP.x += offNP.x * FXAA_QUALITY__P2; if(!doneP) posP.y += offNP.y * FXAA_QUALITY__P2; - #if (FXAA_QUALITY__PS > 3) if(doneNP) { if(!doneN) lumaEndN = FxaaLuma(FxaaTexTop(tex, posN.xy)); if(!doneP) lumaEndP = FxaaLuma(FxaaTexTop(tex, posP.xy)); @@ -404,7 +351,6 @@ float4 FxaaPixelShader(float2 pos, FxaaTex tex, float2 fxaaRcpFrame, float fxaaS if(!doneP) posP.x += offNP.x * FXAA_QUALITY__P3; if(!doneP) posP.y += offNP.y * FXAA_QUALITY__P3; - #if (FXAA_QUALITY__PS > 4) if(doneNP) { if(!doneN) lumaEndN = FxaaLuma(FxaaTexTop(tex, posN.xy)); if(!doneP) lumaEndP = FxaaLuma(FxaaTexTop(tex, posP.xy)); @@ -418,7 +364,6 @@ float4 FxaaPixelShader(float2 pos, FxaaTex tex, float2 fxaaRcpFrame, float fxaaS if(!doneP) posP.x += offNP.x * FXAA_QUALITY__P4; if(!doneP) posP.y += offNP.y * FXAA_QUALITY__P4; - #if (FXAA_QUALITY__PS > 5) if(doneNP) { if(!doneN) lumaEndN = FxaaLuma(FxaaTexTop(tex, posN.xy)); if(!doneP) lumaEndP = FxaaLuma(FxaaTexTop(tex, posP.xy)); @@ -432,7 +377,6 @@ float4 FxaaPixelShader(float2 pos, FxaaTex tex, float2 fxaaRcpFrame, float fxaaS if(!doneP) posP.x += offNP.x * FXAA_QUALITY__P5; if(!doneP) posP.y += offNP.y * FXAA_QUALITY__P5; - #if (FXAA_QUALITY__PS > 6) if(doneNP) { if(!doneN) lumaEndN = FxaaLuma(FxaaTexTop(tex, posN.xy)); if(!doneP) lumaEndP = FxaaLuma(FxaaTexTop(tex, posP.xy)); @@ -446,7 +390,6 @@ float4 FxaaPixelShader(float2 pos, FxaaTex tex, float2 fxaaRcpFrame, float fxaaS if(!doneP) posP.x += offNP.x * FXAA_QUALITY__P6; if(!doneP) posP.y += offNP.y * FXAA_QUALITY__P6; - #if (FXAA_QUALITY__PS > 7) if(doneNP) { if(!doneN) lumaEndN = FxaaLuma(FxaaTexTop(tex, posN.xy)); if(!doneP) lumaEndP = FxaaLuma(FxaaTexTop(tex, posP.xy)); @@ -460,7 +403,6 @@ float4 FxaaPixelShader(float2 pos, FxaaTex tex, float2 fxaaRcpFrame, float fxaaS if(!doneP) posP.x += offNP.x * FXAA_QUALITY__P7; if(!doneP) posP.y += offNP.y * FXAA_QUALITY__P7; - #if (FXAA_QUALITY__PS > 8) if(doneNP) { if(!doneN) lumaEndN = FxaaLuma(FxaaTexTop(tex, posN.xy)); if(!doneP) lumaEndP = FxaaLuma(FxaaTexTop(tex, posP.xy)); @@ -474,7 +416,6 @@ float4 FxaaPixelShader(float2 pos, FxaaTex tex, float2 fxaaRcpFrame, float fxaaS if(!doneP) posP.x += offNP.x * FXAA_QUALITY__P8; if(!doneP) posP.y += offNP.y * FXAA_QUALITY__P8; - #if (FXAA_QUALITY__PS > 9) if(doneNP) { if(!doneN) lumaEndN = FxaaLuma(FxaaTexTop(tex, posN.xy)); if(!doneP) lumaEndP = FxaaLuma(FxaaTexTop(tex, posP.xy)); @@ -488,7 +429,6 @@ float4 FxaaPixelShader(float2 pos, FxaaTex tex, float2 fxaaRcpFrame, float fxaaS if(!doneP) posP.x += offNP.x * FXAA_QUALITY__P9; if(!doneP) posP.y += offNP.y * FXAA_QUALITY__P9; - #if (FXAA_QUALITY__PS > 10) if(doneNP) { if(!doneN) lumaEndN = FxaaLuma(FxaaTexTop(tex, posN.xy)); if(!doneP) lumaEndP = FxaaLuma(FxaaTexTop(tex, posP.xy)); @@ -502,7 +442,6 @@ float4 FxaaPixelShader(float2 pos, FxaaTex tex, float2 fxaaRcpFrame, float fxaaS if(!doneP) posP.x += offNP.x * FXAA_QUALITY__P10; if(!doneP) posP.y += offNP.y * FXAA_QUALITY__P10; - #if (FXAA_QUALITY__PS > 11) if(doneNP) { if(!doneN) lumaEndN = FxaaLuma(FxaaTexTop(tex, posN.xy)); if(!doneP) lumaEndP = FxaaLuma(FxaaTexTop(tex, posP.xy)); @@ -516,7 +455,6 @@ float4 FxaaPixelShader(float2 pos, FxaaTex tex, float2 fxaaRcpFrame, float fxaaS if(!doneP) posP.x += offNP.x * FXAA_QUALITY__P11; if(!doneP) posP.y += offNP.y * FXAA_QUALITY__P11; - #if (FXAA_QUALITY__PS > 12) if(doneNP) { if(!doneN) lumaEndN = FxaaLuma(FxaaTexTop(tex, posN.xy)); if(!doneP) lumaEndP = FxaaLuma(FxaaTexTop(tex, posP.xy)); @@ -529,48 +467,29 @@ float4 FxaaPixelShader(float2 pos, FxaaTex tex, float2 fxaaRcpFrame, float fxaaS doneNP = (!doneN) || (!doneP); if(!doneP) posP.x += offNP.x * FXAA_QUALITY__P12; if(!doneP) posP.y += offNP.y * FXAA_QUALITY__P12; - } - #endif - } - #endif - } - #endif - } - #endif - } - #endif - } - #endif - } - #endif - } - #endif - } - #endif - } - #endif - } - float dstN = posM.x - posN.x; - float dstP = posP.x - posM.x; - if(!horzSpan) dstN = posM.y - posN.y; - if(!horzSpan) dstP = posP.y - posM.y; + }}}}}}}}}}} - bool goodSpanN = (lumaEndN < 0.0) != lumaMLTZero; - float spanLength = (dstP + dstN); - bool goodSpanP = (lumaEndP < 0.0) != lumaMLTZero; - float spanLengthRcp = 1.0/spanLength; + float dstN = posM.x - posN.x; + float dstP = posP.x - posM.x; + if(!horzSpan) dstN = posM.y - posN.y; + if(!horzSpan) dstP = posP.y - posM.y; - bool directionN = dstN < dstP; - float dst = min(dstN, dstP); - bool goodSpan = directionN ? goodSpanN : goodSpanP; - float subpixG = subpixF * subpixF; - float pixelOffset = (dst * (-spanLengthRcp)) + 0.5; - float subpixH = subpixG * fxaaSubpix; + bool goodSpanN = (lumaEndN < 0.0) != lumaMLTZero; + float spanLength = (dstP + dstN); + bool goodSpanP = (lumaEndP < 0.0) != lumaMLTZero; + float spanLengthRcp = 1.0/spanLength; - float pixelOffsetGood = goodSpan ? pixelOffset : 0.0; - float pixelOffsetSubpix = max(pixelOffsetGood, subpixH); - if(!horzSpan) posM.x += pixelOffsetSubpix * lengthSign; - if( horzSpan) posM.y += pixelOffsetSubpix * lengthSign; + bool directionN = dstN < dstP; + float dst = min(dstN, dstP); + bool goodSpan = directionN ? goodSpanN : goodSpanP; + float subpixG = subpixF * subpixF; + float pixelOffset = (dst * (-spanLengthRcp)) + 0.5; + float subpixH = subpixG * fxaaSubpix; + + float pixelOffsetGood = goodSpan ? pixelOffset : 0.0; + float pixelOffsetSubpix = max(pixelOffsetGood, subpixH); + if(!horzSpan) posM.x += pixelOffsetSubpix * lengthSign; + if( horzSpan) posM.y += pixelOffsetSubpix * lengthSign; return float4(FxaaTexTop(tex, posM).xyz, lumaM); } @@ -580,9 +499,9 @@ float4 FxaaPass(float4 FxaaColor : COLOR0, float2 uv0 : TEXCOORD0) : SV_Target0 FxaaTex tex; tex.tex = Texture; tex.smpl = TextureSampler; - + Texture.GetDimensions(PixelSize.x, PixelSize.y); - FxaaColor = FxaaPixelShader(uv0, tex, 1.0/PixelSize.xy, FxaaSubpixMax, FxaaEdgeThreshold, FxaaEdgeThresholdMin); + FxaaColor = FxaaPixelShader(uv0, tex, 1.0 / PixelSize.xy, FxaaSubpixMax, FxaaEdgeThreshold, FxaaEdgeThresholdMin); return FxaaColor; } @@ -595,64 +514,64 @@ float4 FxaaPass(float4 FxaaColor : COLOR0, float2 uv0 : TEXCOORD0) : SV_Target0 float BSpline(float x) { float f = x; - - if(f < 0.0) + + if (f < 0.0) { f = -f; } - if(f >= 0.0 && f <= 1.0) + if (f >= 0.0 && f <= 1.0) { return (2.0 / 3.0) + (0.5) * (f* f * f) - (f*f); } - else if(f > 1.0 && f <= 2.0) + else if (f > 1.0 && f <= 2.0) { - return 1.0 / 6.0 * pow(( 2.0 - f ), 3.0); + return 1.0 / 6.0 * pow((2.0 - f), 3.0); } return 1.0; } float CatMullRom(float x) { - float b = 0.0; - float c = 0.5; - float f = x; + float b = 0.0; + float c = 0.5; + float f = x; - if( f < 0.0 ) - { - f = -f; - } - if( f < 1.0 ) - { - return ((12.0 - 9.0 * b - 6.0 * c) * (f * f * f) + - (-18.0 + 12.0 * b + 6.0 * c) * (f * f) + - (6.0 - 2.0 * b) ) / 6.0; - } - else if( f >= 1.0 && f < 2.0 ) - { - return (( -b - 6.0 * c) * (f * f * f) - + (6.0 * b + 30.0 * c) * (f *f) + - (- (12.0 * b) - 48.0 * c ) * f + - 8.0 * b + 24.0 * c)/ 6.0; - } - else - { - return 0.0; - } + if (f < 0.0) + { + f = -f; + } + if (f < 1.0) + { + return ((12.0 - 9.0 * b - 6.0 * c) * (f * f * f) + + (-18.0 + 12.0 * b + 6.0 * c) * (f * f) + + (6.0 - 2.0 * b)) / 6.0; + } + else if (f >= 1.0 && f < 2.0) + { + return ((-b - 6.0 * c) * (f * f * f) + + (6.0 * b + 30.0 * c) * (f *f) + + (-(12.0 * b) - 48.0 * c) * f + + 8.0 * b + 24.0 * c) / 6.0; + } + else + { + return 0.0; + } } float Bell(float x) { float f = (x / 2.0) * 1.5; - if(f > -1.5 && f < -0.5) + if (f > -1.5 && f < -0.5) { return(0.5 * pow(f + 1.5, 2.0)); } - else if(f > -0.5 && f < 0.5) + else if (f > -0.5 && f < 0.5) { return 3.0 / 4.0 - (f * f); } - else if(( f > 0.5 && f < 1.5 )) + else if ((f > 0.5 && f < 1.5)) { return(0.5 * pow(f - 1.5, 2.0)); } @@ -663,7 +582,7 @@ float Triangular(float x) { x = x / 2.0; - if(x < 0.0) + if (x < 0.0) { return (x + 1.0); } @@ -679,23 +598,23 @@ float Cubic(float x) float x2 = x * x; float x3 = x2 * x; - float cx = -x3 + 3.0 * x2 - 3.0 * x + 1.0; - float cy = 3.0 * x3 - 6.0 * x2 + 4.0; + float cx = -x3 + 3.0 * x2 - 3.0 * x + 1.0; + float cy = 3.0 * x3 - 6.0 * x2 + 4.0; float cz = -3.0 * x3 + 3.0 * x2 + 3.0 * x + 1.0; - float cw = x3; + float cw = x3; return (lerp(cx, cy, 0.5) + lerp(cz, cw, 0.5)) / 6.0; } /*------------------------------------------------------------------------------ - [BILINEAR FILTERING CODE SECTION] + [BILINEAR FILTERING CODE SECTION] ------------------------------------------------------------------------------*/ #if (BILINEAR_FILTERING == 1) float4 SampleBiLinear(SamplerState texSample, float2 uv0 : TEXCOORD0) : SV_Target0 { Texture.GetDimensions(PixelSize.x, PixelSize.y); - + float texelSizeX = 1.0 / PixelSize.x; float texelSizeY = 1.0 / PixelSize.y; @@ -703,45 +622,45 @@ float4 SampleBiLinear(SamplerState texSample, float2 uv0 : TEXCOORD0) : SV_Targe int nY = int(uv0.y * PixelSize.y); float2 uvCoord = float2((float(nX) + OffsetAmount) / PixelSize.x, - (float(nY) + OffsetAmount) / PixelSize.y); + (float(nY) + OffsetAmount) / PixelSize.y); // Take nearest two data in current row. - float4 SampleA = Texture.Sample(texSample, uvCoord); - float4 SampleB = Texture.Sample(texSample, uvCoord + float2(texelSizeX, 0.0)); + float4 SampleA = Texture.Sample(texSample, uvCoord); + float4 SampleB = Texture.Sample(texSample, uvCoord + float2(texelSizeX, 0.0)); // Take nearest two data in bottom row. - float4 SampleC = Texture.Sample(texSample, uvCoord + float2(0.0, texelSizeY)); - float4 SampleD = Texture.Sample(texSample, uvCoord + float2(texelSizeX , texelSizeY)); + float4 SampleC = Texture.Sample(texSample, uvCoord + float2(0.0, texelSizeY)); + float4 SampleD = Texture.Sample(texSample, uvCoord + float2(texelSizeX, texelSizeY)); - float LX = frac(uv0.x * PixelSize.x); //Get Interpolation factor for X direction. + float LX = frac(uv0.x * PixelSize.x); //Get Interpolation factor for X direction. // Interpolate in X direction. - float4 InterpolateA = lerp(SampleA, SampleB, LX); //Top row in X direction. - float4 InterpolateB = lerp(SampleC, SampleD, LX); //Bottom row in X direction. + float4 InterpolateA = lerp(SampleA, SampleB, LX); //Top row in X direction. + float4 InterpolateB = lerp(SampleC, SampleD, LX); //Bottom row in X direction. - float LY = frac(uv0.y * PixelSize.y); //Get Interpolation factor for Y direction. + float LY = frac(uv0.y * PixelSize.y); //Get Interpolation factor for Y direction. - return lerp(InterpolateA, InterpolateB, LY); //Interpolate in Y direction. + return lerp(InterpolateA, InterpolateB, LY); //Interpolate in Y direction. } float4 BiLinearPass(float4 color : COLOR0, float2 uv0 : TEXCOORD0) { - float4 bilinear = SampleBiLinear(TextureSampler, uv0); - color = lerp(color, bilinear, FilterStrength); - - return color; + float4 bilinear = SampleBiLinear(TextureSampler, uv0); + color = lerp(color, bilinear, FilterStrength); + + return color; } #endif /*------------------------------------------------------------------------------ - [BICUBIC FILTERING CODE SECTION] + [BICUBIC FILTERING CODE SECTION] ------------------------------------------------------------------------------*/ #if (BICUBIC_FILTERING == 1) float4 BiCubicFilter(SamplerState texSample, float2 uv0 : TEXCOORD0) : SV_Target0 { Texture.GetDimensions(PixelSize.x, PixelSize.y); - + float texelSizeX = 1.0 / PixelSize.x; float texelSizeY = 1.0 / PixelSize.y; @@ -753,83 +672,83 @@ float4 BiCubicFilter(SamplerState texSample, float2 uv0 : TEXCOORD0) : SV_Target int nX = int(uv0.x * PixelSize.x); int nY = int(uv0.y * PixelSize.y); - - float2 uvCoord = float2( float(nX) / PixelSize.x + PixelOffset / PixelSize.x, - float(nY) / PixelSize.y + PixelOffset / PixelSize.y ); - for(int m = -1; m <= 2; m++) - { - for(int n = -1; n <= 2; n++) - { + float2 uvCoord = float2(float(nX) / PixelSize.x + PixelOffset / PixelSize.x, + float(nY) / PixelSize.y + PixelOffset / PixelSize.y); + + for (int m = -1; m <= 2; m++) + { + for (int n = -1; n <= 2; n++) + { float4 Samples = Texture.Sample(texSample, uvCoord + float2(texelSizeX * float(m), texelSizeY * float(n))); - float vc1 = Interpolation(float(m) - a); + float vc1 = Interpolation(float(m) - a); float4 vecCoeff1 = float4(vc1, vc1, vc1, vc1); float vc2 = Interpolation(-(float(n) - b)); float4 vecCoeff2 = float4(vc2, vc2, vc2, vc2); - nSum = nSum + (Samples * vecCoeff2 * vecCoeff1); - nDenom = nDenom + (vecCoeff2 * vecCoeff1); - } - } + nSum = nSum + (Samples * vecCoeff2 * vecCoeff1); + nDenom = nDenom + (vecCoeff2 * vecCoeff1); + } + } return nSum / nDenom; } float4 BiCubicPass(float4 color : COLOR0, float2 uv0 : TEXCOORD0) : SV_Target0 { - float4 bicubic = BiCubicFilter(TextureSampler, uv0); - color = lerp(color, bicubic, BicubicStrength); - return color; + float4 bicubic = BiCubicFilter(TextureSampler, uv0); + color = lerp(color, bicubic, BicubicStrength); + return color; } #endif /*------------------------------------------------------------------------------ - [GAUSSIAN FILTERING CODE SECTION] + [GAUSSIAN FILTERING CODE SECTION] ------------------------------------------------------------------------------*/ #if (GAUSSIAN_FILTERING == 1) float4 GaussianPass(float4 color : COLOR0, float2 uv0 : TEXCOORD0) : SV_Target0 { Texture.GetDimensions(PixelSize.x, PixelSize.y); - + float2 dx = float2(1.0 / PixelSize.x * GaussianSpread, 0.0); float2 dy = float2(0.0, 1.0 / PixelSize.y * GaussianSpread); float2 dx2 = 2.0 * dx; float2 dy2 = 2.0 * dy; - + float4 gaussian = Texture.Sample(TextureSampler, uv0); - gaussian += Texture.Sample(TextureSampler, uv0 -dx2 +dy2); - gaussian += Texture.Sample(TextureSampler, uv0 -dx +dy2); - gaussian += Texture.Sample(TextureSampler, uv0 +dy2); - gaussian += Texture.Sample(TextureSampler, uv0 +dx +dy2); - gaussian += Texture.Sample(TextureSampler, uv0 +dx2 +dy2); + gaussian += Texture.Sample(TextureSampler, uv0 - dx2 + dy2); + gaussian += Texture.Sample(TextureSampler, uv0 - dx + dy2); + gaussian += Texture.Sample(TextureSampler, uv0 + dy2); + gaussian += Texture.Sample(TextureSampler, uv0 + dx + dy2); + gaussian += Texture.Sample(TextureSampler, uv0 + dx2 + dy2); - gaussian += Texture.Sample(TextureSampler, uv0 -dx2 +dy); - gaussian += Texture.Sample(TextureSampler, uv0 -dx +dy); - gaussian += Texture.Sample(TextureSampler, uv0 +dy); - gaussian += Texture.Sample(TextureSampler, uv0 +dx +dy); - gaussian += Texture.Sample(TextureSampler, uv0 +dx2 +dy); + gaussian += Texture.Sample(TextureSampler, uv0 - dx2 + dy); + gaussian += Texture.Sample(TextureSampler, uv0 - dx + dy); + gaussian += Texture.Sample(TextureSampler, uv0 + dy); + gaussian += Texture.Sample(TextureSampler, uv0 + dx + dy); + gaussian += Texture.Sample(TextureSampler, uv0 + dx2 + dy); - gaussian += Texture.Sample(TextureSampler, uv0 -dx2); - gaussian += Texture.Sample(TextureSampler, uv0 -dx); - gaussian += Texture.Sample(TextureSampler, uv0 +dx); - gaussian += Texture.Sample(TextureSampler, uv0 +dx2); + gaussian += Texture.Sample(TextureSampler, uv0 - dx2); + gaussian += Texture.Sample(TextureSampler, uv0 - dx); + gaussian += Texture.Sample(TextureSampler, uv0 + dx); + gaussian += Texture.Sample(TextureSampler, uv0 + dx2); - gaussian += Texture.Sample(TextureSampler, uv0 -dx2 -dy); - gaussian += Texture.Sample(TextureSampler, uv0 -dx -dy); - gaussian += Texture.Sample(TextureSampler, uv0 -dy); - gaussian += Texture.Sample(TextureSampler, uv0 +dx -dy); - gaussian += Texture.Sample(TextureSampler, uv0 +dx2 -dy); + gaussian += Texture.Sample(TextureSampler, uv0 - dx2 - dy); + gaussian += Texture.Sample(TextureSampler, uv0 - dx - dy); + gaussian += Texture.Sample(TextureSampler, uv0 - dy); + gaussian += Texture.Sample(TextureSampler, uv0 + dx - dy); + gaussian += Texture.Sample(TextureSampler, uv0 + dx2 - dy); - gaussian += Texture.Sample(TextureSampler, uv0 -dx2 -dy2); - gaussian += Texture.Sample(TextureSampler, uv0 -dx -dy2); - gaussian += Texture.Sample(TextureSampler, uv0 -dy2); - gaussian += Texture.Sample(TextureSampler, uv0 +dx -dy2); - gaussian += Texture.Sample(TextureSampler, uv0 +dx2 -dy2); + gaussian += Texture.Sample(TextureSampler, uv0 - dx2 - dy2); + gaussian += Texture.Sample(TextureSampler, uv0 - dx - dy2); + gaussian += Texture.Sample(TextureSampler, uv0 - dy2); + gaussian += Texture.Sample(TextureSampler, uv0 + dx - dy2); + gaussian += Texture.Sample(TextureSampler, uv0 + dx2 - dy2); gaussian /= 25.0; @@ -840,7 +759,7 @@ float4 GaussianPass(float4 color : COLOR0, float2 uv0 : TEXCOORD0) : SV_Target0 #endif /*------------------------------------------------------------------------------ - [GAMMA CORRECTION CODE SECTION] + [GAMMA CORRECTION CODE SECTION] ------------------------------------------------------------------------------*/ #if (GAMMA_CORRECTION == 1) @@ -855,7 +774,7 @@ float4 PostGammaPass(float4 color : COLOR0, float2 uv0 : TEXCOORD0) : SV_Target0 #endif /*------------------------------------------------------------------------------ - [TEXTURE SHARPEN CODE SECTION] + [TEXTURE SHARPEN CODE SECTION] ------------------------------------------------------------------------------*/ #if (TEXTURE_SHARPENING == 1) @@ -867,42 +786,42 @@ float4 PostGammaPass(float4 color : COLOR0, float2 uv0 : TEXCOORD0) : SV_Target0 float4 SampleBiCubic(SamplerState texSample, float2 uv0) { Texture.GetDimensions(PixelSize.x, PixelSize.y); - + float texelSizeX = 1.0 / PixelSize.x * SharpenBias; float texelSizeY = 1.0 / PixelSize.y * SharpenBias; - + float4 nSum = (float4)0.0; float4 nDenom = (float4)0.0; - float a = frac(uv0.x * PixelSize.x); - float b = frac(uv0.y * PixelSize.y); + float a = frac(uv0.x * PixelSize.x); + float b = frac(uv0.y * PixelSize.y); int nX = int(uv0.x * PixelSize.x); int nY = int(uv0.y * PixelSize.y); - + float2 uvCoord = float2(float(nX) / PixelSize.x, float(nY) / PixelSize.y); - for(int m = -1; m <= 2; m++) - { - for(int n = -1; n <= 2; n++) - { + for (int m = -1; m <= 2; m++) + { + for (int n = -1; n <= 2; n++) + { float4 Samples = Texture.Sample(texSample, uvCoord + float2(texelSizeX * float(m), texelSizeY * float(n))); - float vc1 = Cubic(float(m) - a); + float vc1 = Cubic(float(m) - a); float4 vecCoeff1 = float4(vc1, vc1, vc1, vc1); float vc2 = Cubic(-(float(n) - b)); float4 vecCoeff2 = float4(vc2, vc2, vc2, vc2); - nSum = nSum + (Samples * vecCoeff2 * vecCoeff1); - nDenom = nDenom + (vecCoeff2 * vecCoeff1); - } - } + nSum = nSum + (Samples * vecCoeff2 * vecCoeff1); + nDenom = nDenom + (vecCoeff2 * vecCoeff1); + } + } return nSum / nDenom; } -float4 TexSharpenPass(float4 color : COLOR0, float2 uv0 : TEXCOORD0) : SV_Target0 +float4 TexSharpenPass(float4 color : COLOR0, float2 uv0 : TEXCOORD0) : SV_Target0 { float3 calcSharpen = (SLumCoeff * SharpenStrength); float4 blurredColor = SampleBiCubic(TextureSampler, uv0); @@ -913,31 +832,31 @@ float4 TexSharpenPass(float4 color : COLOR0, float2 uv0 : TEXCOORD0) : SV_Target color.rgb = color.rgb + sharpenLuma; color.a = RGBLuminance(color.rgb); - + #if (DebugSharpen == 1) - color = saturate(0.5f + (sharpenLuma * 4)).rrrr; + color = saturate(0.5f + (sharpenLuma * 4)).rrrr; #endif - + return saturate(color); } #else -float4 TexSharpenPass(float4 color : COLOR0, float2 uv0 : TEXCOORD0) : SV_Target0 -{ +float4 TexSharpenPass(float4 color : COLOR0, float2 uv0 : TEXCOORD0) : SV_Target0 +{ float3 blurredColor; - + Texture.GetDimensions(PixelSize.x, PixelSize.y); - blurredColor = Texture.SampleLevel(TextureSampler, uv0 + float2(-px,py) * SharpenBias, 0.0).rgb; //North West - blurredColor += Texture.SampleLevel(TextureSampler, uv0 + float2(px,-py) * SharpenBias, 0.0).rgb; //South East - blurredColor += Texture.SampleLevel(TextureSampler, uv0 + float2(-px,-py) * SharpenBias, 0.0).rgb; //South West - blurredColor += Texture.SampleLevel(TextureSampler, uv0 + float2(px,py) * SharpenBias, 0.0).rgb; //North East + blurredColor = Texture.SampleLevel(TextureSampler, uv0 + float2(-px, py) * SharpenBias, 0.0).rgb; //North West + blurredColor += Texture.SampleLevel(TextureSampler, uv0 + float2(px, -py) * SharpenBias, 0.0).rgb; //South East + blurredColor += Texture.SampleLevel(TextureSampler, uv0 + float2(-px, -py) * SharpenBias, 0.0).rgb; //South West + blurredColor += Texture.SampleLevel(TextureSampler, uv0 + float2(px, py) * SharpenBias, 0.0).rgb; //North East + + blurredColor += Texture.SampleLevel(TextureSampler, uv0 + float2(0.0, py) * SharpenBias, 0.0).rgb; //North + blurredColor += Texture.SampleLevel(TextureSampler, uv0 + float2(0.0, -py) * SharpenBias, 0.0).rgb; //South + blurredColor += Texture.SampleLevel(TextureSampler, uv0 + float2(-px, 0.0) * SharpenBias, 0.0).rgb; //West + blurredColor += Texture.SampleLevel(TextureSampler, uv0 + float2(px, 0.0) * SharpenBias, 0.0).rgb; //East - blurredColor += Texture.SampleLevel(TextureSampler, uv0 + float2(0.0,py) * SharpenBias, 0.0).rgb; //North - blurredColor += Texture.SampleLevel(TextureSampler, uv0 + float2(0.0,-py) * SharpenBias, 0.0).rgb; //South - blurredColor += Texture.SampleLevel(TextureSampler, uv0 + float2(-px,0.0) * SharpenBias, 0.0).rgb; //West - blurredColor += Texture.SampleLevel(TextureSampler, uv0 + float2(px,0.0) * SharpenBias, 0.0).rgb; //East - blurredColor /= 8.0; float3 sharpenedColor = color.rgb - blurredColor; @@ -948,28 +867,28 @@ float4 TexSharpenPass(float4 color : COLOR0, float2 uv0 : TEXCOORD0) : SV_Target color.rgb = color.rgb + sharpenLuma; color.a = RGBLuminance(color.rgb); - + #if (DebugSharpen == 1) - color = saturate(0.5f + (sharpenLuma * 4)).rrrr; + color = saturate(0.5f + (sharpenLuma * 4)).rrrr; #endif - + return saturate(color); } #endif #endif /*------------------------------------------------------------------------------ - [VIBRANCE CODE SECTION] + [VIBRANCE CODE SECTION] ------------------------------------------------------------------------------*/ #if (PIXEL_VIBRANCE == 1) -float4 VibrancePass(float4 color : COLOR0, float2 uv0 : TEXCOORD0) : SV_Target0 +float4 VibrancePass(float4 color : COLOR0, float2 uv0 : TEXCOORD0) : SV_Target0 { float luma = RGBLuminance(color.rgb); - + float colorMax = max(color.r, max(color.g, color.b)); float colorMin = min(color.r, min(color.g, color.b)); - + float colorSaturation = colorMax - colorMin; color.rgb = lerp(luma, color.rgb, (1.0 + (Vibrance * (1.0 - (sign(Vibrance) * colorSaturation))))); @@ -980,13 +899,13 @@ float4 VibrancePass(float4 color : COLOR0, float2 uv0 : TEXCOORD0) : SV_Target0 #endif /*------------------------------------------------------------------------------ - [BLOOM PASS CODE SECTION] + [BLOOM PASS CODE SECTION] ------------------------------------------------------------------------------*/ #if (BLENDED_BLOOM == 1) float3 BlendBloom(float3 color, float3 bloom) { - color = (bloom + bloom) - (bloom * bloom); + color = (bloom + bloom) - (bloom * bloom); return color; } @@ -1002,15 +921,15 @@ float3 BlendAddLight(float3 color, float3 bloom) float3 BlendOverlay(float3 color, float3 bloom) { - return float3((bloom.x <= 0.5) ? (2.0 * color.x * bloom.x) - : (1.0 - 2.0 * (1.0 - bloom.x) * (1.0 - color.x)), - (bloom.y <= 0.5) ? (2.0 * color.y * bloom.y) - : (1.0 - 2.0 * (1.0 - bloom.y) * (1.0 - color.y)), - (bloom.z <= 0.5) ? (2.0 * color.z * bloom.z) - : (1.0 - 2.0 * (1.0 - bloom.z) * (1.0 - color.z))); + return float3((bloom.x <= 0.5) ? (2.0 * color.x * bloom.x) + : (1.0 - 2.0 * (1.0 - bloom.x) * (1.0 - color.x)), + (bloom.y <= 0.5) ? (2.0 * color.y * bloom.y) + : (1.0 - 2.0 * (1.0 - bloom.y) * (1.0 - color.y)), + (bloom.z <= 0.5) ? (2.0 * color.z * bloom.z) + : (1.0 - 2.0 * (1.0 - bloom.z) * (1.0 - color.z))); } -float4 BloomPass(float4 color : COLOR0, float2 uv0 : TEXCOORD0) : SV_Target0 +float4 BloomPass(float4 color : COLOR0, float2 uv0 : TEXCOORD0) : SV_Target0 { float4 bloom = Texture.Sample(BloomSampler, uv0); @@ -1024,48 +943,48 @@ float4 BloomPass(float4 color : COLOR0, float2 uv0 : TEXCOORD0) : SV_Target0 float4 bloomBlend = bloom * 0.22520613262190495; - bloomBlend += 0.002589001911021066 * Texture.Sample(BloomSampler, uv0 -dx2 +dy2); - bloomBlend += 0.010778807494659370 * Texture.Sample(BloomSampler, uv0 -dx +dy2); - bloomBlend += 0.024146616900339800 * Texture.Sample(BloomSampler, uv0 +dy2); - bloomBlend += 0.010778807494659370 * Texture.Sample(BloomSampler, uv0 +dx +dy2); - bloomBlend += 0.002589001911021066 * Texture.Sample(BloomSampler, uv0 +dx2 +dy2); + bloomBlend += 0.002589001911021066 * Texture.Sample(BloomSampler, uv0 - dx2 + dy2); + bloomBlend += 0.010778807494659370 * Texture.Sample(BloomSampler, uv0 - dx + dy2); + bloomBlend += 0.024146616900339800 * Texture.Sample(BloomSampler, uv0 + dy2); + bloomBlend += 0.010778807494659370 * Texture.Sample(BloomSampler, uv0 + dx + dy2); + bloomBlend += 0.002589001911021066 * Texture.Sample(BloomSampler, uv0 + dx2 + dy2); - bloomBlend += 0.010778807494659370 * Texture.Sample(BloomSampler, uv0 -dx2 +dy); - bloomBlend += 0.044875475183061630 * Texture.Sample(BloomSampler, uv0 -dx +dy); - bloomBlend += 0.100529757860782610 * Texture.Sample(BloomSampler, uv0 +dy); - bloomBlend += 0.044875475183061630 * Texture.Sample(BloomSampler, uv0 +dx +dy); - bloomBlend += 0.010778807494659370 * Texture.Sample(BloomSampler, uv0 +dx2 +dy); + bloomBlend += 0.010778807494659370 * Texture.Sample(BloomSampler, uv0 - dx2 + dy); + bloomBlend += 0.044875475183061630 * Texture.Sample(BloomSampler, uv0 - dx + dy); + bloomBlend += 0.100529757860782610 * Texture.Sample(BloomSampler, uv0 + dy); + bloomBlend += 0.044875475183061630 * Texture.Sample(BloomSampler, uv0 + dx + dy); + bloomBlend += 0.010778807494659370 * Texture.Sample(BloomSampler, uv0 + dx2 + dy); - bloomBlend += 0.024146616900339800 * Texture.Sample(BloomSampler, uv0 -dx2); - bloomBlend += 0.100529757860782610 * Texture.Sample(BloomSampler, uv0 -dx); - bloomBlend += 0.100529757860782610 * Texture.Sample(BloomSampler, uv0 +dx); - bloomBlend += 0.024146616900339800 * Texture.Sample(BloomSampler, uv0 +dx2); + bloomBlend += 0.024146616900339800 * Texture.Sample(BloomSampler, uv0 - dx2); + bloomBlend += 0.100529757860782610 * Texture.Sample(BloomSampler, uv0 - dx); + bloomBlend += 0.100529757860782610 * Texture.Sample(BloomSampler, uv0 + dx); + bloomBlend += 0.024146616900339800 * Texture.Sample(BloomSampler, uv0 + dx2); - bloomBlend += 0.010778807494659370 * Texture.Sample(BloomSampler, uv0 -dx2 -dy); - bloomBlend += 0.044875475183061630 * Texture.Sample(BloomSampler, uv0 -dx -dy); - bloomBlend += 0.100529757860782610 * Texture.Sample(BloomSampler, uv0 -dy); - bloomBlend += 0.044875475183061630 * Texture.Sample(BloomSampler, uv0 +dx -dy); - bloomBlend += 0.010778807494659370 * Texture.Sample(BloomSampler, uv0 +dx2 -dy); + bloomBlend += 0.010778807494659370 * Texture.Sample(BloomSampler, uv0 - dx2 - dy); + bloomBlend += 0.044875475183061630 * Texture.Sample(BloomSampler, uv0 - dx - dy); + bloomBlend += 0.100529757860782610 * Texture.Sample(BloomSampler, uv0 - dy); + bloomBlend += 0.044875475183061630 * Texture.Sample(BloomSampler, uv0 + dx - dy); + bloomBlend += 0.010778807494659370 * Texture.Sample(BloomSampler, uv0 + dx2 - dy); - bloomBlend += 0.002589001911021066 * Texture.Sample(BloomSampler, uv0 -dx2 -dy2); - bloomBlend += 0.010778807494659370 * Texture.Sample(BloomSampler, uv0 -dx -dy2); - bloomBlend += 0.024146616900339800 * Texture.Sample(BloomSampler, uv0 -dy2); - bloomBlend += 0.010778807494659370 * Texture.Sample(BloomSampler, uv0 +dx -dy2); - bloomBlend += 0.002589001911021066 * Texture.Sample(BloomSampler, uv0 +dx2 -dy2); + bloomBlend += 0.002589001911021066 * Texture.Sample(BloomSampler, uv0 - dx2 - dy2); + bloomBlend += 0.010778807494659370 * Texture.Sample(BloomSampler, uv0 - dx - dy2); + bloomBlend += 0.024146616900339800 * Texture.Sample(BloomSampler, uv0 - dy2); + bloomBlend += 0.010778807494659370 * Texture.Sample(BloomSampler, uv0 + dx - dy2); + bloomBlend += 0.002589001911021066 * Texture.Sample(BloomSampler, uv0 + dx2 - dy2); bloomBlend = lerp(color, bloomBlend, BlendPower); - bloom.rgb = BloomType(color.rgb, bloomBlend.rgb); + bloom.rgb = BloomType(color.rgb, bloomBlend.rgb); bloom.r = bloom.r * 1.010778807494659370; color.a = RGBLuminance(color.rgb); bloom.a = RGBLuminance(bloom.rgb); - + #if (BloomMixType == 1) - color = lerp(color, bloom, BloomPower); + color = lerp(color, bloom, BloomPower); #elif (BloomMixType == 2) - color = (lerp(color, bloom, BloomPower) + lerp(bloom, bloomBlend, BloomPower)) / 2.0; + color = (lerp(color, bloom, BloomPower) + lerp(bloom, bloomBlend, BloomPower)) / 2.0; #elif (BloomMixType == 3) - color = lerp(color, bloom, lerp(color.a * 0.5, bloom.a, BloomPower)); + color = lerp(color, bloom, lerp(color.a * 0.5, bloom.a, BloomPower)); #endif return saturate(color); @@ -1073,11 +992,11 @@ float4 BloomPass(float4 color : COLOR0, float2 uv0 : TEXCOORD0) : SV_Target0 #endif /*------------------------------------------------------------------------------ - [COLOR CORRECTION/TONE MAPPING PASS CODE SECTION] + [COLOR CORRECTION/TONE MAPPING CODE SECTION] ------------------------------------------------------------------------------*/ #if (SCENE_TONEMAPPING == 1) -float YXYLuminance (float3 YXY) +float YXYLuminance(float3 YXY) { return (-0.9692660 * YXY.x) + (1.8760108 * YXY.y) @@ -1093,7 +1012,7 @@ float3 FilmicTonemap(float3 x) float E = 0.02; float F = 0.30; - return ((x*(A*x+C*B)+D*E) / (x*(A*x+B)+D*F))- E / F; + return ((x*(A*x + C*B) + D*E) / (x*(A*x + B) + D*F)) - E / F; } float3 ColorCorrection(float3 color) @@ -1102,40 +1021,40 @@ float3 ColorCorrection(float3 color) float Y = 1.0 / (1.0 + exp(GreenCurve / 2.0)); float Z = 1.0 / (1.0 + exp(BlueCurve / 2.0)); - color.r = (1.0 / (1.0 + exp(- RedCurve - * (color.r - 0.5))) - X) / (1.0 - 2.0 * X); - color.g = (1.0 / (1.0 + exp(- GreenCurve - * (color.g - 0.5))) - Y) / (1.0 - 2.0 * Y); - color.b = (1.0 / (1.0 + exp(- BlueCurve - * (color.b - 0.5))) - Z) / (1.0 - 2.0 * Z); - + color.r = (1.0 / (1.0 + exp(-RedCurve * + (color.r - 0.5))) - X) / (1.0 - 2.0 * X); + color.g = (1.0 / (1.0 + exp(-GreenCurve * + (color.g - 0.5))) - Y) / (1.0 - 2.0 * Y); + color.b = (1.0 / (1.0 + exp(-BlueCurve * + (color.b - 0.5))) - Z) / (1.0 - 2.0 * Z); + return color; } -float4 TonemapPass(float4 color : COLOR0, float2 uv0 : TEXCOORD0) : SV_Target0 -{ - float3 lumScale = 1.0/FilmicTonemap(Luminance); +float4 TonemapPass(float4 color : COLOR0, float2 uv0 : TEXCOORD0) : SV_Target0 +{ + float3 lumScale = 1.0 / FilmicTonemap(Luminance); color.rgb = ColorCorrection(color.rgb); color.rgb = FilmicTonemap(Exposure * color.rgb); - color.rgb = color.rgb * lumScale; + color.rgb = color.rgb * lumScale; const float3 lumCoeff = float3(0.2126729, 0.7151522, 0.0721750); - + // RGB -> XYZ conversion - const float3x3 RGB2XYZ = {0.4124564, 0.3575761, 0.1804375, - 0.2126729, 0.7151522, 0.0721750, - 0.0193339, 0.1191920, 0.9503041}; - + const float3x3 RGB2XYZ = { 0.4124564, 0.3575761, 0.1804375, + 0.2126729, 0.7151522, 0.0721750, + 0.0193339, 0.1191920, 0.9503041 }; + float3 XYZ = mul(RGB2XYZ, color.rgb); - + // XYZ -> Yxy conversion float3 Yxy = lumCoeff; Yxy.r = XYZ.g; // copy luminance Y - Yxy.g = XYZ.r / (XYZ.r + XYZ.g + XYZ.b ); // x = X / (X + Y + Z) - Yxy.b = XYZ.g / (XYZ.r + XYZ.g + XYZ.b ); // y = Y / (X + Y + Z) - + Yxy.g = XYZ.r / (XYZ.r + XYZ.g + XYZ.b); // x = X / (X + Y + Z) + Yxy.b = XYZ.g / (XYZ.r + XYZ.g + XYZ.b); // y = Y / (X + Y + Z) + // (Lp) Map average luminance to the middlegrey zone by scaling pixel luminance #if (TonemapType == 1) float Lp = Yxy.r * Exposure / Luminance; @@ -1145,19 +1064,19 @@ float4 TonemapPass(float4 color : COLOR0, float2 uv0 : TEXCOORD0) : SV_Target0 (Yxy.g * (YXYLuminance(Yxy.rrr) / 1.5)) + (Yxy.b * (YXYLuminance(Yxy.rrr) / 1.5)))*(Exposure / Luminance); #endif - + // (Ld) Scale all luminance within a displayable range of 0 to 1 - Yxy.r = (Lp * (1.0 + Lp/(WhitePoint * WhitePoint)))/(1.0 + Lp); - + Yxy.r = (Lp * (1.0 + Lp / (WhitePoint * WhitePoint))) / (1.0 + Lp); + // Yxy -> XYZ conversion - XYZ.r = Yxy.r * Yxy.g / Yxy. b; // X = Y * x / y + XYZ.r = Yxy.r * Yxy.g / Yxy.b; // X = Y * x / y XYZ.g = Yxy.r; // copy luminance Y XYZ.b = Yxy.r * (1.0 - Yxy.g - Yxy.b) / Yxy.b; // Z = Y * (1-x-y) / y - + // XYZ -> RGB conversion - const float3x3 XYZ2RGB = {3.2404542, -1.5371385, -0.4985314, - -0.9692660, 1.8760108, 0.0415560, - 0.0556434, -0.2040259, 1.0572252}; + const float3x3 XYZ2RGB = { 3.2404542, -1.5371385, -0.4985314, + -0.9692660, 1.8760108, 0.0415560, + 0.0556434, -0.2040259, 1.0572252 }; color.rgb = mul(XYZ2RGB, XYZ); @@ -1170,7 +1089,7 @@ float4 TonemapPass(float4 color : COLOR0, float2 uv0 : TEXCOORD0) : SV_Target0 #endif /*------------------------------------------------------------------------------ - [S-CURVE CONTRAST CODE SECTION] + [S-CURVE CONTRAST CODE SECTION] ------------------------------------------------------------------------------*/ #if (S_CURVE_CONTRAST == 1) @@ -1179,17 +1098,17 @@ float4 SCurvePass(float4 color : COLOR0, float2 uv0 : TEXCOORD0) : SV_Target0 float CurveBlend = CurvesContrast; #if (CurveType != 2) - float3 luma = (float3)RGBLuminance(color.rgb); - float3 chroma = color.rgb - luma; + float3 luma = (float3)RGBLuminance(color.rgb); + float3 chroma = color.rgb - luma; #endif #if (CurveType == 2) - float3 x = color.rgb; + float3 x = color.rgb; #elif (CurveType == 1) - float3 x = chroma; - x = x * 0.5 + 0.5; + float3 x = chroma; + x = x * 0.5 + 0.5; #else - float3 x = luma; + float3 x = luma; #endif //S-Curve - Cubic Bezier spline @@ -1208,25 +1127,25 @@ float4 SCurvePass(float4 color : COLOR0, float2 uv0 : TEXCOORD0) : SV_Target0 x = dest; #if (CurveType == 0) //Only Luma - x = lerp(luma, x, CurveBlend); - color.rgb = x + chroma; + x = lerp(luma, x, CurveBlend); + color.rgb = x + chroma; #elif (CurveType == 1) //Only Chroma - x = x * 2 - 1; - float3 LColor = luma + x; - color.rgb = lerp(color.rgb, LColor, CurveBlend); + x = x * 2 - 1; + float3 LColor = luma + x; + color.rgb = lerp(color.rgb, LColor, CurveBlend); #elif (CurveType == 2) //Both Luma and Chroma - float3 LColor = x; - color.rgb = lerp(color.rgb, LColor, CurveBlend); + float3 LColor = x; + color.rgb = lerp(color.rgb, LColor, CurveBlend); #endif - + color.a = RGBLuminance(color.rgb); - + return saturate(color); } #endif /*------------------------------------------------------------------------------ - [CEL SHADING CODE SECTION] + [CEL SHADING CODE SECTION] ------------------------------------------------------------------------------*/ #if (CEL_SHADING == 1) @@ -1242,40 +1161,40 @@ static const float3 thresholds = float3(5.0, 8.0, 6.0); #endif float3 GetYUV(float3 rgb) -{ +{ #if (LumaConversion == 1) - float3x3 RGB2YUV = {0.2126, 0.7152, 0.0722, - -0.09991, -0.33609, 0.436, - 0.615, -0.55861, -0.05639}; + float3x3 RGB2YUV = { 0.2126, 0.7152, 0.0722, + -0.09991, -0.33609, 0.436, + 0.615, -0.55861, -0.05639 }; #else - float3x3 RGB2YUV = {0.299, 0.587, 0.114, - -0.14713, -0.28886f, 0.436, - 0.615, -0.51499, -0.10001}; + float3x3 RGB2YUV = { 0.299, 0.587, 0.114, + -0.14713, -0.28886f, 0.436, + 0.615, -0.51499, -0.10001 }; #endif - + return mul(RGB2YUV, rgb); } float3 GetRGB(float3 yuv) { - #if (LumaConversion == 1) - float3x3 YUV2RGB = {1.000, 0.000, 1.28033, - 1.000, -0.21482, -0.38059, - 1.000, 2.12798, 0.000}; + #if (LumaConversion == 1) + float3x3 YUV2RGB = { 1.000, 0.000, 1.28033, + 1.000, -0.21482, -0.38059, + 1.000, 2.12798, 0.000 }; #else - float3x3 YUV2RGB = {1.000, 0.000, 1.13983, - 1.000, -0.39465, -0.58060, - 1.000, 2.03211, 0.000}; + float3x3 YUV2RGB = { 1.000, 0.000, 1.13983, + 1.000, -0.39465, -0.58060, + 1.000, 2.03211, 0.000 }; #endif - + return mul(YUV2RGB, yuv); } float GetCelLuminance(float3 rgb) { - return dot(rgb, celLumaCoef); + return dot(rgb, celLumaCoef); } float4 CelPass(float4 color : COLOR0, float2 uv0 : TEXCOORD0) : SV_Target0 @@ -1283,46 +1202,50 @@ float4 CelPass(float4 color : COLOR0, float2 uv0 : TEXCOORD0) : SV_Target0 float3 yuv; float3 sum = color.rgb; - float2 pixel = float2(1.0/2560.0, 1.0/1440.0) * EdgeThickness; + float2 pixel = float2(1.0 / 2560.0, 1.0 / 1440.0) * EdgeThickness; float2 c[NUM] = { - float2(-0.0078125,-0.0078125), - float2( 0.00 , -0.0078125), - float2( 0.0078125,-0.0078125), + float2(-0.0078125, -0.0078125), + float2(0.00, -0.0078125), + float2(0.0078125, -0.0078125), float2(-0.0078125, 0.00), - float2( 0.00, 0.00), - float2( 0.0078125, 0.00), + float2(0.00, 0.00), + float2(0.0078125, 0.00), float2(-0.0078125, 0.0078125), - float2( 0.00 , 0.0078125), - float2( 0.0078125, 0.0078125)}; - + float2(0.00, 0.0078125), + float2(0.0078125, 0.0078125) }; + float3 col[NUM]; float lum[NUM]; for (int i = 0; i < NUM; i++) { col[i] = Texture.Sample(TextureSampler, uv0 + c[i] * RoundingOffset).rgb; - + #if (ColorRounding == 1) - col[i].r = saturate(round(col[i].r * thresholds.r) / thresholds.r); - col[i].g = saturate(round(col[i].g * thresholds.g) / thresholds.g); - col[i].b = saturate(round(col[i].b * thresholds.b) / thresholds.b); + col[i].r = saturate(round(col[i].r * thresholds.r) / thresholds.r); + col[i].g = saturate(round(col[i].g * thresholds.g) / thresholds.g); + col[i].b = saturate(round(col[i].b * thresholds.b) / thresholds.b); #endif - + lum[i] = GetCelLuminance(col[i].xyz); yuv = GetYUV(col[i]); - + if (UseYuvLuma == 0) - { yuv.r = saturate(round(yuv.r * lum[i]) / thresholds.r + lum[i]); } + { + yuv.r = saturate(round(yuv.r * lum[i]) / thresholds.r + lum[i]); + } else - { yuv.r = saturate(round(yuv.r * thresholds.r) / thresholds.r + lum[i] / (255.0 / 5.0)); } - + { + yuv.r = saturate(round(yuv.r * thresholds.r) / thresholds.r + lum[i] / (255.0 / 5.0)); + } + yuv = GetRGB(yuv); - + sum += yuv; } - + float3 shadedColor = (sum / NUM); float edgeX = dot(Texture.Sample(TextureSampler, uv0 + pixel).rgb, celLumaCoef); @@ -1334,13 +1257,13 @@ float4 CelPass(float4 color : COLOR0, float2 uv0 : TEXCOORD0) : SV_Target0 float edge = dot(float2(edgeX, edgeY), float2(edgeX, edgeY)); #if (PaletteType == 1) - color.rgb = lerp(color.rgb, color.rgb + pow(edge, EdgeFilter) * -EdgeStrength, EdgeStrength); + color.rgb = lerp(color.rgb, color.rgb + pow(edge, EdgeFilter) * -EdgeStrength, EdgeStrength); #elif (PaletteType == 2) - color.rgb = lerp(color.rgb + pow(edge, EdgeFilter) * -EdgeStrength, shadedColor, 0.33); + color.rgb = lerp(color.rgb + pow(edge, EdgeFilter) * -EdgeStrength, shadedColor, 0.33); #elif (PaletteType == 3) - color.rgb = lerp(shadedColor + edge * -EdgeStrength, pow(edge, EdgeFilter) * -EdgeStrength + color.rgb, 0.5); + color.rgb = lerp(shadedColor + edge * -EdgeStrength, pow(edge, EdgeFilter) * -EdgeStrength + color.rgb, 0.5); #endif - + color.a = RGBLuminance(color.rgb); return saturate(color); @@ -1348,54 +1271,54 @@ float4 CelPass(float4 color : COLOR0, float2 uv0 : TEXCOORD0) : SV_Target0 #endif /*------------------------------------------------------------------------------ - [COLOR GRADING CODE SECTION] + [COLOR GRADING CODE SECTION] ------------------------------------------------------------------------------*/ #if (COLOR_GRADING == 1) float RGBCVtoHUE(float3 RGB, float C, float V) { - float3 Delta = (V - RGB) / C; + float3 Delta = (V - RGB) / C; - Delta.rgb -= Delta.brg; - Delta.rgb += float3(2,4,6); - Delta.brg = step(V, RGB) * Delta.brg; + Delta.rgb -= Delta.brg; + Delta.rgb += float3(2, 4, 6); + Delta.brg = step(V, RGB) * Delta.brg; - float H; - H = max(Delta.r, max(Delta.g, Delta.b)); - return frac(H / 6); + float H; + H = max(Delta.r, max(Delta.g, Delta.b)); + return frac(H / 6); } - + float3 RGBtoHSV(float3 RGB) { - float3 HSV = 0; - HSV.z = max(RGB.r, max(RGB.g, RGB.b)); - float M = min(RGB.r, min(RGB.g, RGB.b)); - float C = HSV.z - M; + float3 HSV = 0; + HSV.z = max(RGB.r, max(RGB.g, RGB.b)); + float M = min(RGB.r, min(RGB.g, RGB.b)); + float C = HSV.z - M; - if (C != 0) - { - HSV.x = RGBCVtoHUE(RGB, C, HSV.z); - HSV.y = C / HSV.z; - } + if (C != 0) + { + HSV.x = RGBCVtoHUE(RGB, C, HSV.z); + HSV.y = C / HSV.z; + } - return HSV; + return HSV; } - + float3 HUEtoRGB(float H) { - float R = abs(H * 6 - 3) - 1; - float G = 2 - abs(H * 6 - 2); - float B = 2 - abs(H * 6 - 4); + float R = abs(H * 6 - 3) - 1; + float G = 2 - abs(H * 6 - 2); + float B = 2 - abs(H * 6 - 4); - return saturate(float3(R,G,B)); + return saturate(float3(R, G, B)); } - + float3 HSVtoRGB(float3 HSV) { - float3 RGB = HUEtoRGB(HSV.x); - return ((RGB - 1) * HSV.y + 1) * HSV.z; + float3 RGB = HUEtoRGB(HSV.x); + return ((RGB - 1) * HSV.y + 1) * HSV.z; } - + float3 HSVComplement(float3 HSV) { float3 complement = HSV; @@ -1407,56 +1330,56 @@ float3 HSVComplement(float3 HSV) float HueLerp(float h1, float h2, float v) { - float d = abs(h1 - h2); + float d = abs(h1 - h2); - if(d <= 0.5) - { - return lerp(h1, h2, v); - } - else if(h1 < h2) - { - return frac(lerp((h1 + 1.0), h2, v)); - } - else - { - return frac(lerp(h1, (h2 + 1.0), v)); - } + if (d <= 0.5) + { + return lerp(h1, h2, v); + } + else if (h1 < h2) + { + return frac(lerp((h1 + 1.0), h2, v)); + } + else + { + return frac(lerp(h1, (h2 + 1.0), v)); + } } float4 ColorGrading(float4 color : COLOR0, float2 uv0 : TEXCOORD0) : SV_Target0 { float3 guide = float3(RedGrading, GreenGrading, BlueGrading); - float amount = GradingStrength; - float correlation = Correlation; - float concentration = 2.00; + float amount = GradingStrength; + float correlation = Correlation; + float concentration = 2.00; - float3 colorHSV = RGBtoHSV(color.rgb); - float3 huePoleA = RGBtoHSV(guide); - float3 huePoleB = HSVComplement(huePoleA); - - float dist1 = abs(colorHSV.x - huePoleA.x); if (dist1 > 0.5) dist1 = 1.0 - dist1; - float dist2 = abs(colorHSV.x - huePoleB.x); if (dist2 > 0.5) dist2 = 1.0 - dist2; - - float descent = smoothstep(0.0, correlation, colorHSV.y); - - float3 HSVColor = colorHSV; + float3 colorHSV = RGBtoHSV(color.rgb); + float3 huePoleA = RGBtoHSV(guide); + float3 huePoleB = HSVComplement(huePoleA); - if(dist1 < dist2) - { - float c = descent * amount * (1.0 - pow((dist1 * 2.0), 1.0 / concentration)); - HSVColor.x = HueLerp(colorHSV.x, huePoleA.x, c); - HSVColor.y = lerp(colorHSV.y, huePoleA.y, c); - } - else - { - float c = descent * amount * (1.0 - pow((dist2 * 2.0), 1.0 / concentration)); - HSVColor.x = HueLerp(colorHSV.x, huePoleB.x, c); - HSVColor.y = lerp(colorHSV.y, huePoleB.y, c); - } - - color.rgb = HSVtoRGB(HSVColor); + float dist1 = abs(colorHSV.x - huePoleA.x); if (dist1 > 0.5) dist1 = 1.0 - dist1; + float dist2 = abs(colorHSV.x - huePoleB.x); if (dist2 > 0.5) dist2 = 1.0 - dist2; + + float descent = smoothstep(0.0, correlation, colorHSV.y); + + float3 HSVColor = colorHSV; + + if (dist1 < dist2) + { + float c = descent * amount * (1.0 - pow((dist1 * 2.0), 1.0 / concentration)); + HSVColor.x = HueLerp(colorHSV.x, huePoleA.x, c); + HSVColor.y = lerp(colorHSV.y, huePoleA.y, c); + } + else + { + float c = descent * amount * (1.0 - pow((dist2 * 2.0), 1.0 / concentration)); + HSVColor.x = HueLerp(colorHSV.x, huePoleB.x, c); + HSVColor.y = lerp(colorHSV.y, huePoleB.y, c); + } + + color.rgb = HSVtoRGB(HSVColor); color.a = RGBLuminance(color.rgb); - + return saturate(color); } #endif @@ -1468,37 +1391,37 @@ float4 ColorGrading(float4 color : COLOR0, float2 uv0 : TEXCOORD0) : SV_Target0 #if (SCANLINES == 1) float4 ScanlinesPass(float4 color : COLOR0, float2 uv0 : TEXCOORD0, float4 FragCoord : SV_Position) : SV_Target0 { - - #if (ScanlineType == 3) - float amount = ScanlineBrightness; - float intensity = ScanlineIntensity; - - float pos0 = ((uv0.y + 1.0) * 170.0 * amount); - float pos1 = cos((frac(pos0 * ScanlineScale) - 0.5) * 3.1415926 * intensity) * 1.2; - color = lerp(float4(0,0,0,0), color, pos1); + #if (ScanlineType == 3) + float amount = ScanlineBrightness; + float intensity = ScanlineIntensity; + + float pos0 = ((uv0.y + 1.0) * 170.0 * amount); + float pos1 = cos((frac(pos0 * ScanlineScale) - 0.5) * 3.1415926 * intensity) * 1.2; + + color = lerp(float4(0, 0, 0, 0), color, pos1); #else - + float4 intensity; - + #if (ScanlineType == 0) - if (frac(FragCoord.y * 0.5) > ScanlineScale) + if (frac(FragCoord.y * 0.5) > ScanlineScale) #elif (ScanlineType == 1) - if (frac(FragCoord.x * 0.5) > ScanlineScale) + if (frac(FragCoord.x * 0.5) > ScanlineScale) #elif (ScanlineType == 2) - if (frac(FragCoord.x * 0.5) > ScanlineScale && frac(FragCoord.y * 0.5) > ScanlineScale) + if (frac(FragCoord.x * 0.5) > ScanlineScale && frac(FragCoord.y * 0.5) > ScanlineScale) #endif - { - intensity = float4(0.0, 0.0, 0.0, 0.0); - } - else - { - intensity = smoothstep(0.2, ScanlineBrightness, color) + normalize(float4(color.xyz, RGBLuminance(color.xyz))); - } - - float level = (4.0-uv0.x) * ScanlineIntensity; - - color = intensity * (0.5-level) + color * 1.1; + { + intensity = float4(0.0, 0.0, 0.0, 0.0); + } + else + { + intensity = smoothstep(0.2, ScanlineBrightness, color) + normalize(float4(color.xyz, RGBLuminance(color.xyz))); + } + + float level = (4.0 - uv0.x) * ScanlineIntensity; + + color = intensity * (0.5 - level) + color * 1.1; #endif return color; @@ -1506,7 +1429,7 @@ float4 ScanlinesPass(float4 color : COLOR0, float2 uv0 : TEXCOORD0, float4 FragC #endif /*------------------------------------------------------------------------------ - [VIGNETTE CODE SECTION] + [VIGNETTE CODE SECTION] ------------------------------------------------------------------------------*/ #if (VIGNETTE == 1) @@ -1528,18 +1451,18 @@ float4 VignettePass(float4 color : COLOR0, float2 uv0 : TEXCOORD0) : SV_Target #endif /*------------------------------------------------------------------------------ - [SUBPIXEL DITHERING CODE SECTION] + [SUBPIXEL DITHERING CODE SECTION] ------------------------------------------------------------------------------*/ #if (DITHERING == 1) float4 DitherPass(float4 color : COLOR0, float2 uv0 : TEXCOORD0) : SV_Target -{ - float ditherSize = 2.0; - float ditherBits = 8.0; +{ + float ditherSize = 2.0; + float ditherBits = 8.0; - #if DitherMethod == 2 //random subpixel dithering + #if DitherMethod == 2 //random subpixel dithering - float seed = dot(uv0, float2(12.9898,78.233)); + float seed = dot(uv0, float2(12.9898, 78.233)); float sine = sin(seed); float noise = frac(sine * 43758.5453 + uv0.x); @@ -1548,26 +1471,26 @@ float4 DitherPass(float4 color : COLOR0, float2 uv0 : TEXCOORD0) : SV_Target ditherShift = ditherShift * noise - ditherHalfShift; color.rgb += float3(-ditherShift, ditherShift, -ditherShift); - - #else //Ordered dithering - float gridPosition = frac(dot(uv0,(PixelSize.xy / ditherSize)) + (0.5 / ditherSize)); - float ditherShift = (0.75) * (1.0 / (pow(2,ditherBits) - 1.0)); + #else //Ordered dithering - float3 RGBShift = float3(ditherShift, -ditherShift, ditherShift); - RGBShift = lerp(2.0 * RGBShift, -2.0 * RGBShift, gridPosition); + float gridPosition = frac(dot(uv0, (PixelSize.xy / ditherSize)) + (0.5 / ditherSize)); + float ditherShift = (0.75) * (1.0 / (pow(2, ditherBits) - 1.0)); - color.rgb += RGBShift; - #endif + float3 RGBShift = float3(ditherShift, -ditherShift, ditherShift); + RGBShift = lerp(2.0 * RGBShift, -2.0 * RGBShift, gridPosition); - color.a = RGBLuminance(color.rgb); - - return color; + color.rgb += RGBShift; + #endif + + color.a = RGBLuminance(color.rgb); + + return color; } #endif /*------------------------------------------------------------------------------ - [MAIN() & COMBINE PASS CODE SECTION] + [MAIN() & COMBINE PASS CODE SECTION] ------------------------------------------------------------------------------*/ PS_OUTPUT ps_main(VS_OUTPUT input) @@ -1580,23 +1503,23 @@ PS_OUTPUT ps_main(VS_OUTPUT input) #if (BILINEAR_FILTERING == 1) color = BiLinearPass(color, input.t); #endif - + #if (GAUSSIAN_FILTERING == 1) color = GaussianPass(color, input.t); #endif - + #if (BICUBIC_FILTERING == 1) color = BiCubicPass(color, input.t); #endif - + #if (UHQ_FXAA == 1) color = FxaaPass(color, input.t); #endif - + #if (TEXTURE_SHARPENING == 1) color = TexSharpenPass(color, input.t); #endif - + #if (CEL_SHADING == 1) color = CelPass(color, input.t); #endif @@ -1608,36 +1531,36 @@ PS_OUTPUT ps_main(VS_OUTPUT input) #if (BLENDED_BLOOM == 1) color = BloomPass(color, input.t); #endif - + #if (SCENE_TONEMAPPING == 1) color = TonemapPass(color, input.t); #endif - + #if (PIXEL_VIBRANCE == 1) color = VibrancePass(color, input.t); #endif - + #if (COLOR_GRADING == 1) color = ColorGrading(color, input.t); #endif - + #if (S_CURVE_CONTRAST == 1) color = SCurvePass(color, input.t); #endif - + #if (GAMMA_CORRECTION == 1) color = PostGammaPass(color, input.t); #endif - + #if (VIGNETTE == 1) color = VignettePass(color, input.t); #endif - + #if (DITHERING == 1) color = DitherPass(color, input.t); #endif output.c = color; - + return output; } \ No newline at end of file diff --git a/plugins/GSdx/res/fxaa.fx b/plugins/GSdx/res/fxaa.fx index fa0fbafe38..c40657e79f 100644 --- a/plugins/GSdx/res/fxaa.fx +++ b/plugins/GSdx/res/fxaa.fx @@ -1,8 +1,8 @@ #ifdef SHADER_MODEL -#define UHQ_FXAA 1 //High Quality Fast Approximate Anti Aliasing. Adapted for GSdx from Timothy Lottes FXAA 3.11. -#define FxaaSubpixMax 0.0 //[0.00 to 1.00] Amount of subpixel aliasing removal. 0.00: Edge only antialiasing (no blurring) -#define FxaaEarlyExit 1 //[0 or 1] Use Fxaa early exit pathing. When disabled, the entire scene is antialiased(FSAA). 0 is off, 1 is on. +#define UHQ_FXAA 1 //High Quality Fast Approximate Anti Aliasing. Adapted for GSdx from Timothy Lottes FXAA 3.11. +#define FxaaSubpixMax 0.0 //[0.00 to 1.00] Amount of subpixel aliasing removal. 0.00: Edge only antialiasing (no blurring) +#define FxaaEarlyExit 1 //[0 or 1] Use Fxaa early exit pathing. When disabled, the entire scene is antialiased(FSAA). 0 is off, 1 is on. /*------------------------------------------------------------------------------ [GLOBALS|FUNCTIONS] @@ -114,38 +114,38 @@ float4 PreGammaPass(float4 color, float2 uv0) ------------------------------------------------------------------------------*/ #if (SHADER_MODEL >= 0x500) - #define FXAA_HLSL_5 1 - #define FXAA_GATHER4_ALPHA 1 +#define FXAA_HLSL_5 1 +#define FXAA_GATHER4_ALPHA 1 #elif (SHADER_MODEL >= 0x400) - #define FXAA_HLSL_4 1 - #define FXAA_GATHER4_ALPHA 0 +#define FXAA_HLSL_4 1 +#define FXAA_GATHER4_ALPHA 0 #else - #define FXAA_HLSL_3 1 - #define FXAA_GATHER4_ALPHA 0 +#define FXAA_HLSL_3 1 +#define FXAA_GATHER4_ALPHA 0 #endif #if (FXAA_HLSL_5 == 1) - struct FxaaTex { SamplerState smpl; Texture2D tex; }; - #define FxaaTexTop(t, p) t.tex.SampleLevel(t.smpl, p, 0.0) - #define FxaaTexOff(t, p, o, r) t.tex.SampleLevel(t.smpl, p, 0.0, o) - #define FxaaTexAlpha4(t, p) t.tex.GatherAlpha(t.smpl, p) - #define FxaaTexOffAlpha4(t, p, o) t.tex.GatherAlpha(t.smpl, p, o) - #define FxaaDiscard clip(-1) - #define FxaaSat(x) saturate(x) +struct FxaaTex { SamplerState smpl; Texture2D tex; }; +#define FxaaTexTop(t, p) t.tex.SampleLevel(t.smpl, p, 0.0) +#define FxaaTexOff(t, p, o, r) t.tex.SampleLevel(t.smpl, p, 0.0, o) +#define FxaaTexAlpha4(t, p) t.tex.GatherAlpha(t.smpl, p) +#define FxaaTexOffAlpha4(t, p, o) t.tex.GatherAlpha(t.smpl, p, o) +#define FxaaDiscard clip(-1) +#define FxaaSat(x) saturate(x) #elif (FXAA_HLSL_4 == 1) - struct FxaaTex { SamplerState smpl; Texture2D tex; }; - #define FxaaTexTop(t, p) t.tex.SampleLevel(t.smpl, p, 0.0) - #define FxaaTexOff(t, p, o, r) t.tex.SampleLevel(t.smpl, p, 0.0, o) - #define FxaaDiscard clip(-1) - #define FxaaSat(x) saturate(x) +struct FxaaTex { SamplerState smpl; Texture2D tex; }; +#define FxaaTexTop(t, p) t.tex.SampleLevel(t.smpl, p, 0.0) +#define FxaaTexOff(t, p, o, r) t.tex.SampleLevel(t.smpl, p, 0.0, o) +#define FxaaDiscard clip(-1) +#define FxaaSat(x) saturate(x) #elif (FXAA_HLSL_3 == 1) - #define FxaaTex sampler2D - #define int2 float2 - #define FxaaSat(x) saturate(x) - #define FxaaTexTop(t, p) tex2Dlod(t, float4(p, 0.0, 0.0)) - #define FxaaTexOff(t, p, o, r) tex2Dlod(t, float4(p + (o * r), 0, 0)) +#define FxaaTex sampler2D +#define int2 float2 +#define FxaaSat(x) saturate(x) +#define FxaaTexTop(t, p) tex2Dlod(t, float4(p, 0.0, 0.0)) +#define FxaaTexOff(t, p, o, r) tex2Dlod(t, float4(p + (o * r), 0, 0)) #endif #define FxaaEdgeThreshold 0.033 @@ -172,11 +172,11 @@ float FxaaLuma(float4 rgba) float4 FxaaPixelShader(float2 pos, FxaaTex tex, float2 fxaaRcpFrame, float fxaaSubpix, float fxaaEdgeThreshold, float fxaaEdgeThresholdMin) { - float2 posM; - posM.x = pos.x; - posM.y = pos.y; + float2 posM; + posM.x = pos.x; + posM.y = pos.y; - #if (FXAA_GATHER4_ALPHA == 1) + #if (FXAA_GATHER4_ALPHA == 1) float4 rgbyM = FxaaTexTop(tex, posM); float4 luma4A = FxaaTexAlpha4(tex, posM); float4 luma4B = FxaaTexOffAlpha4(tex, posM, int2(-1, -1)); @@ -199,27 +199,27 @@ float4 FxaaPixelShader(float2 pos, FxaaTex tex, float2 fxaaRcpFrame, float fxaaS float lumaE = FxaaLuma(FxaaTexOff(tex, posM, int2( 1, 0), fxaaRcpFrame.xy)); float lumaN = FxaaLuma(FxaaTexOff(tex, posM, int2( 0,-1), fxaaRcpFrame.xy)); float lumaW = FxaaLuma(FxaaTexOff(tex, posM, int2(-1, 0), fxaaRcpFrame.xy)); - #endif + #endif - float maxSM = max(lumaS, lumaM); - float minSM = min(lumaS, lumaM); - float maxESM = max(lumaE, maxSM); - float minESM = min(lumaE, minSM); - float maxWN = max(lumaN, lumaW); - float minWN = min(lumaN, lumaW); + float maxSM = max(lumaS, lumaM); + float minSM = min(lumaS, lumaM); + float maxESM = max(lumaE, maxSM); + float minESM = min(lumaE, minSM); + float maxWN = max(lumaN, lumaW); + float minWN = min(lumaN, lumaW); - float rangeMax = max(maxWN, maxESM); - float rangeMin = min(minWN, minESM); + float rangeMax = max(maxWN, maxESM); + float rangeMin = min(minWN, minESM); float range = rangeMax - rangeMin; - float rangeMaxScaled = rangeMax * fxaaEdgeThreshold; - float rangeMaxClamped = max(fxaaEdgeThresholdMin, rangeMaxScaled); + float rangeMaxScaled = rangeMax * fxaaEdgeThreshold; + float rangeMaxClamped = max(fxaaEdgeThresholdMin, rangeMaxScaled); - bool earlyExit = range < rangeMaxClamped; - #if (FxaaEarlyExit == 1) + bool earlyExit = range < rangeMaxClamped; + #if (FxaaEarlyExit == 1) if(earlyExit) { return rgbyM; } #endif - #if (FXAA_GATHER4_ALPHA == 0) + #if (FXAA_GATHER4_ALPHA == 0) float lumaNW = FxaaLuma(FxaaTexOff(tex, posM, int2(-1,-1), fxaaRcpFrame.xy)); float lumaSE = FxaaLuma(FxaaTexOff(tex, posM, int2( 1, 1), fxaaRcpFrame.xy)); float lumaNE = FxaaLuma(FxaaTexOff(tex, posM, int2( 1,-1), fxaaRcpFrame.xy)); @@ -229,78 +229,78 @@ float4 FxaaPixelShader(float2 pos, FxaaTex tex, float2 fxaaRcpFrame, float fxaaS float lumaSW = FxaaLuma(FxaaTexOff(tex, posM, int2(-1, 1), fxaaRcpFrame.xy)); #endif - float lumaNS = lumaN + lumaS; - float lumaWE = lumaW + lumaE; - float subpixRcpRange = 1.0/range; - float subpixNSWE = lumaNS + lumaWE; - float edgeHorz1 = (-2.0 * lumaM) + lumaNS; - float edgeVert1 = (-2.0 * lumaM) + lumaWE; - float lumaNESE = lumaNE + lumaSE; - float lumaNWNE = lumaNW + lumaNE; - float edgeHorz2 = (-2.0 * lumaE) + lumaNESE; - float edgeVert2 = (-2.0 * lumaN) + lumaNWNE; + float lumaNS = lumaN + lumaS; + float lumaWE = lumaW + lumaE; + float subpixRcpRange = 1.0/range; + float subpixNSWE = lumaNS + lumaWE; + float edgeHorz1 = (-2.0 * lumaM) + lumaNS; + float edgeVert1 = (-2.0 * lumaM) + lumaWE; + float lumaNESE = lumaNE + lumaSE; + float lumaNWNE = lumaNW + lumaNE; + float edgeHorz2 = (-2.0 * lumaE) + lumaNESE; + float edgeVert2 = (-2.0 * lumaN) + lumaNWNE; - float lumaNWSW = lumaNW + lumaSW; - float lumaSWSE = lumaSW + lumaSE; - float edgeHorz4 = (abs(edgeHorz1) * 2.0) + abs(edgeHorz2); - float edgeVert4 = (abs(edgeVert1) * 2.0) + abs(edgeVert2); - float edgeHorz3 = (-2.0 * lumaW) + lumaNWSW; - float edgeVert3 = (-2.0 * lumaS) + lumaSWSE; - float edgeHorz = abs(edgeHorz3) + edgeHorz4; - float edgeVert = abs(edgeVert3) + edgeVert4; + float lumaNWSW = lumaNW + lumaSW; + float lumaSWSE = lumaSW + lumaSE; + float edgeHorz4 = (abs(edgeHorz1) * 2.0) + abs(edgeHorz2); + float edgeVert4 = (abs(edgeVert1) * 2.0) + abs(edgeVert2); + float edgeHorz3 = (-2.0 * lumaW) + lumaNWSW; + float edgeVert3 = (-2.0 * lumaS) + lumaSWSE; + float edgeHorz = abs(edgeHorz3) + edgeHorz4; + float edgeVert = abs(edgeVert3) + edgeVert4; - float subpixNWSWNESE = lumaNWSW + lumaNESE; - float lengthSign = fxaaRcpFrame.x; - bool horzSpan = edgeHorz >= edgeVert; - float subpixA = subpixNSWE * 2.0 + subpixNWSWNESE; - if(!horzSpan) lumaN = lumaW; - if(!horzSpan) lumaS = lumaE; - if(horzSpan) lengthSign = fxaaRcpFrame.y; - float subpixB = (subpixA * (1.0/12.0)) - lumaM; + float subpixNWSWNESE = lumaNWSW + lumaNESE; + float lengthSign = fxaaRcpFrame.x; + bool horzSpan = edgeHorz >= edgeVert; + float subpixA = subpixNSWE * 2.0 + subpixNWSWNESE; + if(!horzSpan) lumaN = lumaW; + if(!horzSpan) lumaS = lumaE; + if(horzSpan) lengthSign = fxaaRcpFrame.y; + float subpixB = (subpixA * (1.0/12.0)) - lumaM; - float gradientN = lumaN - lumaM; - float gradientS = lumaS - lumaM; - float lumaNN = lumaN + lumaM; - float lumaSS = lumaS + lumaM; - bool pairN = abs(gradientN) >= abs(gradientS); - float gradient = max(abs(gradientN), abs(gradientS)); - if(pairN) lengthSign = -lengthSign; - float subpixC = FxaaSat(abs(subpixB) * subpixRcpRange); + float gradientN = lumaN - lumaM; + float gradientS = lumaS - lumaM; + float lumaNN = lumaN + lumaM; + float lumaSS = lumaS + lumaM; + bool pairN = abs(gradientN) >= abs(gradientS); + float gradient = max(abs(gradientN), abs(gradientS)); + if(pairN) lengthSign = -lengthSign; + float subpixC = FxaaSat(abs(subpixB) * subpixRcpRange); - float2 posB; - posB.x = posM.x; - posB.y = posM.y; - float2 offNP; - offNP.x = (!horzSpan) ? 0.0 : fxaaRcpFrame.x; - offNP.y = ( horzSpan) ? 0.0 : fxaaRcpFrame.y; - if(!horzSpan) posB.x += lengthSign * 0.5; - if( horzSpan) posB.y += lengthSign * 0.5; + float2 posB; + posB.x = posM.x; + posB.y = posM.y; + float2 offNP; + offNP.x = (!horzSpan) ? 0.0 : fxaaRcpFrame.x; + offNP.y = ( horzSpan) ? 0.0 : fxaaRcpFrame.y; + if(!horzSpan) posB.x += lengthSign * 0.5; + if( horzSpan) posB.y += lengthSign * 0.5; - float2 posN; - posN.x = posB.x - offNP.x * FXAA_QUALITY__P0; - posN.y = posB.y - offNP.y * FXAA_QUALITY__P0; - float2 posP; - posP.x = posB.x + offNP.x * FXAA_QUALITY__P0; - posP.y = posB.y + offNP.y * FXAA_QUALITY__P0; - float subpixD = ((-2.0)*subpixC) + 3.0; - float lumaEndN = FxaaLuma(FxaaTexTop(tex, posN)); - float subpixE = subpixC * subpixC; - float lumaEndP = FxaaLuma(FxaaTexTop(tex, posP)); + float2 posN; + posN.x = posB.x - offNP.x * FXAA_QUALITY__P0; + posN.y = posB.y - offNP.y * FXAA_QUALITY__P0; + float2 posP; + posP.x = posB.x + offNP.x * FXAA_QUALITY__P0; + posP.y = posB.y + offNP.y * FXAA_QUALITY__P0; + float subpixD = ((-2.0)*subpixC) + 3.0; + float lumaEndN = FxaaLuma(FxaaTexTop(tex, posN)); + float subpixE = subpixC * subpixC; + float lumaEndP = FxaaLuma(FxaaTexTop(tex, posP)); - if(!pairN) lumaNN = lumaSS; - float gradientScaled = gradient * 1.0/4.0; - float lumaMM = lumaM - lumaNN * 0.5; - float subpixF = subpixD * subpixE; - bool lumaMLTZero = lumaMM < 0.0; - lumaEndN -= lumaNN * 0.5; - lumaEndP -= lumaNN * 0.5; - bool doneN = abs(lumaEndN) >= gradientScaled; - bool doneP = abs(lumaEndP) >= gradientScaled; - if(!doneN) posN.x -= offNP.x * FXAA_QUALITY__P1; - if(!doneN) posN.y -= offNP.y * FXAA_QUALITY__P1; - bool doneNP = (!doneN) || (!doneP); - if(!doneP) posP.x += offNP.x * FXAA_QUALITY__P1; - if(!doneP) posP.y += offNP.y * FXAA_QUALITY__P1; + if(!pairN) lumaNN = lumaSS; + float gradientScaled = gradient * 1.0/4.0; + float lumaMM = lumaM - lumaNN * 0.5; + float subpixF = subpixD * subpixE; + bool lumaMLTZero = lumaMM < 0.0; + lumaEndN -= lumaNN * 0.5; + lumaEndP -= lumaNN * 0.5; + bool doneN = abs(lumaEndN) >= gradientScaled; + bool doneP = abs(lumaEndP) >= gradientScaled; + if(!doneN) posN.x -= offNP.x * FXAA_QUALITY__P1; + if(!doneN) posN.y -= offNP.y * FXAA_QUALITY__P1; + bool doneNP = (!doneN) || (!doneP); + if(!doneP) posP.x += offNP.x * FXAA_QUALITY__P1; + if(!doneP) posP.y += offNP.y * FXAA_QUALITY__P1; if(doneNP) { if(!doneN) lumaEndN = FxaaLuma(FxaaTexTop(tex, posN.xy)); @@ -446,27 +446,27 @@ float4 FxaaPixelShader(float2 pos, FxaaTex tex, float2 fxaaRcpFrame, float fxaaS if(!doneP) posP.y += offNP.y * FXAA_QUALITY__P12; }}}}}}}}}}} - float dstN = posM.x - posN.x; - float dstP = posP.x - posM.x; - if(!horzSpan) dstN = posM.y - posN.y; - if(!horzSpan) dstP = posP.y - posM.y; + float dstN = posM.x - posN.x; + float dstP = posP.x - posM.x; + if(!horzSpan) dstN = posM.y - posN.y; + if(!horzSpan) dstP = posP.y - posM.y; - bool goodSpanN = (lumaEndN < 0.0) != lumaMLTZero; - float spanLength = (dstP + dstN); - bool goodSpanP = (lumaEndP < 0.0) != lumaMLTZero; - float spanLengthRcp = 1.0/spanLength; + bool goodSpanN = (lumaEndN < 0.0) != lumaMLTZero; + float spanLength = (dstP + dstN); + bool goodSpanP = (lumaEndP < 0.0) != lumaMLTZero; + float spanLengthRcp = 1.0/spanLength; - bool directionN = dstN < dstP; - float dst = min(dstN, dstP); - bool goodSpan = directionN ? goodSpanN : goodSpanP; - float subpixG = subpixF * subpixF; - float pixelOffset = (dst * (-spanLengthRcp)) + 0.5; - float subpixH = subpixG * fxaaSubpix; + bool directionN = dstN < dstP; + float dst = min(dstN, dstP); + bool goodSpan = directionN ? goodSpanN : goodSpanP; + float subpixG = subpixF * subpixF; + float pixelOffset = (dst * (-spanLengthRcp)) + 0.5; + float subpixH = subpixG * fxaaSubpix; - float pixelOffsetGood = goodSpan ? pixelOffset : 0.0; - float pixelOffsetSubpix = max(pixelOffsetGood, subpixH); - if(!horzSpan) posM.x += pixelOffsetSubpix * lengthSign; - if( horzSpan) posM.y += pixelOffsetSubpix * lengthSign; + float pixelOffsetGood = goodSpan ? pixelOffset : 0.0; + float pixelOffsetSubpix = max(pixelOffsetGood, subpixH); + if(!horzSpan) posM.x += pixelOffsetSubpix * lengthSign; + if( horzSpan) posM.y += pixelOffsetSubpix * lengthSign; return float4(FxaaTexTop(tex, posM).xyz, lumaM); }