color_util.glslf 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. #ifndef COLOR_UTIL_GLSLF
  2. #define COLOR_UTIL_GLSLF
  3. #define PREMULTIPLY_ALPHA 1
  4. #var SRGB SRGB_NONE
  5. #include <std.glsl>
  6. void srgb_to_lin(inout float color)
  7. {
  8. #if SRGB == SRGB_SIMPLE
  9. color = pow(color, 2.2);
  10. #elif SRGB == SRGB_PROPER
  11. if (color <= 0.04045)
  12. color = color / 12.92;
  13. else
  14. color = pow(color + 0.055/1.055, 2.4);
  15. #endif
  16. }
  17. void lin_to_srgb(inout float color)
  18. {
  19. #if SRGB == SRGB_SIMPLE
  20. color = pow(color, 2.2);
  21. #elif SRGB == SRGB_PROPER
  22. if (color <= 0.00031308)
  23. color = color * 12.92;
  24. else
  25. color = 1.055*pow(color, 1.0 / 2.4) - 0.055;
  26. #endif
  27. }
  28. void srgb_to_lin(inout vec3 color)
  29. {
  30. #if SRGB == SRGB_SIMPLE
  31. color = pow(color, vec3(2.2));
  32. #elif SRGB == SRGB_PROPER
  33. srgb_to_lin(color.r);
  34. srgb_to_lin(color.g);
  35. srgb_to_lin(color.b);
  36. #endif
  37. }
  38. void lin_to_srgb(inout vec3 color)
  39. {
  40. #if SRGB == SRGB_SIMPLE
  41. color = pow(color, vec3(1.0 / 2.2));
  42. #elif SRGB == SRGB_PROPER
  43. lin_to_srgb(color.r);
  44. lin_to_srgb(color.g);
  45. lin_to_srgb(color.b);
  46. #endif
  47. }
  48. void premultiply_alpha(inout vec3 color, in float alpha)
  49. {
  50. #if PREMULTIPLY_ALPHA
  51. color = color * alpha;
  52. #endif
  53. }
  54. float luma(vec4 color) {
  55. vec3 luma_coeff = vec3(0.299, 0.587, 0.114);
  56. float l = dot(color.rgb, luma_coeff);
  57. return l;
  58. }
  59. #endif