PROGRAMOWANIE
WEBMASTER:
 Artyku造
 Kursy
 Skrypty
PHP:
 Artyku造
 Kursy
 Skrypty
VISUAL C/C++:
 Artyku造
 Kursy
 Kody 廝鏚這we
C++ BUILDER:
 Artyku造
 Kursy
 Komponenty
 Kody 廝鏚這we
 FAQ
DELPHI:
 Artyku造
 Kursy
 Komponenty
 Kody 廝鏚這we
 FAQ
JAVA:
 Artyku造
 Kursy
 Aplety
ASP:
 Artyku造
 Kursy
 Skrypty
VISUAL BASIC:
 Artyku造
 Kursy
 Kody 廝鏚這we
PASCAL:
 Artyku造
 Kursy
 Kody 廝鏚這we
ASSEMBLER:
 Artyku造
 Kursy
 Kody 廝鏚這we
O NAS [...]
 Ekipa portalu
 Reklama
REKLAMA

Pascal » Artyku造
Bump Mapping
1. Na pewno, b璠帷 gdzie� w ciemnym miejscu, i maj帷 przy sobie latark� 鈍iecili軼ie ni� aby rozja郾i� sobie widok. Je瞠li 鈍iecili軼ie na 軼ian�, na kt鏎ej by造 jakie� napisy 豉twiej by這 je odczyta�. Fajne cieniowane k馧eczko pozwala這 nam dostrzec to czego normalnie z ciemno軼i nie widzimy. Rysunek pokazuje jak to ma wygl康a�. Bump jest to uzyskiwanie na p豉skim ekranie obrazu 3D. Lecz przyk豉d opisany w tym artykule dotyczy tylko i wy陰cznie obrazu 2D. Efekt i tak jest wspania造. Stworzyli軼ie rysunek 320x200x255 i chcecie by by� o鈍ietlany. Jest to bardzo proste lecz opr鏂z jakiego� t豉 potrzebne nam b璠zie jakie� 鈍iat這, kt鏎e te� trzeba narysowa�. 安iat這 najlepiej jakby by這 cieniowane, bo wtedy wychodzi najlepszy efekt. W tym przyk豉dzie mamy oszcz璠zon� robot� je郵i chodzi o narysowanie t豉 i 鈍iat豉 (pliki: tlo.gfx i latarka.gfx). Lecz same grafiki nic nam nie daj� trzeba tak瞠 umie� stworzy� algorytm ukazuj帷y t這, ciemno嗆 i 鈍iat這. Program dzia豉 w bardzo prosty spos鏏. Na ekranie jest rysowane 鈍iat這 o kolorach pobieranych z tablicy ekran. Mo瞠 jest to troch� nie zrozumia貫, ale je郵i przeczytasz poni窺zy tekst to na pewno wi璚ej zrozumiesz.

2. Najpierw trzeba otworzy� t這, czyli obrazek, kt鏎y b璠zie o鈍ietlany. Trzeba tak瞠 pami皻a� aby zawarto嗆 obrazka umie軼i� w tablicy 64000 KB.

type
ekran = array[0..319, 0..199] of byte;

Tablica potrzebna do umieszczenia w niej obrazka jest gotowa wi璚 teraz trzeba otworzy� obrazek, a robi si� to tak.

procedure opentlo(plik : string; tlo : byte);

var
f : file;
b : array[0..319] of byte;
x, y : integer;

begin
assign(f,plik);
reset(f,1);
for x:=0 to 199 do
begin
blockread(f,b,320); {przelewanie obrazka do tablicy}
for y:=0 to 319 do if b[y]<>tlo then begin putpixel(y,x,b[y]); ekr^[y,x]:=b[y]; end;
end;
close(f);
end;

Wiemy ju� jak otworzy� t這, ale pozosta這 nam jeszcze 鈍iat這.

procedure openpfile(x1, y1 : integer; plik : string; tlo : byte);

var f : file;
b, rx, ry : byte;
xx, yy : integer;
buf : array[1..321] of byte;
w, d : Word;

