This is another methode to the bump mapping.
Bumpdemo
Here is a code :
Just for the fun.
Bumpdemo
Here is a code :
; ; CREATED BY EXTRON ; FREE TO USE ; Graphics3D 800,600,32,2 SetBuffer BackBuffer() ; CREATE CAMERA Camera=CreateCamera() CameraRange camera,0.1,10000000 PositionEntity camera,0,0,-3 ; CREATE EARTH AND LOAD TEXTURE tex=LoadTexture("earth11.bmp",1+256+512) sphere=CreateSphere(20) PositionEntity sphere,0,0,0 EntityTexture sphere,tex ; CREATE A FAKE LIGHT WHITH PIVOT pivot=CreatePivot() PositionEntity pivot,0,0,0 fakelight=CreateSphere(2,pivot) PositionEntity fakelight,0,0,-1.5 ScaleEntity fakelight,0.025,0.025,0.025 AmbientLight 255,255,255 ; HERE WE CREATE AN ARRAY FOR THE NORMALS ; REAL NORMAL MAP IS IN THE FILE "earth11bump.tga" ; CALCULATE THE NORMALIZED VECTOR FOR EACH POSITION Dim vecteurx#(511,255) : Dim vecteury#(511,255) : Dim vecteurz#(511,255) img=LoadImage("earth11bump.tga") For y=0 To 255 For x=0 To 511 a=ReadPixel(x,y,ImageBuffer(img)) vecteurx#(x,y)=(a And $ff0000) Sar 16 vecteury#(x,y)=(a And $ff00) Sar 8 vecteurz#(x,y)=a And $ff TFormNormal vecteurx#(x,y), vecteury#(x,y), vecteurz#(x,y), 0, 0 vecteurx#(x,y)=TFormedX() : vecteury#(x,y)=TFormedY() : vecteurz#(x,y)=TFormedZ() Next Next ; DON'T NEED ANY MORE (HOP! POUBELLE.) FreeImage img ; ANOTHER ARRAY FOR THE TEXTURE, THIS SAVE THE DATA, IT'S NECESSARY. Dim texsave(512,256) For y=0 To 255 For x=0 To 511 texsave(x,y)=ReadPixel(x,y,TextureBuffer(tex)) Next Next ; ;************************************************************************************** ; ; START RENDER While Not KeyDown(1) ; ROTATE EARTH AND FAKE LIGHT TurnEntity pivot,0,-1,0 TurnEntity sphere,0,0.1,0 ; CALCULATE THE NORMAL BETWEEN THE CENTER OF THE EARTH AND THE CENTER OF THE FAKE LIGHT vectorx#=EntityX(sphere)+EntityX(fakelight,1) vectory#=EntityY(sphere)+EntityY(fakelight,1) vectorz#=EntityZ(sphere)-EntityZ(fakelight,1) TFormNormal vectorx#, vectory#, vectorz#, 0, 0 vecx#=TFormedX() : vecy#=TFormedY() : vecz#=TFormedZ() ; HERE WE UPDATE THE TEXTURE SetBuffer TextureBuffer(tex) LockBuffer TextureBuffer(tex) For y=0 To 255 For x=0 To 511 ; DOT PRODUCT X,Y AND Z BETWEEN THE VECTOR OF THE FAKE LIGHT AND THE PIXEL VECTOR OF THE BUMP IMAGE DP3# = (vecteurx#(x,y) * vecx#) + (vecteury#(x,y) * vecy#) + (vecteurz#(x,y) * vecz#) ; UPDATE RED, GREEN AND BLUE OF THE TEXTURE WHITH THE COEFFICIENT a=texsave(x,y) r=(a And $ff0000) Sar 16 v=(a And $ff00) Sar 8 b=a And $ff r=Int((Float(r)*DP3#)) : v=Int((Float(v)*DP3#)) : b=Int((Float(b)*DP3#)) ; BEWARE THIS CAN BE LESS THAN 0 If r<0 Then r=0 If v<0 Then v=0 If b<0 Then b=0 a=$ff000000+(r*256*256)+(v*256)+b WritePixelFast x,y,a Next Next UnlockBuffer TextureBuffer(tex) SetBuffer BackBuffer() ; RENDER THE WORLD AND ENJOY RenderWorld Flip 0 Wend End
Just for the fun.