
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)