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()
|
|
#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);)_" |
| |