begin
assign(f,plik);
reset(f,1);
blockread(f,buf,2,w);
rx:=buf[1];
ry:=buf[2];
for yy:=1 to ry do
begin
blockread(f,buf,rx,w);
for xx:=1 to rx do if (buf[xx]<>tlo) then
{procedura rysuje rysunek poza kolorem tlo, pobieraj帷 jednocze郾ie, nr koloru odpowiadaj帷ych punkt闚 z tablicy ekran}
putpixel(xx+x1,yy+y1,(ekr^[xx+x1,yy+y1] div 50-(buf[xx])-3));
end;
close(f);
end;

3. Mamy ju� najwa積iejsze procedury, dzi瘯i kt鏎ym stworzymy 鈍iec帷� 鈍iat貫m latark�. Pora zaj望 si� stworzeniem ca貫go programu. Do jego wykonania potrzebne nam b璠� zmienne:

var
ekr : ^ekran; {zmienna typu ekran}
mx, my, k : integer; {zmienne do myszki}
ax, ay : integer; {zmienne pomocnicze}
i : integer; {zmienna pomocnicza}

Ju� mamy wszystko, wi璚 pora napisa� program.

(!!!UWAGA!!! PROGRAM WYKORZYSTUJE UNIT HELPMOUS.TPU)

uses crt, helpmous;

type
ekran = array[0..319, 0..199] of byte;

var
ekr : ^ekran;
mx, my, k : integer;
ax, ay : integer;
i : integer;

procedure initvga; assembler;
asm
mov ax, 13h
int $10
end;

procedure closevga; assembler;
asm
mov ax, 03h
int $10
end;

procedure putpixel(x, y : integer; c : byte);
begin
mem[$a000:y*320+x]:=c;
end;

function getpixel(x, y : integer) : byte;
begin
getpixel:=mem[$a000:y*320+x];
end;

procedure bar(x, y, d, s : word; kolor : byte);

var
xx, yy : word;

begin
for xx:= x to d do
for yy:= y to s do
begin
putpixel(xx,yy,kolor);
end;
end;

procedure setcol(col : byte; r, g, b : byte);
begin
port[$3C8] := col;
port[$3C9] := r;
port[$3C9] := g;
port[$3C9] := b;
end;

procedure opentlo(plik : string; tlo : byte);

var f : file;
b : array[0..319] of byte;
x, y : integer;

begin
assign(f,plik);
reset(f,1);
for x:=0 to 199 do
begin
blockread(f,b,320);
for y:=0 to 319 do if b[y]<>tlo then begin putpixel(y,x,b[y]); ekr^[y,x]:=b[y]; end;
end;
close(f);
end;

procedure openpfile(x1, y1 : integer; plik : string; tlo : byte);

var f : file;
b, rx, ry : byte;
xx, yy : integer;
buf : array[1..321] of byte;
w, d : Word;

begin
assign(f,plik);
reset(f,1);
blockread(f,buf,2,w);
rx:=buf[1];ry:=buf[2];
for yy:=1 to ry do
begin
blockread(f,buf,rx,w);
for xx:=1 to rx do if (buf[xx]<>tlo) then
putpixel(xx+x1,yy+y1,(ekr^[xx+x1,yy+y1] div 50-(buf[xx])-3));
end;
close(f);
end;

begin
new(ekr);
initvga;
opentlo('tlo.gfx',255);
for i:=0 to 255 do setcol(i,i,i,i);
bar(0,0,320,200,0);
bar(0,0,320,200,0);
mousewindow(5,5,210,90);
setmousepos(110,50);
mx:=5;
my:=5;
repeat
getmousepos(mx,my,k);
openpfile(mx,my,'latarka.gfx',255);
if (ax<>mx) or (ay<>my) then
begin
ax:=mx;
ay:=my;
bar(0,0,320,200,0);
end;
until keypressed;
closevga;
dispose(ekr);
end.

4. Program jest 豉twy w obs逝dze i ma wiele zastosowa�, lecz to od ciebie zale篡 co to b璠zie...

Kod 廝鏚這wy do artyku逝:
Bump Mapping (30 KB)

Micha� Rygielski
NEWSLETTER
Chcesz by� zawsze na bie膨co?
Zapisz si�!
WP.PL
LITERATURA
INNE [?]
Katalog WWW
Sponsor
On-Line: 4
stat4u
Wszystkie prawa zastrze穎ne © 2001-2002 Programik.com