Skip to content

Commit 1fdeab7

Browse files
authored
Merge pull request #7 from papadanku/dev
RaySchism: Do OKLab-based saturation
2 parents e00a11e + 404c5d6 commit 1fdeab7

File tree

3 files changed

+47
-49
lines changed

3 files changed

+47
-49
lines changed

shaders/cChromaticity.fx

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
uniform int _Select <
1010
ui_label = "Chromaticity Method";
1111
ui_type = "combo";
12-
ui_items = "Length (XY)\0Length (XYZ)\0Average (XY)\0Average (XYZ)\0Sum (XY)\0Sum (XYZ)\0Max (XY)\0Max (XYZ)\0Ratio (XY)\0Spherical (XY)\0Hue-Saturation (HSI)\0Hue-Saturation (HSL)\0Hue-Saturation (HSV)\0CoCg (XY)\0CrCb (XY)\0";
12+
ui_items = "Length (XY)\0Length (XYZ)\0Average (XY)\0Average (XYZ)\0Sum (XY)\0Sum (XYZ)\0Max (XY)\0Max (XYZ)\0Ratio (XY)\0Spherical (XY)\0Hue-Saturation (HSI)\0Hue-Saturation (HSL)\0Hue-Saturation (HSV)\0YCoCg (XY)\0OKLab (AB)\0OKLch (CH)\0";
1313
> = 0;
1414

1515
#include "shared/cShadeHDR.fxh"
@@ -67,10 +67,13 @@ float4 PS_Chromaticity(CShade_VS2PS_Quad Input) : SV_TARGET0
6767
Chromaticity.rg = CColor_GetHSVfromRGB(Color).rg;
6868
break;
6969
case 13: // CoCg (XY)
70-
Chromaticity.rg = CColor_GetCoCg(Gamma);
70+
Chromaticity.rg = CColor_GetYCOCGfromRGB(Gamma, true).yz;
7171
break;
72-
case 14: // CrCb (XY)
73-
Chromaticity.rg = CColor_GetCrCb(Gamma);
72+
case 14: // OKLab (AB)
73+
Chromaticity.rg = CColor_GetOKLABfromRGB(Color).yz;
74+
break;
75+
case 15: // OKLch (CH)
76+
Chromaticity.rg = CColor_GetOKLCHfromRGB(Color, true).yz;
7477
break;
7578
default: // No Chromaticity
7679
Chromaticity.rgb = 0.0;

shaders/cRaySchism.fx

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -395,17 +395,22 @@ void ApplyColorGrading(inout float3 Color)
395395
Color = (Color - ACEScc_MIDGRAY) * Contrast + ACEScc_MIDGRAY;
396396
Color = CColor_DecodeLogC(Color);
397397

398+
Color = max(Color, 0.0);
399+
398400
// Apply color filter
399401
Color *= _GradeColorFilter;
400402

401-
// Apply hue shifting
402-
Color = CColor_GetOKLCHfromRGB(Color);
403+
// Convert RGB to OKLch
404+
Color = CColor_GetOKLCHfromRGB(Color, false);
405+
406+
// Apply hue shift
403407
Color.z += HueShift;
404-
Color = CColor_GetRGBfromOKLCH(Color);
405408

406409
// Apply saturation
407-
float Luminance = CColor_GetLuma(Color, 3);
408-
Color = lerp(Luminance, Color, Saturation);
410+
Color.y *= Saturation;
411+
412+
// Convert OKLch to RGB
413+
Color = CColor_GetRGBfromOKLCH(Color);
409414

410415
Color = max(Color, 0.0);
411416
}

shaders/shared/cColor.fxh

Lines changed: 30 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -46,43 +46,6 @@
4646
return Ratio / (Ratio + 1.0);
4747
}
4848

