*Tutorial on 2d-bumpmapping*
2d-bumpmapping is one of the simplest and at least I think
it looks very nice. In this tutorial you will learn to make
a simple bumpmapper for your demo,game or whatever. I will
write the code in pascal, but it shouldn't be too hard to
translate it to C++ or so.
What is bumpmapping?
For those of you nerds who doesn't know what bumpmapping is
I can tell you it's a cool effect that make the surface of
something look bumpy. Look at the example file.
The first thing we have to have is a environmentmap. That
is the lightsource it self. It looks pretty much like a
phong light, if you have seen one. The environmentmap
is a 256*256 array or bytes.
environmentmap=Array[0..255,0..255]of byte;
Now if you use TP 7.0 like me, you have to be a litte sad.
Cause TP can't handle arrays that big. It's one byte too big.
So this is the one I use:
environmentmap=Array[0..255,0..254]of byte;
Procedure CreateEnvironmentMap;
var i,j:integer; nX,nY,nZ:real; (float)
begin
for i := 0 to 255 do
for j := 0 to 254 do begin
nX:=(i-128)/128;
nY:=(j-128)/128;
nZ:=1-sqrt(nX*nX+nY*nY); (*get the unit vector*)
if nz<0 then nZ:=0;
environmentmap[i,j]:=Round(nZ*256);
end;
end;
Now, that was very difficult, was it. It won't get any harder either.
You will have to have some kind of array that is the surface to be
bumpmapped. I use a virtual screen for mine. Dark color in the
surface are high and bright colors are low.
Then, for every pixel you draw you check the pixels closest neighbours.
nx:=bumpmap[x-1,y]-bumpmap[x+1,y];
ny:=bumpmap[x,y-1]-bumpmap[x,y+1];
Then the distance from the pixel to the centre of the light
lx:=x-lightx; (*Where lightx and lighty is the position of the*)
ly:=y-lighty; (*light i.e 160,100*)
Then decrement the nx and ny values with lx and ly.
After that, increment nx and ny with 128;
Check that it's in the range
if (nx<0) or (nx>255) then nx:=0;
if (ny<0) or (ny>255) then ny:=0;
The draw the pixel
putpixel(i,j,environmentmap[nx,ny]);
That it, pretty simple, isn't it. Now, why is this effect useful.
Well, you can do some really cool demoeffect, like a combined plasma
and bumpmapper. A maybe you the effect in games.
How about a C&C clone with bumpmapped ground.
Would, look a lot more realistic.
Bumpmapping is also used in 3d-games. The only one i've seen yet is
the faboulos game: MechWarrior 2: Mercheneries. The ground in some
levels is bumpmapped, very nice. BTW, the code contained in the
package wont compile without my units, so it's only for your viewing
pleasure.
Thanks and goodnight, Hackurd!
mail: cptomte@pemail.com , cptomte@mailcity.com ,
cptomte@imatrekkie.com
url: http://members.tripod.com/~hackurd/
1 March 1998
|