Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

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.

Оставить комментарий

Комментарий:
можно использовать BB-коды
Максимальная длина комментария - 4000 символов.
 

Комментарии

1.
Аноним
Мне нравитсяМне не нравится
18 декабря 2004, 13:37:48
да, на asm`е - охренеть как понятно.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог