Bumpmapping

By Mikael Kalms (Scout / C-Lous)

Bump is essentially having individual XY-offsets in the envmap/phongmap for every pixel.

2d Bump
The simplest form requires one phongmap and one bumpmap. The phongmap is your usual phongtexture, and the bumpmap contains one word per pixel. The bumped 2D phong is drawn using this technique:

for Y = 0 to scrheight
{
for X = 0 to scrwidth
{
PhongX = X + Bump[X][Y][0]
PhongY = Y + Bump[X][Y][1]
C = Phong[PhongX][PhongY]
putpixel(X,Y,C)
}
}

An example of this kind of bump can be found in Orange's "The Sea Robot of Love" (PC, 64k at The Party V). Bump with picture can be seen in 3LE's "The Tribe" (first place at Icing '96). Picture/bump is accomplished by adding a pixelread and a shade table lookup to the innerloop.

Bump is a good addition to standard zoomrotators: have a look at C-Lous' "Kolor Remix" (Remedy '96) for an example of it.

3d Bump
(err... rather "2D polygon bump")

Don't settle with phong bump, go for the real thing! That is, phong bump texture... It does not take much more CPU time.

As the bump and the texture both are fixed on the surface of the 3D-obejct(s), they have the same UV coordinates, thus giving only a few more instructions for adding bump. This is a (slow) example of an inner loop:

; a0 = texture, a1 = phong, a2 = bump, a3 = shadetab, a4 = screen
.pixel add.w tustep,d0
add.w tvstep,d1
add.w pustep,d2
add.w pvstep,d3
move.w pustep,d5
; Get UV offs in phong
lsr.w #8,d5
move.w pvstep,d4
move.b d5,d4
move.w tustep,d6
; Get UV offs in texture & bump
lsr.w #8,d6
move.w tvstep,d5
move.b d6,d5
add.w (a2,d5.w*2),d4
; Add the bump offs for current pixel
move.b (a1,d4.l),d4
; Get phong
lsl.w #8,d4
move.b (a0,d5.l),d4
; Get texture
move.b (a3,d4.l),(a4)+
; Write shaded pixel to screen
dbf d7,.pixel

The bump effect adds quite a bit of realism to normal phong texture.

Generating the bumpmap
It is tricky to get a good-looking bumpmap. One way (useful for 2D bump) is saying that the brighter a pixel is, the higher above the flat surface it is.
First convert the picture to grayscale using some program like PicCon. Then the bump value can be calculated in this way:

bump[X][Y][0] = (texture[X-1][Y] - texture[X+1][Y]) * scale
bump[X][Y][1] = (texture[X][Y-1] - texture[X][Y+1]) * scale

Appropriate values for scale varies from texture to texture.