Loading...
Searching...
No Matches
ColorSpaceOut.hpp File Reference

GPU shader generation for RGB->YUV color space conversion (output/encoding). More...

Detailed Description

GPU shader generation for RGB->YUV color space conversion (output/encoding).

This is the inverse of ColorSpace.hpp (which handles YUV->RGB for decoding). It generates GLSL shader strings that define a vec3 convert_from_rgb(vec3 rgb) function, which converts from the internal rendering colorspace (sRGB RGBA) to the target output YUV colorspace.

Matrices are baked into the shader at compile time as const mat4 values, following the same pattern as the decoder's convert_to_rgb().

The 4th row of each mat4 encodes the YUV offset (e.g., 0.0/0.5/0.5 for full range, 16/128/128 scaled for limited range).

Usage: QString shader = colorMatrixOut(AVCOL_SPC_BT709, AVCOL_TRC_BT709, AVCOL_RANGE_JPEG, AVCOL_PRI_BT709); // shader defines: vec3 convert_from_rgb(vec3 rgb) { ... } // Insert into fragment shader via QString::arg()

Go to the source code of this file.

Namespaces

namespace  score
 Base toolkit upon which the software is built.
 
namespace  score::gfx
 Graphics rendering pipeline for ossia score.
 

Macros

#define SCORE_GFX_RGB_TO_BT601_FULL_MATRIX    "mat4(\n\ 0.299, -0.168736, 0.5, 0.0,\n\ 0.587, -0.331264, -0.418688, 0.0,\n\ 0.114, 0.5, -0.081312, 0.0,\n\ 0.0, 0.5, 0.5, 1.0)\n"
 Color matrices.
 
#define SCORE_GFX_RGB_TO_BT601_LIMITED_MATRIX    "mat4(\n\ 0.256788, -0.148223, 0.439216, 0.0,\n\ 0.504129, -0.290993, -0.367788, 0.0,\n\ 0.097906, 0.439216, -0.071427, 0.0,\n\ 0.062745, 0.501961, 0.501961, 1.0)\n"
 
#define SCORE_GFX_RGB_TO_BT709_FULL_MATRIX    "mat4(\n\ 0.2126, -0.114572, 0.5, 0.0,\n\ 0.7152, -0.385428, -0.454153, 0.0,\n\ 0.0722, 0.5, -0.045847, 0.0,\n\ 0.0, 0.5, 0.5, 1.0)\n"
 
#define SCORE_GFX_RGB_TO_BT709_LIMITED_MATRIX    "mat4(\n\ 0.182586, -0.100644, 0.439216, 0.0,\n\ 0.614231, -0.338572, -0.398942, 0.0,\n\ 0.062007, 0.439216, -0.040274, 0.0,\n\ 0.062745, 0.501961, 0.501961, 1.0)\n"
 
#define SCORE_GFX_RGB_TO_BT2020_FULL_MATRIX    "mat4(\n\ 0.2627, -0.139630, 0.5, 0.0,\n\ 0.6780, -0.360370, -0.459786, 0.0,\n\ 0.0593, 0.5, -0.040214, 0.0,\n\ 0.0, 0.5, 0.5, 1.0)\n"
 
#define SCORE_GFX_RGB_TO_BT2020_LIMITED_MATRIX    "mat4(\n\ 0.225613, -0.122655, 0.439216, 0.0,\n\ 0.582282, -0.316560, -0.403890, 0.0,\n\ 0.050928, 0.439216, -0.035326, 0.0,\n\ 0.062745, 0.501961, 0.501961, 1.0)\n"
 
#define SCORE_GFX_RGB_TO_SMPTE240M_FULL_MATRIX    "mat4(\n\ 0.2122, -0.115765, 0.5, 0.0,\n\ 0.7013, -0.382235, -0.445418, 0.0,\n\ 0.0865, 0.5, -0.054582, 0.0,\n\ 0.0, 0.5, 0.5, 1.0)\n"
 
#define SCORE_GFX_CONVERT_FROM_RGB_TO_BT601_FULL
 
#define SCORE_GFX_CONVERT_FROM_RGB_TO_BT601_LIMITED
 
#define SCORE_GFX_CONVERT_FROM_RGB_TO_BT709_FULL
 
#define SCORE_GFX_CONVERT_FROM_RGB_TO_BT709_LIMITED
 
#define SCORE_GFX_CONVERT_FROM_RGB_TO_BT2020_FULL
 
#define SCORE_GFX_CONVERT_FROM_RGB_TO_BT2020_LIMITED
 
#define SCORE_GFX_PQ_EOTF   R"_(vec3 pqEotf(vec3 pq) { const float m1 = 0.1593017578125; const float m2 = 78.84375; const float c1 = 0.8359375; const float c2 = 18.8515625; const float c3 = 18.6875; vec3 Nm2 = pow(pq, vec3(1.0 / m2)); return pow(max(Nm2 - c1, 0.0) / (c2 - c3 * Nm2), vec3(1.0 / m1));})_"
 inverse OETF / EOTF for output:
 
#define SCORE_GFX_HLG_EOTF   R"_(vec3 hlgEotf(vec3 hlg) { const float a = 0.17883277; const float b = 0.28466892; const float c = 0.55991073; vec3 lo = hlg * hlg / 3.0; vec3 hi = (exp((hlg - c) / a) + b) / 12.0; return mix(lo, hi, step(vec3(0.5), hlg));})_"
 
