From 3886d72e0f77cb3314d4a3108978d7aa066d5208 Mon Sep 17 00:00:00 2001 From: Dogway <13509598+Dogway@users.noreply.github.com> Date: Wed, 10 Jul 2019 23:20:00 +0100 Subject: [PATCH] GSdx: Add temperature setting. (#2989) Ported libretro's white_point shader to GSdx. Based on the work described here: http://www.zombieprototypes.com/?p=210 --- bin/shaders/GSdx.fx | 40 ++++++++++++++++++++++++++++++++ bin/shaders/GSdx_FX_Settings.ini | 4 ++++ 2 files changed, 44 insertions(+) diff --git a/bin/shaders/GSdx.fx b/bin/shaders/GSdx.fx index 18b0e4be4a..441499a834 100644 --- a/bin/shaders/GSdx.fx +++ b/bin/shaders/GSdx.fx @@ -1937,6 +1937,42 @@ float4 ColorGrading(float4 color, float2 texcoord) } #endif + +/*------------------------------------------------------------------------------ + [COLOR_TEMPERATURE] +------------------------------------------------------------------------------*/ + +#if COLOR_TEMPERATURE == 1 +float4 TemperaturePass(float4 color, float2 texcoord) +{ + float temp = clamp(White_Point, 2000.0, 12000.0) / 100.0f; + + // all calculations assume a scale of 255. We'll normalize this at the end + float3 wp = float3(255.0,255.0,255.0); + + if (White_Point <= 6600.0) { + wp.r = 255.0; + wp.g = - 155.25485562709179 - 0.44596950469579133 * (temp - 2.0) + 104.49216199393888 * log(temp - 2.0); + wp.b = White_Point <= 1900 ? 0.0 : - 254.76935184120902 + 0.8274096064007395 * (temp - 10.0) + 115.67994401066147 * log(temp - 10.0) ; + } else { + wp.r = 351.97690566805693 + 0.114206453784165 * (temp - 55.0) - 40.25366309332127 * log(temp - 55.0); + wp.g = 325.4494125711974 + 0.07943456536662342 * (temp - 50.0) - 28.0852963507957 * log(temp - 50.0); + wp.b = 255.0; + } + + // clamp and normalize + wp.rgb = clamp(wp.rgb, 0.0, 255.0) / 255.0; + + float3 adjusted = color.rgb * wp; + float3 base_luma = XYZtoYxy(RGBtoXYZ(color.rgb)); + float3 adjusted_luma = XYZtoYxy(RGBtoXYZ(adjusted)); + adjusted = adjusted_luma + (float3(base_luma.r,0.0,0.0) - float3(adjusted_luma.r,0.0,0.0)); + color = float4(XYZtoRGB(YxytoXYZ(adjusted)), 1.0); + + return color; +} +#endif + /*------------------------------------------------------------------------------ [SCANLINES CODE SECTION] ------------------------------------------------------------------------------*/ @@ -2457,6 +2493,10 @@ PS_OUTPUT ps_main(VS_OUTPUT input) color = ContrastPass(color, texcoord); #endif + #if COLOR_TEMPERATURE == 1 + color = TemperaturePass(color, texcoord); + #endif + #if VIGNETTE == 1 color = VignettePass(color, texcoord); #endif diff --git a/bin/shaders/GSdx_FX_Settings.ini b/bin/shaders/GSdx_FX_Settings.ini index 3344dbc693..8a6afaba07 100644 --- a/bin/shaders/GSdx_FX_Settings.ini +++ b/bin/shaders/GSdx_FX_Settings.ini @@ -44,6 +44,7 @@ #define CURVE_CONTRAST 0 //# S-Curve Scene Contrast Enhancement. Locally adjusts contrast using a four-point cubic bezier spline. #define CEL_SHADING 0 //# PX Cel Shading. Simulates the look of animation/toon. Typically best suited for animated style games. #define PAINT_SHADING 0 //# Paint Shading. Creates the effect of a painted scene. Adapted from ENB series, it's pretty performance heavy. +#define COLOR_TEMPERATURE 0 //# White Point Temperature. Changes the temperature of the image from D65 white point reference. //#[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 LOTTES_CRT 0 //# Timothy Lottes CRT emulation effect. Similar to scanlines, but with more control options. Ported by request. @@ -128,6 +129,9 @@ #define GradingStrength 0.25 //[0.00 to 1.00] The overall max strength of the colour grading effect. Raise to increase, lower to decrease the amount. #define Correlation 1.00 //[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. +//##[COLOR TEMPERATURE] +#define White_Point 6500.0 //[2000.0 to 12000.0] Temperature value given in Kelvin. A typical CRT has a target white point temperature of D93 (9300K) + //##[CEL SHADING] #define EdgeStrength 1.00 //[0.00 to 4.00] Overall strength of the cel edge outline effect. Affects the overall density. 0.00: no outlines. #define EdgeFilter 0.75 //[0.10 to 2.00] Filters out fainter cel edges. Use it for balancing the cel edge density. EG: for faces, foliage, etc.