NewAPI/Blending

From Allegro Wiki

Jump to: navigation, search

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

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)

Personal tools