Главная | Регистрация | Вход Приветствую Вас Гость | RSS
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Форум » Программирование » Программирование графики » Bump Mapping (PAS)
Bump Mapping (PAS)
ZorkusДата: Понедельник, 01.02.2010, 21:07 | Сообщение # 1
.::Admin::.
Группа: Администраторы
Сообщений: 63
Репутация: 556
Статус:Offline
Эти два примера были специально написаны, что-бы помочь начинающему разобраться в принципах Bump Mapping'а. В примерах приведены два абсолютно прозрачных и понятных исходника - простой bump mapping, и bump mapping с использованием phong map. Как расчитать Phong Map я рассказыват не стану, возьмитее ее луче здесь. Кроме того для запуска вам понадобится какая либо картинка в формате Dump'а - если самим создавать лениво, то возьмите вот эту.
Пример 1 - Bump Mapping без текстуры Фонга

Code
{$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.
 
ZorkusДата: Понедельник, 01.02.2010, 21:08 | Сообщение # 2
.::Admin::.
Группа: Администраторы
Сообщений: 63
Репутация: 556
Статус:Offline
Пример 1 - Bump Mapping с текстурой Фонга
Code
{$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.
 
ХакерДата: Среда, 03.02.2010, 22:54 | Сообщение # 3
Рядовой
Группа: Пользователи
Сообщений: 3
Репутация: 0
Статус:Offline
Слышал о таком, но не применял на практике, тут ошибок нет? Я попробую и скажу есть ошибки или нет smile
 
ZorkusДата: Понедельник, 08.02.2010, 14:21 | Сообщение # 4
.::Admin::.
Группа: Администраторы
Сообщений: 63
Репутация: 556
Статус:Offline
Хакер, ну как успехи?
 
Форум » Программирование » Программирование графики » Bump Mapping (PAS)
  • Страница 1 из 1
  • 1
Поиск:


Copyright MyCorp © 2006
Создать бесплатный сайт с uCoz