ZZZZZZZZZZZ
ZZZ
ZZZ
ZZZ
ZZZ
ZZZZZZZZZZZ
-
Buffering
Ten, kdo se někdy pokoušel dělat počítačovou 3D
grafiku, jistě narazil na problém jak zajistit, aby se dvě
tělesa, která se navzájem prolínají, zobrazila alespoň
trochu slušně. Někteří se tento problém snaží řešit čistě
matematicky a počítají průnik polygonů, z toho pak
udělají polygony nové a ty potom zobrazí klasickými
metodami. Tato metoda je sice teoreticky použitelná, je s
tím trochu moc práce. Nejjednodušším způsobem, jak
dosáhnout korektního zobrazení dvou a více navzájem se
prolínajících objektů je Z-BUFFERING.
Z-Buffering spočívá v tom, že si v dvojrozměrném poli o
rozmerech schodných s rozměry obrazovky souřadnici Z každého
zobrazovaného bodu a když zobrazujeme bod [X,Y], tak
porovnáme Z zapisovaného bodu s Z zapsanym dříve do
Z-Bufferu na souřadnice [X,Y] a když je Z zobrazovaného bodu
menší nebo rovno (to znamená, že je blíž než bod zobrazený
minule na tyto souřadnice), tak bod vykreslíme a do
Z-Bufferu zapíšeme na jeho souřadnice hodnotu Z.
Tak to byla teorie a teď trochu praxe.
Předpokládejme polygon A[Xa,Ya,Za] B[Xb,Yb,Zb] C[Xc,Yc,Zc] .
Když budeme body transformovat z 3D do 2D třeba podle
rovnic:
X=(X*256)/Z
Y=(Y*256)/Z
Můžeme odvodit, že se bude hodnota 1/Z měnit s přírůstkem 2D
souřadnic lineárně. Z toho plyne, že si stačí na začátku
zpočítat 2D souřadnice bodů polygonu, jednu hodnotu 1/Z a
krok, kterym se bude měnit tato hodnota s přírůstkem 2D X a
Y. Přírůstky spočítáme například podle rovnic:
KrokX=(Xb-Xc)/(Zb-Zc)
KrokY=(Yc-Ya)/(Zc-Za)
Potom stačí jen při vykreslování polygonu spočítat:
Zi=(1/Z)+X*KrokX+Y*KrokY
(Kde X a Y sou 2D souřadnice při vyplňování polygonu)
Toto Zi pak porovnávat a ukládat do Z-Bufferu výše uvedeným
postupem.
Ještě jedna poznámka na závěr: nezapomeňte před počítáním
každého frejmu (pro angličtináře: je to od slova FRAME)
naplnit Z=Buffer maximálními hodnotami.
A jak to potom vypadá?
Hodně úspěchů při psaní Z=Bufferu Vám přeje:
Mystik
(mystik@bbs.infima.cz)
výheň