#define SCORE_GFX_INVERSE_SRGB_OETF   R"_(vec3 inverseSrgbOetf(vec3 c) { vec3 lo = c / 12.92; vec3 hi = pow((c + 0.055) / 1.055, vec3(2.4)); return mix(lo, hi, step(vec3(0.04045), c));})_"
 
#define SCORE_GFX_PQ_OETF   R"_(vec3 pqOetf(vec3 linearRgb) { const float m1 = 0.1593017578125; const float m2 = 78.84375; const float c1 = 0.8359375; const float c2 = 18.8515625; const float c3 = 18.6875; vec3 Ym1 = pow(linearRgb, vec3(m1)); return pow((c1 + c2 * Ym1) / (1.0 + c3 * Ym1), vec3(m2));})_"
 
#define SCORE_GFX_HLG_OETF   R"_(vec3 hlgOetf(vec3 linearRgb) { const float a = 0.17883277; const float b = 0.28466892; // 1.0 - 4.0 * a const float c = 0.55991073; // 0.5 - a * ln(4.0 * a) vec3 lo = sqrt(3.0 * linearRgb); vec3 hi = a * log(12.0 * linearRgb - b) + c; return mix(lo, hi, step(vec3(1.0 / 12.0), linearRgb));})_"
 
#define SCORE_GFX_BT709_OETF   R"_(vec3 bt709Oetf(vec3 linearRgb) { vec3 lo = 4.5 * linearRgb; vec3 hi = 1.099 * pow(linearRgb, vec3(0.45)) - 0.099; return mix(lo, hi, step(vec3(0.018), linearRgb));})_"
 
#define SCORE_GFX_SRGB_OETF_OUT   R"_(vec3 srgbOetfOut(vec3 linearRgb) { vec3 lo = 12.92 * linearRgb; vec3 hi = 1.055 * pow(linearRgb, vec3(1.0 / 2.4)) - 0.055; return mix(lo, hi, step(vec3(0.0031308), linearRgb));})_"
 
#define SCORE_GFX_BT709_TO_BT2020_GAMUT   R"_(const mat3 gamutConvertOut = mat3( 0.6274, 0.0691, 0.0164, 0.3293, 0.9195, 0.0880, 0.0433, 0.0114, 0.8956);)_"
 Gamut conversion.
 
#define SCORE_GFX_BT709_TO_P3_GAMUT   R"_(const mat3 gamutConvertOut = mat3( 0.8225, 0.0332, 0.0171, 0.1774, 0.9669, 0.0724, 0.0001, -0.0001, 0.9106);)_"
 

Macro Definition Documentation

◆ SCORE_GFX_CONVERT_FROM_RGB_TO_BT2020_FULL

#define SCORE_GFX_CONVERT_FROM_RGB_TO_BT2020_FULL
Value:
"const mat4 encode_matrix = " SCORE_GFX_RGB_TO_BT2020_FULL_MATRIX ";\n" \
"vec3 convert_from_rgb(vec3 rgb) { return (encode_matrix * vec4(rgb, 1.0)).xyz; }\n"

◆ SCORE_GFX_CONVERT_FROM_RGB_TO_BT2020_LIMITED

#define SCORE_GFX_CONVERT_FROM_RGB_TO_BT2020_LIMITED
Value:
"const mat4 encode_matrix = " SCORE_GFX_RGB_TO_BT2020_LIMITED_MATRIX ";\n"\
"vec3 convert_from_rgb(vec3 rgb) { return (encode_matrix * vec4(rgb, 1.0)).xyz; }\n"

◆ SCORE_GFX_CONVERT_FROM_RGB_TO_BT601_FULL

#define SCORE_GFX_CONVERT_FROM_RGB_TO_BT601_FULL
Value:
"const mat4 encode_matrix = " SCORE_GFX_RGB_TO_BT601_FULL_MATRIX ";\n" \
"vec3 convert_from_rgb(vec3 rgb) { return (encode_matrix * vec4(rgb, 1.0)).xyz; }\n"
#define SCORE_GFX_RGB_TO_BT601_FULL_MATRIX
Color matrices.
Definition ColorSpaceOut.hpp:54

◆ SCORE_GFX_CONVERT_FROM_RGB_TO_BT601_LIMITED

#define SCORE_GFX_CONVERT_FROM_RGB_TO_BT601_LIMITED
Value:
"const mat4 encode_matrix = " SCORE_GFX_RGB_TO_BT601_LIMITED_MATRIX ";\n"\
"vec3 convert_from_rgb(vec3 rgb) { return (encode_matrix * vec4(rgb, 1.0)).xyz; }\n"

◆ SCORE_GFX_CONVERT_FROM_RGB_TO_BT709_FULL

#define SCORE_GFX_CONVERT_FROM_RGB_TO_BT709_FULL
Value:
"const mat4 encode_matrix = " SCORE_GFX_RGB_TO_BT709_FULL_MATRIX ";\n" \
"vec3 convert_from_rgb(vec3 rgb) { return (encode_matrix * vec4(rgb, 1.0)).xyz; }\n"

◆ SCORE_GFX_CONVERT_FROM_RGB_TO_BT709_LIMITED

#define SCORE_GFX_CONVERT_FROM_RGB_TO_BT709_LIMITED
Value:
"const mat4 encode_matrix = " SCORE_GFX_RGB_TO_BT709_LIMITED_MATRIX ";\n"\
"vec3 convert_from_rgb(vec3 rgb) { return (encode_matrix * vec4(rgb, 1.0)).xyz; }\n"