oklab.glsl 1004 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. /////////////////////////////////////////////////////////////////////////
  2. //
  3. // OKLab stuff, mostly based off https://www.shadertoy.com/view/ttcyRS
  4. //
  5. /////////////////////////////////////////////////////////////////////////
  6. const mat3 kLMStoCONE = mat3(
  7. 4.0767245293, -1.2681437731, -0.0041119885,
  8. -3.3072168827, 2.6093323231, -0.7034763098,
  9. 0.2307590544, -0.3411344290, 1.7068625689);
  10. const mat3 kCONEtoLMS = mat3(
  11. 0.4121656120, 0.2118591070, 0.0883097947,
  12. 0.5362752080, 0.6807189584, 0.2818474174,
  13. 0.0514575653, 0.1074065790, 0.6302613616);
  14. vec3 rgbToOklab(vec3 c) {
  15. vec3 lms = kCONEtoLMS * c;
  16. return sign(lms)*pow(abs(lms), vec3(0.3333333333333));
  17. }
  18. vec3 oklabToRGB(vec3 c) {
  19. vec3 lms = c;
  20. return kLMStoCONE * (lms * lms * lms);
  21. }
  22. #ifndef USE_OKLAB
  23. #define col3 vec3
  24. #else
  25. vec3 col3(float r, float g, float b) {
  26. return rgbToOklab(vec3(r, g, b));
  27. }
  28. vec3 col3(vec3 v) {
  29. return rgbToOklab(v);
  30. }
  31. vec3 col3(float v) {
  32. return rgbToOklab(vec3(v));
  33. }
  34. #endif