Информационный сервер для программистов: Исходники со всего света. Паскальные исходники со всего света
  Powered by Поисковый сервер Яndex: Найдется ВСЁ!
На Главную Исходники Форум Информер Страны мира
   Demo Making    >>    bumpmap
   
 
 2D-BumpMapping Tutorial   Hackurd 01.03.1998

Объяснение красивого эффекта Bump Mapping (формирование рельефного изображения наподобие чеканки). Приведено описание, исходник алгоритма, но без графической библиотеки.
BUMP MAPPING - A 2d-bumpmapping tutorial by Hackurd. Including executables and source code in pascal.



48k 
 

*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