@@ -448,6 +448,58 @@ vec3 linearToGamma(vec3 color) {
448448 return mix (1.055 * pow (color, vec3 (1 . / 2.4 )) - .055 , color * 12.92 , lessThanEqual (color, vec3 (.0031308 )));
449449}
450450
451+ vec3 pqToLinear(vec3 color) {
452+ float c1 = .835975 ;
453+ float c2 = 18.8515625 ;
454+ float c3 = 18.6875 ;
455+ float m1 = .1593017578125 ;
456+ float m2 = 78.84375 ;
457+ vec3 em2 = pow (color, vec3 (1 . / m2));
458+ return pow (max (em2 - c1, 0 .) / (c2 - c3 * em2), vec3 (1 . / m1));
459+ }
460+
461+ vec3 linearToPQ(vec3 color) {
462+ float c1 = .835975 ;
463+ float c2 = 18.8515625 ;
464+ float c3 = 18.6875 ;
465+ float m1 = .1593017578125 ;
466+ float m2 = 78.84375 ;
467+ vec3 ym1 = pow (color, vec3 (m1));
468+ return pow ((c1 + c2 * ym1) / (1 . + c3 * ym1), vec3 (m2));
469+ }
470+
471+ vec3 sRGBToRec2020(vec3 color) {
472+ mat3 xyz_from_srgb = transpose (mat3 (
473+ vec3 (0.4123908 , 0.3575843 , 0.1804808 ),
474+ vec3 (0.2126390 , 0.7151687 , 0.0721923 ),
475+ vec3 (0.0193308 , 0.1191948 , 0.9505322 )
476+ ));
477+
478+ mat3 rec2020_from_xyz = transpose (mat3 (
479+ vec3 ( 1.7166512 , - 0.3556708 , - 0.2533663 ),
480+ vec3 (- 0.6666844 , 1.6164812 , 0.0157685 ),
481+ vec3 ( 0.0176399 , - 0.0427706 , 0.9421031 )
482+ ));
483+
484+ return rec2020_from_xyz * xyz_from_srgb * color;
485+ }
486+
487+ vec3 rec2020ToSRGB(vec3 color) {
488+ mat3 xyz_from_rec2020 = transpose (mat3 (
489+ vec3 (0.6369580 , 0.1446169 , 0.1688810 ),
490+ vec3 (0.2627002 , 0.6779981 , 0.0593017 ),
491+ vec3 (0.0000000 , 0.0280727 , 1.0609851 )
492+ ));
493+
494+ mat3 srgb_from_xyz = transpose (mat3 (
495+ vec3 ( 3.2409699 , - 1.5373832 , - 0.4986108 ),
496+ vec3 (- 0.9692436 , 1.8759675 , 0.0415551 ),
497+ vec3 ( 0.0556301 , - 0.2039770 , 1.0569715 )
498+ ));
499+
500+ return srgb_from_xyz * xyz_from_rec2020 * color;
501+ }
502+
451503uint packSnorm10x3(vec4 v) {
452504 return
453505 ((int (v.x * 511 .) & 0x3ff) << 0 ) |
0 commit comments