NAME¶
exlights - One way to do colored lighting effects in a hicolor video mode.
Allegro game programming library.
SYNOPSIS¶
#include <allegro.h>
Example exlights
DESCRIPTION¶
This program shows one way to implement colored lighting effects in a hicolor
video mode. Warning: it is not for the faint of heart! This is by no means the
simplest or easiest to understand method, I just thought it was a cool concept
that would be worth demonstrating.
The basic approach is to select a 15 or 16 bit screen mode, but then draw onto
24 bit memory bitmaps. Since we only need the bottom 5 bits of each 8 bit
color in order to store 15 bit data within a 24 bit location, we can fit a
light level into the top 3 bits. The tricky bit is that these aren't actually
24 bit images at all: they are implemented as 8 bit memory bitmaps, and we
just store the red level in one pixel, green in the next, and blue in the
next, making the total image be three times wider than we really wanted. This
allows us to use all the normal 256 color graphics routines for drawing onto
our memory surfaces, most importantly the lookup table translucency, which can
be used to combine the low 5 bits of color and the top 3 bits of light in a
single drawing operation. Some trickery is needed to load 24 bit data into
this fake 8 bit format, and of course it needs a custom routine to convert the
resulting image while copying it across to the hardware screen.
This program chugs slightly on my p133, but not significantly worse than any
double buffering in what amounts to a 1920x640, 256 color resolution. The
light blending doesn't seem to slow it down too badly, so I think this
technique would be quite usable on faster machines and in lower resolution
hicolor modes. The biggest problem is that although you keep the full 15 bit
color resolution, you only get 3 bits of light, ie. 8 light levels. You can do
some nice colored light patches, but smooth gradients aren't going to work too
well :-)
SEE ALSO¶
BITMAP(3alleg4),
COLOR_MAP(3alleg4),
END_OF_MAIN(3alleg4),
PALETTE(3alleg4),
SCREEN_H(3alleg4),
SCREEN_W(3alleg4),
allegro_error(3alleg4),
allegro_init(3alleg4),
allegro_message(3alleg4),
bitmap_color_depth(3alleg4),
blit(3alleg4),
bmp_unwrite_line(3alleg4),
bmp_write_line(3alleg4),
circlefill(3alleg4),
clear_bitmap(3alleg4),
clear_keybuf(3alleg4),
color_map(3alleg4),
create_bitmap_ex(3alleg4),
destroy_bitmap(3alleg4),
draw_trans_sprite(3alleg4),
fixatan2(3alleg4),
fixsqrt(3alleg4),
fixtoi(3alleg4),
getb_depth(3alleg4),
getg_depth(3alleg4),
getpixel(3alleg4),
getr_depth(3alleg4),
hsv_to_rgb(3alleg4),
install_keyboard(3alleg4),
install_mouse(3alleg4),
install_timer(3alleg4),
itofix(3alleg4),
key(3alleg4),
keypressed(3alleg4),
line(3alleg4),
load_bitmap(3alleg4),
makecol(3alleg4),
mouse_x(3alleg4),
mouse_y(3alleg4),
poll_mouse(3alleg4),
replace_filename(3alleg4),
retrace_count(3alleg4),
screen(3alleg4),
select_palette(3alleg4),
set_color_conversion(3alleg4),
set_color_depth(3alleg4),
set_gfx_mode(3alleg4)