Bump Mapping (PAS)
Эти два примера были специально написаны, что-бы помочь начинающему разобраться в принципах Bump Mapping'а. В примерах приведены два абсолютно прозрачных и понятных исходника - простой bump mapping, и bump mapping с использованием phong map. Как расчитать Phong Map я рассказыват не стану, возьмитее ее луче здесь. Кроме того для запуска вам понадобится какая либо картинка в формате Dump'а - если самим создавать лениво, то возьмите вот эту.
Пример 1 - Bump Mapping без текстуры Фонга
{$R-,Q-} Program BUMP_MAPPING_WITHOUT_PHONG_TEXTURE; Const fs=$64; {ASSEMBLER 386+ hrefIXES} gs=$65; Var sintable:array[0..320] of integer; vpageseg,txrseg:word; vpage,txrpointer:pointer; x,y:integer; anglex,angley:byte; { Задаем компоненты R,G,B для цвета Color } PROCEDURE Setrgb(color,r,g,b:byte);Assembler; Asm Mov al,[color] Mov dx,03c8H Out dx,al Inc dx Mov al,[r] Out dx,al Mov al,[g] Out dx,al Mov al,[b] Out dx,al End; { Создаем гаснущую (faded) плаитру } PROCEDURE Fadepalette(r1,g1,b1,r2,g2,b2,cstart,cend:byte); Var rstep,gstep,bstep,rval,gval,bval:longint; i:integer; Begin rval:=longint(r1) shl 8; gval:=longint(g1) shl 8; bval:=longint(b1) shl 8; rstep:=longint(r2-r1+1) shl 8 div (cend-cstart+1); gstep:=longint(g2-g1+1) shl 8 div (cend-cstart+1); bstep:=longint(b2-b1+1) shl 8 div (cend-cstart+1); For i:=cstart to cend do Begin Setrgb(i,rval div 256,gval div 256,bval div 256); rval:=rval+rstep; gval:=gval+gstep; bval:=bval+bstep; End; End; PROCEDURE Wait4vrt;Assembler; { Ждем обратого хода луча } Asm Mov dx,3daH @L1: In al,dx And al,08H Jnz @L1 @L2: In al,dx And al,08H Jz @L2 End; PROCEDURE Loadraw(filename:string); { Читаем файл texture.raw } Var ff:file; Begin Assign(ff,filename); Reset(ff,1); Blockread(ff,txrpointer^,64000); Close(ff); End; PROCEDURE Clear(segm:word);Assembler; Asm Mov es,segm Db $66;Xor di,di Db $66;Xor ax,ax Mov cx,0ffffH/4 Db $66;Rep Stosw End; PROCEDURE Fliptovideo;Assembler; { Кидаем виртуальный экран в реальный } Asm Push ds Mov ds,vpageseg Push 0A000H Pop es Db $66;Xor di,di Db $66;Xor si,si Mov cx,16000 Db $66;Rep Movsw Pop ds End; PROCEDURE Allocate; { Выделем два сегмента для текстуры } Begin Getmem(vpage,64000); vpageseg:=Seg(vpage^); Getmem(txrpointer,64000); txrseg:=Seg(txrpointer^); Clear(vpageseg); Clear(txrseg); End; PROCEDURE Bump(xlight,ylight:integer);Assembler; Var xp,yp,i,j,nx,ny:integer; Asm Mov es,vpageseg mov ax,txrseg Db $8E,$E0 Xor si,si Mov di,321 Xor ax,ax Sub ax,Word Ptr [ylight] Mov Word Ptr [yp],ax Mov Word Ptr [i],198 @Yloop: Xor ax,ax Sub ax,Word Ptr [xlight] Mov Word Ptr [xp],ax Mov Word Ptr [j],318 @Xloop: Xor bx,bx Xor ax,ax Db fs; Mov al,[di+1] Db fs; Mov bl,[di-1] Sub ax,bx Mov Word Ptr [nx],ax Xor ax,ax Db fs; Mov al,[di+320] Db fs; Mov bl,[di-320] Sub ax,bx Mov Word Ptr [ny],ax Inc Word Ptr [xp] Mov ax,[nx] Sub ax,[xp] Cwd Xor ax,dx Sub ax,dx Mov bx,128 Sub bx,ax Cmp bx,0 Jg @Bigger Xor bx,bx @Bigger: Mov ax,[ny] Sub ax,[yp] Cwd Xor ax,dx Sub ax,dx Mov cx,128 Sub cx,ax Cmp cx,0 Jg @Bigger2 Xor cx,cx @Bigger2: Mov ax,bx Mul cx Mov bx,192 Div bx Cmp ax,255 Jbe @Lower Mov ax,255 @Lower: Stosb Dec Word Ptr [j] Jnz @Xloop Inc Word Ptr [yp] Add di,2 Dec Word Ptr [i] Jnz @Yloop End; Begin {Считаем таблицу синустов для построени траекториии движения} For x:=0 to 320 do sintable[x]:=Round(Sin(x*Pi/128)*128); { Инициализайия графики - 320x200x256 } Asm Mov ax,13H Int 10H End; Fadepalette(0,0,0,24,53,44,0,63); Fadepalette(24,53,44,63,63,63,64,128); Allocate; Loadraw('TEXTURE.RAW'); Repeat x:=160+sintable[anglex]; y:=100+sintable[angley]; Bump(x,y); Wait4vrt; Fliptovideo; Inc(anglex,3); anglex:=anglex and 255; Inc(angley,2); angley:=angley and 255; Until Port[$60]=1; { Пока не вдвили Esc } { Восстанавливаем текстовый режим } Asm Mov ax,3H Int 10H End; End.
Пример 1 - Bump Mapping с текстурой Фонга
{$R-,Q-} Program BUMP_MAPPING_WITH_PHONG_TEXTURE; Const fs=$64; {ASSEMBLER 386+ hrefIXES} gs=$65; Var sintable:array[0..320] of integer; phongseg,vpageseg,txrseg:word; phong,vpage,txrpointer:pointer; x,y:integer; anglex,angley:byte; { Задаем компоненты R,G,B для цвета Color } PROCEDURE Setrgb(color,r,g,b:byte);Assembler; Asm Mov al,[color] Mov dx,03c8H Out dx,al Inc dx Mov al,[r] Out dx,al Mov al,[g] Out dx,al Mov al,[b] Out dx,al End; { Создаем гаснущую (faded) плаитру } PROCEDURE Fadepalette(r1,g1,b1,r2,g2,b2,cstart,cend:byte); Var rstep,gstep,bstep,rval,gval,bval:longint; i:integer; Begin rval:=longint(r1) shl 8; gval:=longint(g1) shl 8; bval:=longint(b1) shl 8; rstep:=longint(r2-r1+1) shl 8 div (cend-cstart+1); gstep:=longint(g2-g1+1) shl 8 div (cend-cstart+1); bstep:=longint(b2-b1+1) shl 8 div (cend-cstart+1); For i:=cstart to cend do Begin Setrgb(i,rval div 256,gval div 256,bval div 256); rval:=rval+rstep; gval:=gval+gstep; bval:=bval+bstep; End; End; PROCEDURE Wait4vrt;Assembler; { Ждем обратого хода луча } Asm Mov dx,3daH @L1: In al,dx And al,08H Jnz @L1 @L2: In al,dx And al,08H Jz @L2 End; PROCEDURE Loadraw(filename:string); { Читаем файл texture.raw } Var ff:file; Begin Assign(ff,filename); Reset(ff,1); Blockread(ff,txrpointer^,64000); Close(ff); End; PROCEDURE Loadphong; Var ff:file; Begin Assign(ff,'PHONG.MAP'); Reset(ff,1); Blockread(ff,phong^,Filesize(ff)); Close(ff); End; PROCEDURE Clear(segm:word);Assembler; Asm Mov es,segm Db $66;Xor di,di Db $66;Xor ax,ax Mov cx,0ffffH/4 Db $66;Rep Stosw End; PROCEDURE Fliptovideo;Assembler; { Кидаем виртуальный экран в реальный } Asm Push ds Mov ds,vpageseg Push 0A000H Pop es Db $66;Xor di,di Db $66;Xor si,si Mov cx,16000 Db $66;Rep Movsw Pop ds End; PROCEDURE Allocate; { Выделем два сегмента для текстуры } Begin Getmem(vpage,64000); vpageseg:=Seg(vpage^); Getmem(txrpointer,64000); txrseg:=Seg(txrpointer^); Getmem(phong,64000); phongseg:=Seg(phong^); Clear(vpageseg); Clear(txrseg); Clear(phongseg); End; PROCEDURE Phongbump(xlight,ylight:integer);Assembler; Var nx,ny,xp,yp,i,j:integer; Asm Mov [nx],0 Mov [ny],0 Mov es,txrseg mov ax,phongseg Db $8E,$E0 { Mov fs,ax } mov ax,vpageseg Db $8E,$E8 { Mov gs,ax } Xor si,si Mov di,321 Xor ax,ax Sub ax,Word Ptr [ylight] Mov Word Ptr [yp],ax Mov Word Ptr [i],198 Yloop: Xor ax,ax Sub ax,Word Ptr [xlight] Mov Word Ptr [xp],ax Mov Word Ptr [j],318 @Xloop: Xor ax,ax Xor bx,bx Mov bl,es:[di+1] Mov al,es:[di-1] Sub ax,bx Shr ax,1 Add ax,127 Mov Byte Ptr [nx],al Xor ax,ax Xor bx,bx Mov bl,es:[di+320] Mov al,es:[di-320] Sub ax,bx Shr ax,1 Add ax,127 Mov Byte Ptr [ny],al Inc Word Ptr [xp] Mov ax,Word Ptr [xp] Add ax,Word Ptr [nx] Test ah,ah Jnz @Zero Mov bx,Word Ptr [yp] Add bx,Word Ptr [ny] Test bh,bh Jnz @Zero Mov bh,al Db fs; Mov al,[bx] Db gs; Mov [di],al Inc di Dec Word Ptr [j] Jnz @Xloop Jmp @Ende @Zero: Xor al,al Db gs; Mov [di],al Inc di Dec Word Ptr [j] Jnz @Xloop @Ende: Inc Word Ptr [yp] Add di,2 Dec Word Ptr [i] Jnz @Yloop End; Begin {Считаем таблицу синустов для построени траекториии движения} For x:=0 to 320 do sintable[x]:=Round(Sin(x*Pi/128)*128); { Инициализайия графики - 320x200x256 } Asm Mov ax,13H Int 10H End; Fadepalette(0,0,0,53,23,33,0,63); Fadepalette(53,23,33,64,64,64,64,128); Allocate; Loadraw('TEXTURE.RAW'); Loadphong; Repeat x:=160+sintable[anglex]; y:=100+sintable[angley]; Phongbump(x,y); Wait4vrt; Fliptovideo; Inc(anglex,3); anglex:=anglex and 255; Inc(angley,2); angley:=angley and 255; Until Port[$60]=1; { Пока не вдвили Esc } { Восстанавливаем текстовый режим } Asm Mov ax,3H Int 10H End; End.
Оставить комментарий
Комментарии
1.
18 декабря 2004, 13:37:48
да, на asm`е - охренеть как понятно.