Difference between revisions of "BlendMode Formulas"

(Init page)
 
m (Prettier titles)
Line 5: Line 5:
 
Here's a list where the numbers are in the interval [0,1]; dst is the existing color in the buffer; src is the global color, texture color, or both of them mixed together (depending on the color mode); and res is the resulting color.
 
Here's a list where the numbers are in the interval [0,1]; dst is the existing color in the buffer; src is the global color, texture color, or both of them mixed together (depending on the color mode); and res is the resulting color.
  
additive:
+
== additive ==
  
 
     res.r = dst.r + (src.r * src.a)
 
     res.r = dst.r + (src.r * src.a)
Line 12: Line 12:
 
     res.a = dst.a + (src.a * src.a)
 
     res.a = dst.a + (src.a * src.a)
  
 
+
== alpha ==
 
 
alpha:
 
  
 
     res.r = dst.r * (1 - src.a) + src.r * src.a
 
     res.r = dst.r * (1 - src.a) + src.r * src.a
Line 20: Line 18:
 
     res.b = dst.b * (1 - src.a) + src.b * src.a
 
     res.b = dst.b * (1 - src.a) + src.b * src.a
 
     res.a = dst.a * (1 - src.a) + src.a * src.a
 
     res.a = dst.a * (1 - src.a) + src.a * src.a
 
  
 
0.9.0 changes it to this:
 
0.9.0 changes it to this:
Line 29: Line 26:
 
     res.a = dst.a * (1 - src.a) + src.a
 
     res.a = dst.a * (1 - src.a) + src.a
  
 
+
== subtractive ==
 
 
subtractive:
 
  
 
     res.r = dst.r - src.r * src.a
 
     res.r = dst.r - src.r * src.a
Line 38: Line 33:
 
     res.a = dst.a - src.a * src.a
 
     res.a = dst.a - src.a * src.a
  
 
+
== multiplicative (up to and including 0.8.0) ==
 
 
multiplicative (up to and including 0.8.0):
 
  
 
     res.r = dst.r * (1 - src.a) + src.r * dst.r
 
     res.r = dst.r * (1 - src.a) + src.r * dst.r
Line 46: Line 39:
 
     res.b = dst.b * (1 - src.a) + src.b * dst.b
 
     res.b = dst.b * (1 - src.a) + src.b * dst.b
 
     res.a = dst.a * (1 - src.a) + src.a * dst.a
 
     res.a = dst.a * (1 - src.a) + src.a * dst.a
 
  
 
0.9.0 changes it to this:
 
0.9.0 changes it to this:
Line 55: Line 47:
 
     res.a = src.a * dst.a
 
     res.a = src.a * dst.a
  
 +
== premultiplied ==
  
 
premultiplied:
 
 
Code: Select all
 
 
     res.r = dst.r * (1 - src.a) + src.r
 
     res.r = dst.r * (1 - src.a) + src.r
 
     res.g = dst.g * (1 - src.a) + src.g
 
     res.g = dst.g * (1 - src.a) + src.g
Line 65: Line 54:
 
     res.a = dst.a * (1 - src.a) + src.a
 
     res.a = dst.a * (1 - src.a) + src.a
  
 
+
== Notes ==
 
 
 
OpenGL clamps to [0,1] (by default) in case you're wondering if subtractive could have had negative values.
 
OpenGL clamps to [0,1] (by default) in case you're wondering if subtractive could have had negative values.

Revision as of 17:23, 4 June 2013

Copied from: Forum Post

LÖVE currently uses OpenGL and exposes some of the blend equations and functions of it.

Here's a list where the numbers are in the interval [0,1]; dst is the existing color in the buffer; src is the global color, texture color, or both of them mixed together (depending on the color mode); and res is the resulting color.

additive

   res.r = dst.r + (src.r * src.a)
   res.g = dst.g + (src.g * src.a)
   res.b = dst.b + (src.b * src.a)
   res.a = dst.a + (src.a * src.a)

alpha

   res.r = dst.r * (1 - src.a) + src.r * src.a
   res.g = dst.g * (1 - src.a) + src.g * src.a
   res.b = dst.b * (1 - src.a) + src.b * src.a
   res.a = dst.a * (1 - src.a) + src.a * src.a

0.9.0 changes it to this:

   res.r = dst.r * (1 - src.a) + src.r * src.a
   res.g = dst.g * (1 - src.a) + src.g * src.a
   res.b = dst.b * (1 - src.a) + src.b * src.a
   res.a = dst.a * (1 - src.a) + src.a

subtractive

   res.r = dst.r - src.r * src.a
   res.g = dst.g - src.g * src.a
   res.b = dst.b - src.b * src.a
   res.a = dst.a - src.a * src.a

multiplicative (up to and including 0.8.0)

   res.r = dst.r * (1 - src.a) + src.r * dst.r
   res.g = dst.g * (1 - src.a) + src.g * dst.g
   res.b = dst.b * (1 - src.a) + src.b * dst.b
   res.a = dst.a * (1 - src.a) + src.a * dst.a

0.9.0 changes it to this:

   res.r = src.r * dst.r
   res.g = src.g * dst.g
   res.b = src.b * dst.b
   res.a = src.a * dst.a

premultiplied

   res.r = dst.r * (1 - src.a) + src.r
   res.g = dst.g * (1 - src.a) + src.g
   res.b = dst.b * (1 - src.a) + src.b
   res.a = dst.a * (1 - src.a) + src.a

Notes

OpenGL clamps to [0,1] (by default) in case you're wondering if subtractive could have had negative values.