mirror of
https://github.com/libretro/slang-shaders.git
synced 2024-11-23 08:19:54 +00:00
Added the colour space gamuts back in after temporarily removing them to fix bugs Added gamma out as well as renaming previous gamma to gamma in
This commit is contained in:
parent
e348673023
commit
8691daf16e
@ -43,8 +43,6 @@ hcrt_crt_screen_type = "2.000000"
|
|||||||
hcrt_crt_resolution = "0.000000"
|
hcrt_crt_resolution = "0.000000"
|
||||||
hcrt_paper_white_nits = "700.000000"
|
hcrt_paper_white_nits = "700.000000"
|
||||||
hcrt_expand_gamut = "0.000000"
|
hcrt_expand_gamut = "0.000000"
|
||||||
hcrt_white_temperature = "0.000000"
|
|
||||||
hcrt_gamma = "0.000000"
|
|
||||||
|
|
||||||
hcrt_red_vertical_convergence = "0.000000"
|
hcrt_red_vertical_convergence = "0.000000"
|
||||||
hcrt_green_vertical_convergence = "0.000000"
|
hcrt_green_vertical_convergence = "0.000000"
|
||||||
|
@ -2,6 +2,4 @@
|
|||||||
|
|
||||||
hcrt_hdr = "0.000000"
|
hcrt_hdr = "0.000000"
|
||||||
|
|
||||||
hcrt_brightness = "0.000000"
|
hcrt_gamma_in = "-0.200000"
|
||||||
hcrt_contrast = "0.000000"
|
|
||||||
hcrt_gamma = "-0.600000"
|
|
@ -6,7 +6,7 @@ hcrt_paper_white_nits = "700.000000"
|
|||||||
hcrt_brightness = "0.200000"
|
hcrt_brightness = "0.200000"
|
||||||
hcrt_contrast = "0.000000"
|
hcrt_contrast = "0.000000"
|
||||||
hcrt_saturation = "0.000000"
|
hcrt_saturation = "0.000000"
|
||||||
hcrt_gamma = "-0.3000000"
|
hcrt_gamma_in = "-0.3000000"
|
||||||
hcrt_expand_gamut = "1.000000"
|
hcrt_expand_gamut = "1.000000"
|
||||||
hcrt_red_scanline_min = "0.2000000"
|
hcrt_red_scanline_min = "0.2000000"
|
||||||
hcrt_red_scanline_max = "1.050000"
|
hcrt_red_scanline_max = "1.050000"
|
||||||
|
@ -2,6 +2,4 @@
|
|||||||
|
|
||||||
hcrt_hdr = "0.000000"
|
hcrt_hdr = "0.000000"
|
||||||
|
|
||||||
hcrt_brightness = "0.000000"
|
hcrt_gamma_in = "-0.200000"
|
||||||
hcrt_contrast = "0.000000"
|
|
||||||
hcrt_gamma = "-0.600000"
|
|
@ -2,6 +2,4 @@
|
|||||||
|
|
||||||
hcrt_hdr = "0.000000"
|
hcrt_hdr = "0.000000"
|
||||||
|
|
||||||
hcrt_brightness = "0.000000"
|
hcrt_gamma_in = "-0.200000"
|
||||||
hcrt_contrast = "0.000000"
|
|
||||||
hcrt_gamma = "-0.600000"
|
|
@ -2,6 +2,4 @@
|
|||||||
|
|
||||||
hcrt_hdr = "0.000000"
|
hcrt_hdr = "0.000000"
|
||||||
|
|
||||||
hcrt_brightness = "0.000000"
|
hcrt_gamma_in = "-0.200000"
|
||||||
hcrt_contrast = "0.000000"
|
|
||||||
hcrt_gamma = "-0.600000"
|
|
@ -2,6 +2,4 @@
|
|||||||
|
|
||||||
hcrt_hdr = "0.000000"
|
hcrt_hdr = "0.000000"
|
||||||
|
|
||||||
hcrt_brightness = "0.000000"
|
hcrt_gamma_in = "-0.200000"
|
||||||
hcrt_contrast = "0.000000"
|
|
||||||
hcrt_gamma = "-0.600000"
|
|
||||||
|
@ -2,13 +2,11 @@
|
|||||||
|
|
||||||
hcrt_hdr = "1.000000"
|
hcrt_hdr = "1.000000"
|
||||||
hcrt_crt_resolution = "0.000000"
|
hcrt_crt_resolution = "0.000000"
|
||||||
hcrt_colour_system = "0.000000"
|
hcrt_colour_system = "3.000000"
|
||||||
hcrt_white_temperature = "2800.000000"
|
|
||||||
hcrt_expand_gamut = "1.000000"
|
hcrt_expand_gamut = "1.000000"
|
||||||
hcrt_brightness = "0.150000"
|
hcrt_brightness = "0.150000"
|
||||||
hcrt_contrast = "0.000000"
|
|
||||||
hcrt_saturation = "0.100000"
|
hcrt_saturation = "0.100000"
|
||||||
hcrt_gamma = "0.250000"
|
hcrt_gamma_in = "0.250000"
|
||||||
hcrt_red_vertical_convergence = "0.000000"
|
hcrt_red_vertical_convergence = "0.000000"
|
||||||
hcrt_green_vertical_convergence = "-0.150000"
|
hcrt_green_vertical_convergence = "-0.150000"
|
||||||
hcrt_blue_vertical_convergence = "0.000000"
|
hcrt_blue_vertical_convergence = "0.000000"
|
||||||
|
@ -2,6 +2,4 @@
|
|||||||
|
|
||||||
hcrt_hdr = "0.000000"
|
hcrt_hdr = "0.000000"
|
||||||
|
|
||||||
hcrt_brightness = "0.000000"
|
hcrt_gamma_in = "-0.200000"
|
||||||
hcrt_contrast = "0.000000"
|
|
||||||
hcrt_gamma = "-0.600000"
|
|
@ -2,11 +2,8 @@
|
|||||||
|
|
||||||
hcrt_hdr = "1.000000"
|
hcrt_hdr = "1.000000"
|
||||||
hcrt_brightness = "0.150000"
|
hcrt_brightness = "0.150000"
|
||||||
hcrt_colour_system = "0.000000"
|
hcrt_colour_system = "3.000000"
|
||||||
hcrt_white_temperature = "2800.000000"
|
|
||||||
hcrt_expand_gamut = "1.000000"
|
hcrt_expand_gamut = "1.000000"
|
||||||
hcrt_contrast = "0.000000"
|
|
||||||
hcrt_gamma = "0.000000"
|
|
||||||
hcrt_crt_resolution = "1.000000"
|
hcrt_crt_resolution = "1.000000"
|
||||||
hcrt_red_vertical_convergence = "0.100000"
|
hcrt_red_vertical_convergence = "0.100000"
|
||||||
hcrt_green_vertical_convergence = "0.000000"
|
hcrt_green_vertical_convergence = "0.000000"
|
||||||
|
@ -2,6 +2,4 @@
|
|||||||
|
|
||||||
hcrt_hdr = "0.000000"
|
hcrt_hdr = "0.000000"
|
||||||
|
|
||||||
hcrt_brightness = "0.000000"
|
hcrt_gamma_in = "-0.200000"
|
||||||
hcrt_contrast = "0.000000"
|
|
||||||
hcrt_gamma = "-0.600000"
|
|
@ -2,11 +2,8 @@
|
|||||||
|
|
||||||
hcrt_hdr = "1.000000"
|
hcrt_hdr = "1.000000"
|
||||||
hcrt_brightness = "0.150000"
|
hcrt_brightness = "0.150000"
|
||||||
hcrt_colour_system = "0.000000"
|
hcrt_colour_system = "3.000000"
|
||||||
hcrt_white_temperature = "2800.000000"
|
|
||||||
hcrt_expand_gamut = "1.000000"
|
hcrt_expand_gamut = "1.000000"
|
||||||
hcrt_contrast = "0.000000"
|
|
||||||
hcrt_gamma = "0.000000"
|
|
||||||
hcrt_red_vertical_convergence = "-0.140000"
|
hcrt_red_vertical_convergence = "-0.140000"
|
||||||
hcrt_green_vertical_convergence = "0.000000"
|
hcrt_green_vertical_convergence = "0.000000"
|
||||||
hcrt_blue_vertical_convergence = "0.000000"
|
hcrt_blue_vertical_convergence = "0.000000"
|
||||||
|
@ -2,6 +2,4 @@
|
|||||||
|
|
||||||
hcrt_hdr = "0.000000"
|
hcrt_hdr = "0.000000"
|
||||||
|
|
||||||
hcrt_brightness = "0.000000"
|
hcrt_gamma_in = "-0.200000"
|
||||||
hcrt_contrast = "0.000000"
|
|
||||||
hcrt_gamma = "-0.600000"
|
|
@ -2,6 +2,4 @@
|
|||||||
|
|
||||||
hcrt_hdr = "0.000000"
|
hcrt_hdr = "0.000000"
|
||||||
|
|
||||||
hcrt_brightness = "0.00000"
|
hcrt_gamma_in = "-0.200000"
|
||||||
hcrt_contrast = "0.000000"
|
|
||||||
hcrt_gamma = "-0.600000"
|
|
@ -2,6 +2,4 @@
|
|||||||
|
|
||||||
hcrt_hdr = "0.000000"
|
hcrt_hdr = "0.000000"
|
||||||
|
|
||||||
hcrt_brightness = "0.000000"
|
hcrt_gamma_in = "-0.200000"
|
||||||
hcrt_contrast = "0.000000"
|
|
||||||
hcrt_gamma = "-0.600000"
|
|
@ -37,7 +37,7 @@ layout(push_constant) uniform Push
|
|||||||
float hcrt_brightness;
|
float hcrt_brightness;
|
||||||
float hcrt_contrast;
|
float hcrt_contrast;
|
||||||
float hcrt_saturation;
|
float hcrt_saturation;
|
||||||
float hcrt_gamma;
|
float hcrt_gamma_in;
|
||||||
} params;
|
} params;
|
||||||
|
|
||||||
layout(std140, set = 0, binding = 0) uniform UBO
|
layout(std140, set = 0, binding = 0) uniform UBO
|
||||||
@ -58,7 +58,7 @@ layout(std140, set = 0, binding = 0) uniform UBO
|
|||||||
#define HCRT_BRIGHTNESS params.hcrt_brightness
|
#define HCRT_BRIGHTNESS params.hcrt_brightness
|
||||||
#define HCRT_CONTRAST params.hcrt_contrast
|
#define HCRT_CONTRAST params.hcrt_contrast
|
||||||
#define HCRT_SATURATION params.hcrt_saturation
|
#define HCRT_SATURATION params.hcrt_saturation
|
||||||
#define HCRT_GAMMA params.hcrt_gamma
|
#define HCRT_GAMMA_IN params.hcrt_gamma_in
|
||||||
|
|
||||||
#define COMPAT_TEXTURE(c, d) texture(c, d)
|
#define COMPAT_TEXTURE(c, d) texture(c, d)
|
||||||
|
|
||||||
|
@ -33,7 +33,7 @@ layout(push_constant) uniform Push
|
|||||||
float hcrt_max_nits;
|
float hcrt_max_nits;
|
||||||
float hcrt_paper_white_nits;
|
float hcrt_paper_white_nits;
|
||||||
float hcrt_expand_gamut;
|
float hcrt_expand_gamut;
|
||||||
float hcrt_gamma;
|
float hcrt_gamma_out;
|
||||||
|
|
||||||
float hcrt_lcd_resolution;
|
float hcrt_lcd_resolution;
|
||||||
float hcrt_lcd_subpixel;
|
float hcrt_lcd_subpixel;
|
||||||
@ -93,7 +93,7 @@ layout(std140, set = 0, binding = 0) uniform UBO
|
|||||||
#define HCRT_MAX_NITS params.hcrt_max_nits
|
#define HCRT_MAX_NITS params.hcrt_max_nits
|
||||||
#define HCRT_PAPER_WHITE_NITS params.hcrt_paper_white_nits
|
#define HCRT_PAPER_WHITE_NITS params.hcrt_paper_white_nits
|
||||||
#define HCRT_EXPAND_GAMUT params.hcrt_expand_gamut
|
#define HCRT_EXPAND_GAMUT params.hcrt_expand_gamut
|
||||||
#define HCRT_GAMMA params.hcrt_gamma
|
#define HCRT_GAMMA_OUT params.hcrt_gamma_out
|
||||||
|
|
||||||
#define HCRT_LCD_RESOLUTION params.hcrt_lcd_resolution
|
#define HCRT_LCD_RESOLUTION params.hcrt_lcd_resolution
|
||||||
#define HCRT_LCD_SUBPIXEL params.hcrt_lcd_subpixel
|
#define HCRT_LCD_SUBPIXEL params.hcrt_lcd_subpixel
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
|
|
||||||
#define kColourSystems 3
|
#define kColourSystems 4
|
||||||
|
|
||||||
#define kD50 5003.0f
|
#define kD50 5003.0f
|
||||||
#define kD55 5503.0f
|
#define kD55 5503.0f
|
||||||
@ -7,49 +7,29 @@
|
|||||||
#define kD75 7504.0f
|
#define kD75 7504.0f
|
||||||
#define kD93 9305.0f
|
#define kD93 9305.0f
|
||||||
|
|
||||||
const mat3 XYZ_to_sRGB = mat3(
|
const mat3 k709_to_XYZ = mat3(
|
||||||
3.24081254005432130, -0.969243049621582000, 0.055638398975133896,
|
0.412391f, 0.357584f, 0.180481f,
|
||||||
-1.53730857372283940, 1.875966310501098600, -0.204007431864738460,
|
0.212639f, 0.715169f, 0.072192f,
|
||||||
-0.49858659505844116, 0.041555050760507584, 1.057129383087158200);
|
0.019331f, 0.119195f, 0.950532f);
|
||||||
|
|
||||||
const mat3 sRGB_to_XYZ = mat3(
|
const mat3 kPAL_to_XYZ = mat3(
|
||||||
0.41241079568862915, 0.21264933049678802, 0.019331756979227066,
|
0.430554f, 0.341550f, 0.178352f,
|
||||||
0.35758456587791443, 0.71516913175582890, 0.119194857776165010,
|
0.222004f, 0.706655f, 0.071341f,
|
||||||
0.18045382201671600, 0.07218152284622192, 0.950390160083770800);
|
0.020182f, 0.129553f, 0.939322f);
|
||||||
|
|
||||||
// Phosphor transforms found in Dogway's Grade.slang shader
|
const mat3 kNTSC_to_XYZ = mat3(
|
||||||
|
0.393521f, 0.365258f, 0.191677f,
|
||||||
|
0.212376f, 0.701060f, 0.086564f,
|
||||||
|
0.018739f, 0.111934f, 0.958385f);
|
||||||
|
|
||||||
// SMPTE-C - Measured Average Phosphor (1979-1994)
|
const mat3 kXYZ_to_709 = mat3(
|
||||||
const mat3 P22_transform = mat3(
|
3.240970f, -1.537383f, -0.498611f,
|
||||||
0.4665636420249939, 0.25661000609397890, 0.005832045804709196,
|
-0.969244f, 1.875968f, 0.041555f,
|
||||||
0.3039233088493347, 0.66820019483566280, 0.105618737637996670,
|
0.055630f, -0.203977f, 1.056972f);
|
||||||
0.1799621731042862, 0.07518967241048813, 0.977465748786926300);
|
|
||||||
|
|
||||||
// SMPTE RP 145-1994 (SMPTE-C), 170M-1999
|
const mat3 kColourGamut[kColourSystems] = { k709_to_XYZ, kPAL_to_XYZ, kNTSC_to_XYZ, kNTSC_to_XYZ };
|
||||||
// SMPTE-C - Standard Phosphor (Rec.601 NTSC)
|
|
||||||
const mat3 SMPTE_transform = mat3(
|
|
||||||
0.39354196190834045, 0.21238772571086884, 0.01874009333550930,
|
|
||||||
0.36525884270668030, 0.70106136798858640, 0.11193416267633438,
|
|
||||||
0.19164848327636720, 0.08655092865228653, 0.95824241638183590);
|
|
||||||
|
|
||||||
// SMPTE RP 145-1994 (SMPTE-C), 170M-1999
|
const float kTemperatures[kColourSystems] = { kD65, kD65, kD65, kD93 };
|
||||||
// NTSC-J - Standard Phosphor (https://web.archive.org/web/20130413104152/http://arib.or.jp/english/html/overview/doc/4-TR-B09v1_0.pdf)
|
|
||||||
const mat3 NTSC_J_transform = mat3(
|
|
||||||
0.39603787660598755, 0.22429330646991730, 0.02050681784749031,
|
|
||||||
0.31201449036598206, 0.67417418956756590, 0.12814880907535553,
|
|
||||||
0.24496731162071228, 0.10153251141309738, 1.26512730121612550);
|
|
||||||
|
|
||||||
// ITU-R BT.470/601 (B/G)
|
|
||||||
// EBU Tech.3213-E PAL - Standard Phosphor for Studio Monitors
|
|
||||||
const mat3 EBU_transform = mat3(
|
|
||||||
0.43194326758384705, 0.22272075712680817, 0.020247340202331543,
|
|
||||||
0.34123489260673523, 0.70600330829620360, 0.129433929920196530,
|
|
||||||
0.17818950116634370, 0.07127580046653748, 0.938464701175689700);
|
|
||||||
|
|
||||||
// CRT Phosphor Gamut
|
|
||||||
const mat3 kPhosphorGamut[kColourSystems] = { EBU_transform , P22_transform, NTSC_J_transform };
|
|
||||||
|
|
||||||
const float kTemperatures[kColourSystems] = { kD65, kD65, kD93 }; // 8942.0f
|
|
||||||
|
|
||||||
// Values from: http://blenderartists.org/forum/showthread.php?270332-OSL-Goodness&p=2268693&viewfull=1#post2268693
|
// Values from: http://blenderartists.org/forum/showthread.php?270332-OSL-Goodness&p=2268693&viewfull=1#post2268693
|
||||||
const mat3 kWarmTemperature = mat3(
|
const mat3 kWarmTemperature = mat3(
|
||||||
@ -86,53 +66,25 @@ vec3 WhiteBalance(float temperature, vec3 colour)
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
float r601r709ToLinear_1(const float channel)
|
float r601ToLinear_1(const float channel)
|
||||||
{
|
{
|
||||||
return (channel >= 0.081f) ? pow((channel + 0.099f) * (1.0f / 1.099f), (1.0f / 0.45f) + HCRT_GAMMA) : channel * (1.0f / 4.5f);
|
return (channel >= 0.081f) ? pow((channel + 0.099f) * (1.0f / 1.099f), (1.0f / 0.45f)) : channel * (1.0f / 4.5f);
|
||||||
}
|
}
|
||||||
|
|
||||||
vec3 r601r709ToLinear(const vec3 colour)
|
vec3 r601ToLinear(const vec3 colour)
|
||||||
{
|
{
|
||||||
//return vec3(r601r709ToLinear_1(colour.r), r601r709ToLinear_1(colour.g), r601r709ToLinear_1(colour.b));
|
return vec3(r601ToLinear_1(colour.r), r601ToLinear_1(colour.g), r601ToLinear_1(colour.b));
|
||||||
return pow(colour, vec3((1.0f / 0.45f) + HCRT_GAMMA));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//float LinearTor601r709_1(const float channel)
|
|
||||||
//{
|
|
||||||
// return (channel >= 0.018f) ? pow(channel * 1.099f, 0.45f) - 0.099f : channel * 4.5f;
|
|
||||||
//}
|
|
||||||
|
|
||||||
//vec3 LinearTor601r709(const vec3 colour)
|
float r709ToLinear_1(const float channel)
|
||||||
//{
|
|
||||||
// return vec3(LinearTor601r709_1(colour.r), LinearTor601r709_1(colour.g), LinearTor601r709_1(colour.b));
|
|
||||||
//}
|
|
||||||
|
|
||||||
// SDR Colour output spaces
|
|
||||||
float sRGBToLinear_1(const float channel)
|
|
||||||
{
|
{
|
||||||
return (channel > 0.04045f) ? pow((channel + 0.055f) * (1.0f / 1.055f), 2.4f) : channel * (1.0f / 12.92f);
|
return (channel >= 0.081f) ? pow((channel + 0.099f) * (1.0f / 1.099f), (1.0f / 0.45f)) : channel * (1.0f / 4.5f);
|
||||||
}
|
}
|
||||||
|
|
||||||
vec3 sRGBToLinear(const vec3 colour)
|
vec3 r709ToLinear(const vec3 colour)
|
||||||
{
|
{
|
||||||
//return vec3(sRGBToLinear_1(colour.r), sRGBToLinear_1(colour.g), sRGBToLinear_1(colour.b));
|
return vec3(r709ToLinear_1(colour.r), r709ToLinear_1(colour.g), r709ToLinear_1(colour.b));
|
||||||
return pow(colour, vec3(2.4f));
|
|
||||||
}
|
|
||||||
|
|
||||||
float LinearTosRGB_1(const float channel)
|
|
||||||
{
|
|
||||||
return (channel > 0.0031308f) ? (1.055f * pow(channel, 1.0f / 2.4f)) - 0.055f : channel * 12.92f;
|
|
||||||
}
|
|
||||||
|
|
||||||
vec3 LinearTosRGB(const vec3 colour)
|
|
||||||
{
|
|
||||||
//return vec3(LinearTosRGB_1(colour.r), LinearTosRGB_1(colour.g), LinearTosRGB_1(colour.b));
|
|
||||||
return pow(colour, vec3(1.0f / 2.4f));
|
|
||||||
}
|
|
||||||
|
|
||||||
vec3 LinearToDCIP3(const vec3 colour)
|
|
||||||
{
|
|
||||||
return pow(colour, vec3(1.0f / 2.6f));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// XYZ Yxy transforms found in Dogway's Grade.slang shader
|
// XYZ Yxy transforms found in Dogway's Grade.slang shader
|
||||||
@ -193,19 +145,17 @@ vec3 Saturation(const vec3 colour)
|
|||||||
return clamp(mix(vec3(luma), colour, vec3(saturation) * 2.0f), 0.0f, 1.0f);
|
return clamp(mix(vec3(luma), colour, vec3(saturation) * 2.0f), 0.0f, 1.0f);
|
||||||
}
|
}
|
||||||
|
|
||||||
vec3 BrightnessContrastSaturation(const vec3 linear)
|
vec3 BrightnessContrastSaturation(const vec3 xyz)
|
||||||
{
|
{
|
||||||
const vec3 xyz = sRGB_to_XYZ * linear;
|
|
||||||
const vec3 Yxy = XYZtoYxy(xyz);
|
const vec3 Yxy = XYZtoYxy(xyz);
|
||||||
const float Y_gamma = clamp(LinearTosRGB_1(Yxy.x), 0.0f, 1.0f);
|
const float Y_gamma = clamp(pow(Yxy.x, 1.0f / 2.4f), 0.0f, 1.0f);
|
||||||
|
|
||||||
const float Y_brightness = Brightness(Y_gamma);
|
const float Y_brightness = Brightness(Y_gamma);
|
||||||
|
|
||||||
const float Y_contrast = Contrast(Y_brightness);
|
const float Y_contrast = Contrast(Y_brightness);
|
||||||
|
|
||||||
const vec3 contrast_linear = vec3(sRGBToLinear_1(Y_contrast), Yxy.y, Yxy.z);
|
const vec3 contrast_linear = vec3(pow(Y_contrast, 2.4f), Yxy.y, Yxy.z);
|
||||||
const vec3 contrast_xyz = YxytoXYZ(contrast_linear);
|
const vec3 contrast = clamp(YxytoXYZ(contrast_linear) * kXYZ_to_709, 0.0f, 1.0f);
|
||||||
const vec3 contrast = clamp(XYZ_to_sRGB * contrast_xyz, 0.0f, 1.0f);
|
|
||||||
|
|
||||||
const vec3 saturation = Saturation(contrast);
|
const vec3 saturation = Saturation(contrast);
|
||||||
|
|
||||||
@ -216,13 +166,13 @@ vec3 ColourGrade(const vec3 colour)
|
|||||||
{
|
{
|
||||||
const uint colour_system = uint(HCRT_CRT_COLOUR_SYSTEM);
|
const uint colour_system = uint(HCRT_CRT_COLOUR_SYSTEM);
|
||||||
|
|
||||||
const vec3 linear = r601r709ToLinear(colour);
|
const vec3 white_point = WhiteBalance(kTemperatures[colour_system] + HCRT_WHITE_TEMPERATURE, colour);
|
||||||
|
|
||||||
const vec3 gamut = linear; // (HCRT_HDR == 0.0f) && (HCRT_OUTPUT_COLOUR_SPACE == 0.0f) ? linear : kPhosphorGamut[colour_system] * linear;
|
const vec3 linear = pow(white_point, vec3((1.0f / 0.45f) + HCRT_GAMMA_IN));
|
||||||
|
|
||||||
const vec3 white_point = WhiteBalance(kTemperatures[colour_system] + HCRT_WHITE_TEMPERATURE, gamut);
|
const vec3 xyz = linear * kColourGamut[colour_system];
|
||||||
|
|
||||||
const vec3 graded = BrightnessContrastSaturation(white_point);
|
const vec3 graded = BrightnessContrastSaturation(xyz);
|
||||||
|
|
||||||
return graded;
|
return graded;
|
||||||
}
|
}
|
||||||
|
@ -1,8 +1,18 @@
|
|||||||
// SDR Colour output spaces
|
// SDR Colour output spaces
|
||||||
|
|
||||||
|
const mat3 k709_to_XYZ = mat3(
|
||||||
|
0.412391f, 0.357584f, 0.180481f,
|
||||||
|
0.212639f, 0.715169f, 0.072192f,
|
||||||
|
0.019331f, 0.119195f, 0.950532f);
|
||||||
|
|
||||||
|
const mat3 kXYZ_to_DCIP3 = mat3 (
|
||||||
|
2.4934969119f, -0.9313836179f, -0.4027107845f,
|
||||||
|
-0.8294889696f, 1.7626640603f, 0.0236246858f,
|
||||||
|
0.0358458302f, -0.0761723893f, 0.9568845240f);
|
||||||
|
|
||||||
float LinearTosRGB_1(const float channel)
|
float LinearTosRGB_1(const float channel)
|
||||||
{
|
{
|
||||||
return (channel > 0.0031308f) ? (1.055f * pow(channel, 1.0f / 2.4f)) - 0.055f : channel * 12.92f;
|
return (channel > 0.0031308f) ? (1.055f * pow(channel, (1.0f / 2.4f) + HCRT_GAMMA_OUT)) - 0.055f : channel * 12.92f;
|
||||||
}
|
}
|
||||||
|
|
||||||
vec3 LinearTosRGB(const vec3 colour)
|
vec3 LinearTosRGB(const vec3 colour)
|
||||||
@ -10,16 +20,38 @@ vec3 LinearTosRGB(const vec3 colour)
|
|||||||
return vec3(LinearTosRGB_1(colour.r), LinearTosRGB_1(colour.g), LinearTosRGB_1(colour.b));
|
return vec3(LinearTosRGB_1(colour.r), LinearTosRGB_1(colour.g), LinearTosRGB_1(colour.b));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
float LinearTo709_1(const float channel)
|
||||||
|
{
|
||||||
|
return (channel >= 0.018f) ? pow(channel * 1.099f, 0.45f + HCRT_GAMMA_OUT) - 0.099f : channel * 4.5f;
|
||||||
|
}
|
||||||
|
|
||||||
|
vec3 LinearTo709(const vec3 colour)
|
||||||
|
{
|
||||||
|
return vec3(LinearTo709_1(colour.r), LinearTo709_1(colour.g), LinearTo709_1(colour.b));
|
||||||
|
}
|
||||||
|
|
||||||
vec3 LinearToDCIP3(const vec3 colour)
|
vec3 LinearToDCIP3(const vec3 colour)
|
||||||
{
|
{
|
||||||
return pow(colour, vec3(1.0f / 2.6f));
|
return clamp(pow(colour, vec3((1.0f / 2.6f) + HCRT_GAMMA_OUT)), 0.0f, 1.0f);
|
||||||
}
|
}
|
||||||
|
|
||||||
vec3 GammaCorrect(const vec3 scanline_colour)
|
vec3 GammaCorrect(const vec3 scanline_colour)
|
||||||
{
|
{
|
||||||
if(HCRT_HDR < 1.0f)
|
if(HCRT_HDR < 1.0f)
|
||||||
{
|
{
|
||||||
return HCRT_OUTPUT_COLOUR_SPACE == 0.0f ? LinearTosRGB(scanline_colour) : LinearToDCIP3(scanline_colour);
|
if(HCRT_OUTPUT_COLOUR_SPACE == 0.0f)
|
||||||
|
{
|
||||||
|
return LinearTo709(scanline_colour);
|
||||||
|
}
|
||||||
|
else if(HCRT_OUTPUT_COLOUR_SPACE == 1.0f)
|
||||||
|
{
|
||||||
|
return LinearTosRGB(scanline_colour);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
const vec3 dcip3_colour = (scanline_colour * k709_to_XYZ) * kXYZ_to_DCIP3;
|
||||||
|
return LinearToDCIP3(dcip3_colour);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -1,16 +1,18 @@
|
|||||||
|
|
||||||
#define kMaxNitsFor2084 10000.0f
|
#define kMaxNitsFor2084 10000.0f
|
||||||
|
|
||||||
const mat3 k709to2020 = mat3 (
|
const mat3 k709_to_2020 = mat3 (
|
||||||
0.6274040f, 0.3292820f, 0.0433136f,
|
0.6274040f, 0.3292820f, 0.0433136f,
|
||||||
0.0690970f, 0.9195400f, 0.0113612f,
|
0.0690970f, 0.9195400f, 0.0113612f,
|
||||||
0.0163916f, 0.0880132f, 0.8955950f);
|
0.0163916f, 0.0880132f, 0.8955950f);
|
||||||
|
|
||||||
/* START Converted from (Copyright (c) Microsoft Corporation - Licensed under the MIT License.) https://github.com/microsoft/Xbox-ATG-Samples/tree/master/Kits/ATGTK/HDR */
|
/* START Converted from (Copyright (c) Microsoft Corporation - Licensed under the MIT License.) https://github.com/microsoft/Xbox-ATG-Samples/tree/master/Kits/ATGTK/HDR */
|
||||||
const mat3 kExpanded709to2020 = mat3 (
|
const mat3 kExpanded709_to_2020 = mat3 (
|
||||||
0.6274040f, 0.3292820f, 0.0433136f,
|
0.6274040f, 0.3292820f, 0.0433136f,
|
||||||
0.0457456, 0.941777, 0.0124772,
|
0.0457456f, 0.941777f, 0.0124772f,
|
||||||
-0.00121055, 0.0176041, 0.983607);
|
-0.00121055f, 0.0176041f, 0.983607f);
|
||||||
|
|
||||||
|
const mat3 k2020Gamuts[2] = { k709_to_2020, kExpanded709_to_2020 };
|
||||||
|
|
||||||
vec3 LinearToST2084(vec3 normalizedLinearValue)
|
vec3 LinearToST2084(vec3 normalizedLinearValue)
|
||||||
{
|
{
|
||||||
@ -22,7 +24,7 @@ vec3 LinearToST2084(vec3 normalizedLinearValue)
|
|||||||
/* Convert into HDR10 */
|
/* Convert into HDR10 */
|
||||||
vec3 Hdr10(vec3 hdr_linear, float paper_white_nits, float expand_gamut)
|
vec3 Hdr10(vec3 hdr_linear, float paper_white_nits, float expand_gamut)
|
||||||
{
|
{
|
||||||
vec3 rec2020 = expand_gamut > 0.0f ? hdr_linear * kExpanded709to2020 : hdr_linear * k709to2020;
|
vec3 rec2020 = hdr_linear * k2020Gamuts[uint(expand_gamut)];
|
||||||
vec3 linearColour = rec2020 * (paper_white_nits / kMaxNitsFor2084);
|
vec3 linearColour = rec2020 * (paper_white_nits / kMaxNitsFor2084);
|
||||||
vec3 hdr10 = LinearToST2084(linearColour);
|
vec3 hdr10 = LinearToST2084(linearColour);
|
||||||
|
|
||||||
|
@ -1,14 +1,19 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#pragma parameter hcrt_title "SONY MEGATRON COLOUR VIDEO MONITOR" 0.0 0.0 0.0001 0.0001
|
#pragma parameter hcrt_title "SONY MEGATRON COLOUR VIDEO MONITOR" 0.0 0.0 0.0001 0.0001
|
||||||
#pragma parameter hcrt_space0 " " 0.0 0.0 0.0001 0.0001
|
#pragma parameter hcrt_space0 " " 0.0 0.0 0.0001 0.0001
|
||||||
#pragma parameter hcrt_support0 "SDR mode: Turn up your TV's brightness as high as possible" 0.0 0.0 0.0001 0.0001
|
#pragma parameter hcrt_support0 "SDR mode: Turn up your TV's brightness as high as possible" 0.0 0.0 0.0001 0.0001
|
||||||
#pragma parameter hcrt_support1 "HDR mode: Set the peak luminance to that of your TV." 0.0 0.0 0.0001 0.0001
|
#pragma parameter hcrt_support1 "HDR mode: Set the peak luminance to that of your TV." 0.0 0.0 0.0001 0.0001
|
||||||
#pragma parameter hcrt_support2 "Then adjust paper white luminance until it looks right" 0.0 0.0 0.0001 0.0001
|
#pragma parameter hcrt_support2 "Then adjust paper white luminance until it looks right" 0.0 0.0 0.0001 0.0001
|
||||||
|
#pragma parameter hcrt_support3 " " 0.0 0.0 0.0001 0.0001
|
||||||
|
#pragma parameter hcrt_support4 "Default white points for the different colour systems:" 0.0 0.0 0.0001 0.0001
|
||||||
|
#pragma parameter hcrt_support5 "709: 6500K, PAL: 6500K, NTSC-U: 6500K, NTSC-J: 9300K" 0.0 0.0 0.0001 0.0001
|
||||||
#pragma parameter hcrt_space1 " " 0.0 0.0 0.0001 0.0001
|
#pragma parameter hcrt_space1 " " 0.0 0.0 0.0001 0.0001
|
||||||
#pragma parameter hcrt_user_settings "YOUR DISPLAY'S SETTINGS:" 0.0 0.0 0.0001 0.0001
|
#pragma parameter hcrt_user_settings "YOUR DISPLAY'S SETTINGS:" 0.0 0.0 0.0001 0.0001
|
||||||
#pragma parameter hcrt_hdr " SDR | HDR" 1.0 0.0 1.0 1.0
|
#pragma parameter hcrt_hdr " SDR | HDR" 1.0 0.0 1.0 1.0
|
||||||
#pragma parameter hcrt_colour_space " SDR: Display's Colour Space: sRGB | DCI-P3" 0.0 0.0 1.0 1.0
|
#pragma parameter hcrt_colour_space " SDR: Display's Colour Space: r709 | sRGB | DCI-P3" 1.0 0.0 2.0 1.0
|
||||||
#pragma parameter hcrt_max_nits " HDR: Display's Peak Luminance" 700.0 0.0 10000.0 10.0
|
#pragma parameter hcrt_max_nits " HDR: Display's Peak Luminance" 700.0 0.0 10000.0 10.0
|
||||||
#pragma parameter hcrt_paper_white_nits " HDR: Display's Paper White Luminance" 700.0 0.0 10000.0 10.0
|
#pragma parameter hcrt_paper_white_nits " HDR: Display's Paper White Luminance" 700.0 0.0 10000.0 10.0
|
||||||
#pragma parameter hcrt_expand_gamut " HDR: Original/Vivid" 0.0 0.0 1.0 1.0
|
#pragma parameter hcrt_expand_gamut " HDR: Original/Vivid" 0.0 0.0 1.0 1.0
|
||||||
@ -18,12 +23,13 @@
|
|||||||
#pragma parameter hcrt_developer_settings "CRT SETTINGS:" 0.0 0.0 0.0001 0.0001
|
#pragma parameter hcrt_developer_settings "CRT SETTINGS:" 0.0 0.0 0.0001 0.0001
|
||||||
#pragma parameter hcrt_crt_screen_type " Screen Type: APERTURE GRILLE | SHADOW MASK | SLOT MASK" 0.0 0.0 3.0 1.0
|
#pragma parameter hcrt_crt_screen_type " Screen Type: APERTURE GRILLE | SHADOW MASK | SLOT MASK" 0.0 0.0 3.0 1.0
|
||||||
#pragma parameter hcrt_crt_resolution " Resolution: 300TVL | 600TVL | 800TVL | 1000TVL" 1.0 0.0 3.0 1.0
|
#pragma parameter hcrt_crt_resolution " Resolution: 300TVL | 600TVL | 800TVL | 1000TVL" 1.0 0.0 3.0 1.0
|
||||||
#pragma parameter hcrt_colour_system " Colour System: PAL 6500K | NTSC-U 6500K | NTSC-J 9300K" 1.0 0.0 2.0 1.0
|
#pragma parameter hcrt_colour_system " Colour System: r709 | PAL | NTSC-U | NTSC-J" 2.0 0.0 3.0 1.0
|
||||||
#pragma parameter hcrt_white_temperature " White Temperature Offset (Kelvin)" 0.0 -5000.0 12000.0 100.0
|
#pragma parameter hcrt_white_temperature " White Temperature Offset (Kelvin)" 0.0 -5000.0 12000.0 100.0
|
||||||
#pragma parameter hcrt_brightness " Brightness" 0.0 -1.0 1.0 0.01
|
#pragma parameter hcrt_brightness " Brightness" 0.0 -1.0 1.0 0.01
|
||||||
#pragma parameter hcrt_contrast " Contrast" 0.0 -1.0 1.0 0.01
|
#pragma parameter hcrt_contrast " Contrast" 0.0 -1.0 1.0 0.01
|
||||||
#pragma parameter hcrt_saturation " Saturation" 0.0 -1.0 1.0 0.01
|
#pragma parameter hcrt_saturation " Saturation" 0.0 -1.0 1.0 0.01
|
||||||
#pragma parameter hcrt_gamma " Gamma" 0.0 -1.0 1.0 0.01
|
#pragma parameter hcrt_gamma_in " Gamma In" 0.0 -1.0 1.0 0.01
|
||||||
|
#pragma parameter hcrt_gamma_out " Gamma Out" 0.0 -0.4 0.4 0.005
|
||||||
#pragma parameter hcrt_pin_phase " Pin Phase" 0.00 -0.2 0.2 0.01
|
#pragma parameter hcrt_pin_phase " Pin Phase" 0.00 -0.2 0.2 0.01
|
||||||
#pragma parameter hcrt_pin_amp " Pin Amp" 0.00 -0.2 0.2 0.01
|
#pragma parameter hcrt_pin_amp " Pin Amp" 0.00 -0.2 0.2 0.01
|
||||||
#pragma parameter hcrt_space3 " " 0.0 0.0 0.0001 0.0001
|
#pragma parameter hcrt_space3 " " 0.0 0.0 0.0001 0.0001
|
||||||
|
Loading…
Reference in New Issue
Block a user