49-
/*
50-
https://www.microsoft.com/en-us/research/publication/ycocg-r-a-color-space-with-rgb-reversibility-and-low-dynamic-range/
51-
---
52-
YCoCg-R: A Color Space with RGB Reversibility and Low Dynamic Range
53-
Henrique S. Malvar, Gary Sullivan
54-
MSR-TR-2003-103 | July 2003
55-
---
56-
Technical contribution to the H.264 Video Coding Standard. Joint Video Team (JVT) of ISO/IEC MPEG & ITU-T VCEG (ISO/IEC JTC1/SC29/WG11 and ITU-T SG16 Q.6) Document JVT-I014r3.
57-
*/
58-
59-
float2 CColor_GetCoCg(float3 Color)
60-
{
61-
float2 CoCg = 0.0;
62-
float2x3 MatCoCg = float2x3
63-
(
64-
float3(1.0, 0.0, -1.0),
65-
float3(-0.5, 1.0, -0.5)
66-
);
67-
68-
CoCg.x = dot(Color, MatCoCg[0]);
69-
CoCg.y = dot(Color, MatCoCg[1]);
70-
71-
return (CoCg * 0.5) + 0.5;
72-
}
73-
74-
/*
75-
RGB to CrCb
76-
---
77-
https://docs.opencv.org/4.7.0/de/d25/imgproc_color_conversions.html
78-
*/
79-
80-
float2 CColor_GetCrCb(float3 Color)
81-
{
82-
float Y = dot(Color, float3(0.299, 0.587, 0.114));
83-
return ((Color.br - Y) * float2(0.564, 0.713)) + 0.5;
84-
}
85-
8649
/*
8750
Color-space conversion
8851
---
@@ -101,6 +64,31 @@
10164
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE
10265
*/
10366

67+
float3 CColor_GetYCOCGfromRGB(float3 RGB, bool Normalize)
68+
{
69+
float3x3 M = float3x3
70+
(
71+
1.0 / 4.0, 1.0 / 2.0, 1.0 / 4.0,
72+
1.0 / 2.0, 0.0, -1.0 / 2.0,
73+
-1.0 / 4.0, 1.0 / 2.0, -1.0 / 4.0
74+
);
75+
76+
RGB = (Normalize) ? mul(M, RGB) + 0.5 : mul(M, RGB);
77+
return RGB;
78+
}
79+
80+
float3 CColor_GetRGBfromYCOCG(float3 YCoCg)
81+
{
82+
float3x3 M = float3x3
83+
(
84+
1.0, 1.0, -1.0,
85+
1.0, 0.0, 1.0,
86+
1.0, -1.0, -1.0
87+
);
88+
89+
return mul(M, YCoCg);
90+
}
91+
10492
float3 CColor_GetHSVfromRGB(float3 Color)
10593
{
10694
float MinRGB = min(min(Color.r, Color.g), Color.b);
@@ -298,12 +286,14 @@
298286
return LMS;
299287
}
300288

301-
float3 CColor_GetOKLCHfromOKLAB(float3 OKLab)
289+
float3 CColor_GetOKLCHfromOKLAB(float3 OKLab, bool Normalize)
302290
{
291+
const float Pi2 = CMath_GetPi() * 2.0;
303292
float3 OKLch = 0.0;
304293
OKLch.x = OKLab.x;
305294
OKLch.y = length(OKLab.yz);
306295
OKLch.z = atan2(OKLab.z, OKLab.y);
296+
OKLch.z = (Normalize) ? OKLch.z / Pi2 : OKLch.z;
307297
return OKLch;
308298
}
309299

@@ -316,9 +306,9 @@
316306
return OKLab;
317307
}
318308

319-
float3 CColor_GetOKLCHfromRGB(float3 Color)
309+
float3 CColor_GetOKLCHfromRGB(float3 Color, bool Normalize)
320310
{
321-
return CColor_GetOKLCHfromOKLAB(CColor_GetOKLABfromRGB(Color));
311+
return CColor_GetOKLCHfromOKLAB(CColor_GetOKLABfromRGB(Color), Normalize);
322312
}
323313

324314
float3 CColor_GetRGBfromOKLCH(float3 OKLch)

0 commit comments

Comments
 (0)