NewAPI/Blending
From Allegro Wiki
< NewAPI
Below is just the original proposal, the current implementation which may include several modifications since then can be seen here: http://www.liballeg.org/naturaldocs/files/src/tls-c.html#al_set_blender
Contents |
Blending
- D3D reference: http://msdn2.microsoft.com/en-us/library/bb172508.aspx
- OpenGL reference: http://pyopengl.sourceforge.net/documentation/manual/glBlendFunc.3G.html
al_draw_bitmap performs this operation by default:
target.r = target.r * (1 - source.a) + source.r * source.a target.g = target.g * (1 - source.a) + source.g * source.a target.b = target.b * (1 - source.a) + source.b * source.a target.a = target.a * (1 - source.a) + source.a * source.a
In OpenGL, it would be, assuming a textured quad is drawn:
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA) glColor4f(1, 1, 1, 1)
ALLEGRO_TINT
target.r = target.r * (1 - source.a) + source.r * blend.r * source.a target.g = target.g * (1 - source.a) + source.g * blend.g * source.a target.b = target.b * (1 - source.a) + source.b * blend.b * source.a target.a = target.a * (1 - source.a) + source.a * blend.a * source.a
OpenGL:
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA) glColor4f(blend.r, blend.g, blend.b, blend.a)
D3D:
IDirect3DDevice9 *dev; dev->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA); dev->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA); /* Use blend color as vertex color */
replaced by al_set_blender(ALLEGRO_ALPHA, ALLEGRO_INVERSE_ALPHA, blend_color)
ALLEGRO_ADD
target.r = clamp(target.r + source.r * source.a) target.g = clamp(target.g + source.g * source.a) target.b = clamp(target.b + source.b * source.a) target.a = clamp(target.a + source.a * source.a)
OpenGL:
glBlendFunc(GL_SRC_ALPHA, GL_ONE) glColor4f(1, 1, 1, 1)
D3D:
dev->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA); dev->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_ONE); /* Use 1, 1, 1, 1 vertex color */
replaced by al_set_blender(ALLEGRO_ALPHA, ALLEGRO_ONE, NULL)
ALLEGRO_COPY_ALPHA
target.r = source.r target.g = source.g target.b = source.b target.a = source.a
OpenGL:
glBlendFunc(GL_ONE, GL_ZERO) glColor4f(1, 1, 1, 1)
D3D:
dev->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_ONE); dev->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_ZERO); /* Use 1, 1, 1, 1 as vertex color */
replaced by al_set_blender(ALLEGRO_ONE, ALLEGRO_ZERO, NULL)
