blending.glslf 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. #ifndef BLENDING_GLSLF
  2. #define BLENDING_GLSLF
  3. vec3 rgb_to_hsv(vec3 rgb)
  4. {
  5. vec4 k = vec4(_0_0, -_1_0 / 3.0, 2.0 / 3.0, -_1_0);
  6. vec4 p = mix(vec4(rgb.bg, k.wz), vec4(rgb.gb, k.xy), step(rgb.b, rgb.g));
  7. vec4 q = mix(vec4(p.xyw, rgb.r), vec4(rgb.r, p.yzx), step(p.x, rgb.r));
  8. float d = q.x - min(q.w, q.y);
  9. float e = 1.0e-10;
  10. return vec3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x);
  11. }
  12. vec3 hsv_to_rgb(vec3 hsv)
  13. {
  14. vec4 k = vec4(_1_0, 2.0 / 3.0, _1_0 / 3.0, 3.0);
  15. vec3 p = abs(fract(vec3(hsv.r, hsv.r, hsv.r) + k.xyz) * 6.0 - k.www);
  16. return hsv.b * mix(k.xxx, clamp(p - k.xxx, _0_0, _1_0), hsv.g);
  17. }
  18. vec3 col_blend(vec3 col1, vec3 col2, float fact)
  19. {
  20. return mix(col1, col2, fact);
  21. }
  22. vec3 col_add(vec3 col1, vec3 col2, float fact)
  23. {
  24. return fact * col1 + col2;
  25. }
  26. vec3 col_sub(vec3 col1, vec3 col2, float fact)
  27. {
  28. return col2 - fact * col1;
  29. }
  30. vec3 col_mul(vec3 col1, vec3 col2, float fact)
  31. {
  32. float facm = _1_0 - fact;
  33. return (vec3(facm) + fact * col1) * col2;
  34. }
  35. vec3 col_screen(vec3 col1, vec3 col2, float fact)
  36. {
  37. vec3 facm = vec3(_1_0 - fact);
  38. return vec3(_1_0) - (facm + fact * (vec3(_1_0) - col1)) * (vec3(_1_0) - col2);
  39. }
  40. vec3 col_overlay(vec3 col1, vec3 col2, float fact)
  41. {
  42. vec3 facm = vec3(_1_0 - fact);
  43. return mix(col2 * (facm + 2.0 * fact * col1),
  44. vec3(_1_0) - (facm + 2.0 * fact * (vec3(_1_0) - col1)) * (vec3(_1_0) - col2),
  45. step(0.5, col2));
  46. }
  47. vec3 col_diff(vec3 col1, vec3 col2, float fact)
  48. {
  49. return mix(col2, abs(col1 - col2), fact);
  50. }
  51. vec3 col_div(vec3 col1, vec3 col2, float fact)
  52. {
  53. return mix(col2, col2 / (col1 + step(col1, vec3(_0_0))), fact);
  54. }
  55. vec3 col_dark(vec3 col1, vec3 col2, float fact)
  56. {
  57. return mix(col2, min(col1, col2), fact);
  58. }
  59. vec3 col_light(vec3 col1, vec3 col2, float fact)
  60. {
  61. return max(fact * col1, col2);
  62. }
  63. vec3 col_hue(vec3 col1, vec3 col2, float fact)
  64. {
  65. vec3 c1 = rgb_to_hsv(col2);
  66. if (c1.y != _0_0) {
  67. vec3 c2 = rgb_to_hsv(col1);
  68. vec3 c3 = hsv_to_rgb(vec3(c1.x, c2.yz));
  69. return mix(col1, c3, fact);
  70. }
  71. return col1;
  72. }
  73. vec3 col_sat(vec3 col1, vec3 col2, float fact)
  74. {
  75. vec3 c1 = rgb_to_hsv(col1);
  76. if (c1.y != _0_0) {
  77. vec3 c2 = rgb_to_hsv(col2);
  78. return hsv_to_rgb(vec3(c1.x, mix(c1.y, c2.y, fact), c1.z));
  79. }
  80. return col1;
  81. }
  82. vec3 col_val(vec3 col1, vec3 col2, float fact)
  83. {
  84. vec3 c1 = rgb_to_hsv(col1);
  85. vec3 c2 = rgb_to_hsv(col2);
  86. return hsv_to_rgb(vec3(c1.xy, mix(c1.z, c2.z, fact)));
  87. }
  88. vec3 col_color(vec3 col1, vec3 col2, float fact)
  89. {
  90. vec3 c1 = rgb_to_hsv(col2);
  91. if (c1.y != _0_0) {
  92. vec3 c2 = rgb_to_hsv(col1);
  93. vec3 c3 = hsv_to_rgb(vec3(c1.xy, c2.z));
  94. return mix(col1, c3, fact);
  95. }
  96. return col1;
  97. }
  98. vec3 col_soft_light(vec3 col1, vec3 col2, float fact)
  99. {
  100. vec3 sc = vec3(_1_0) - (vec3(_1_0) - col2) * (vec3(_1_0) - col1);
  101. return mix(col1, ((vec3(_1_0) - col1) * col2 * col1) + col1 * sc, fact);
  102. }
  103. vec3 col_lin_light(vec3 col1, vec3 col2, float fact)
  104. {
  105. return col1 + fact * (2.0 * col2 - _1_0);
  106. }
  107. float val_mul(float val1, float val2, float fact, float facg)
  108. {
  109. float facm = _1_0 - facg;
  110. return (facm + fact * val1) * val2;
  111. }
  112. float val_screen(float val1, float val2, float fact, float facg)
  113. {
  114. float facm = _1_0 - facg;
  115. return _1_0 - (facm + fact * (_1_0 - val1)) * (_1_0 - val2);
  116. }
  117. float val_overlay(float val1, float val2, float fact, float facg)
  118. {
  119. float facm = _1_0 - facg;
  120. return mix(val2 * (facm + 2.0 * fact * val1),
  121. _1_0 - (facm + 2.0 * fact * (_1_0 - val1)) * (_1_0 - val2),
  122. step(0.5, val2));
  123. }
  124. #endif