2
0

blending.fs 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. #version 120
  2. /* Photoshop based blending modes */
  3. /* Prototypes */
  4. vec4 darken(vec4 a, vec4 b);
  5. vec4 multiply(vec4 a, vec4 b);
  6. vec4 color_burn(vec4 a, vec4 b);
  7. vec4 linear_burn(vec4 a, vec4 b);
  8. vec4 lighten(vec4 a, vec4 b);
  9. vec4 screen(vec4 a, vec4 b);
  10. vec4 color_dodge(vec4 a, vec4 b);
  11. vec4 linear_dodge(vec4 a, vec4 b);
  12. vec4 overlay(vec4 a, vec4 b);
  13. vec4 soft_light(vec4 a, vec4 b);
  14. vec4 hard_light(vec4 a, vec4 b);
  15. vec4 vivid_light(vec4 a, vec4 b);
  16. vec4 linear_light(vec4 a, vec4 b);
  17. vec4 pin_light(vec4 a, vec4 b);
  18. vec4 difference(vec4 a, vec4 b);
  19. vec4 exclusion(vec4 a, vec4 b);
  20. /* End */
  21. vec4 darken(vec4 a, vec4 b) {
  22. return min(a, b);
  23. }
  24. vec4 multiply(vec4 a, vec4 b) {
  25. return a * b;
  26. }
  27. vec4 color_burn(vec4 a, vec4 b) {
  28. return 1.0 - (1.0-a) / b;
  29. }
  30. vec4 linear_burn(vec4 a, vec4 b) {
  31. return a + b - 1.0;
  32. }
  33. vec4 lighten(vec4 a, vec4 b) {
  34. return max(a,b);
  35. }
  36. vec4 screen(vec4 a, vec4 b) {
  37. return 1.0 - (1.0-a) * (1.0-b);
  38. }
  39. vec4 color_dodge(vec4 a, vec4 b) {
  40. return a / (1.0-b);
  41. }
  42. vec4 linear_dodge(vec4 a, vec4 b) {
  43. return a + b;
  44. }
  45. vec4 overlay(vec4 a, vec4 b) {
  46. vec4 res;
  47. if ( length(a.rgb) > 0.5 ) { res = 1.0 - (1.0 - 2.0 * (a-0.5)) * (1.0-b); }
  48. if ( length(a.rgb) <= 0.5) { res = a * (b + 0.5); }
  49. return res;
  50. }
  51. vec4 soft_light(vec4 a, vec4 b) {
  52. vec4 res;
  53. if ( length(a.rgb) > 0.5 ) { res = 1.0 - (1.0 - a) * (1.0 - (b - 0.5)); }
  54. if ( length(a.rgb) <= 0.5) { res = a * (b + 0.5); }
  55. return res;
  56. }
  57. vec4 hard_light(vec4 a, vec4 b) {
  58. vec4 res;
  59. if ( length(a.rgb) > 0.5 ) { res = 1.0 - (1.0 - a) * (1.0 - 2.0 * (b - 0.5)); }
  60. if ( length(a.rgb) <= 0.5) { res = a * (2.0 * b); }
  61. return res;
  62. }
  63. vec4 vivid_light(vec4 a, vec4 b) {
  64. vec4 res;
  65. if ( length(a.rgb) > 0.5 ) { res = 1.0 - (1.0 - a) / (2.0 * (b - 0.5)); }
  66. if ( length(a.rgb) <= 0.5) { res = a / (1.0 - 2.0 * b); }
  67. return res;
  68. }
  69. vec4 linear_light(vec4 a, vec4 b) {
  70. vec4 res;
  71. if ( length(a.rgb) > 0.5 ) { res = a + (2.0 * (b - 0.5)); }
  72. if ( length(a.rgb) <= 0.5) { res = a + 2.0 * b - 1.0; }
  73. return res;
  74. }
  75. vec4 pin_light(vec4 a, vec4 b) {
  76. vec4 res;
  77. if ( length(a.rgb) > 0.5 ) { res = max(a , 2.0 * (b - 0.5)); }
  78. if ( length(a.rgb) <= 0.5) { res = min(a , 2.0 * b); }
  79. return res;
  80. }
  81. vec4 difference(vec4 a, vec4 b) {
  82. return abs(a-b);
  83. }
  84. vec4 exclusion(vec4 a, vec4 b) {
  85. return 0.5 - 2.0 * (a - 0.5) * (b - 0.5);
  86. }