|
 
DirectX 8.0: 3D teksture, multi-sampling in point sprites
Avtor: Marko "Senitel"
Dolenc Datum: 28.6.2001 |
V prejšnjem članku smo si ogledali pixel in vertex shaderje, ki v svet grafike
za osebne računalnike prinašajo programabilnost. V tem članku pa si bomo
ogledali še dve veliki novosti v DirectX 8.0 - podpora za 3D teksture in
multi-sampling. Če bodo vertex in pixel shaderje cenili predvsem programerji, pa
bodo 3D teksture in multi-sampling prava paša za oči.
Opomba by luni: kliknite na slike za večje verzije... se splača.
|
| 3D teksture |
|
Do sedaj smo v grafiki za osebne računalnike srečevali le 2D
teksture (profesionalne grafične kartice imajo podporo za 3D teksture že kar
nekaj časa). 2D tekstura je, povsem enostavno povedano - slika. Ta slika se nato
prilepi na trikotnike in tako precej polepšamo izgled modelov. 3D teksture
(imenovane tudi volumetrične teksture) pa vsebujejo še globino. 3D teksture tako
niso nič drugega kot zaporedje enako velikih 2D slik. 3D teksture precej
spominjajo na voxle (primer: igra Delta Force), vendar se razlikujejo v
tehničnih detajlih (voxli so lahko kjer koli v prostoru, medtem ko morajo biti
texli na 3D teksturi v fiksni mreži, ...). Mnogi se ob voxlih samo primejo za
glavo in spomnijo na Delta Force in kockasto pokrajino in tako se veselje konča.
Vendar so voxli lahko mnogo mnogo lepši, kot jih predstavi Delta Force. 3D
teksture pa so v bistvu nekakšen vmesni korak med klasičnimi poligoni in
voxli.
Ena izmed možnih uporab 3D tekstur - oblaki.
3D teksture imajo en zelo velik minus. So namreč zelo požrešne za
video pomnilnik. 3D tekstura z dimenzijami 256x256x256 v 32 bitni barvni
globini zasede kar 64MB pomnilnika, kar pa je že ves razpoložljiv pomnilnik na
praktično vseh grafičnih karticah za osebne računalnike. In zaradi te velikosti
bo potrebno razviti zelo dobre metode za kompresiranje teh tekstur.
Primer uporabe 3D tekstur za zahtevna modeliranja. Namesto, da bi lik
sestavili iz trikovnikov naredimo 3D teksturo.
Kaj lahko počnemo s 3D teksturami:
- simuliramo oblake, in ostale atmosferske učinke (megla, ...)
- pomoč pri per-pixel lighting-u (bolj realistično senčenje)
- razno razni volumetrični učinki: volumetrična in lokalna megla, volumetrične
luči (svetlobni snopi)
- enostaven prikaz zapletenih objektov
|
| Multi-sampling |
Multi-sampling je še ena zadeva, ki se iz profesionalnih grafičnih
postaj seli v osebne računalnike. Multi-sampling nam omogoča izdelavo učinkov,
ki bi jih brez njega težko dosegli. Trenutno kar nekaj kartic že delno podpira
multi-sampling (npr. Voodoo 5, GeForce, Radeon). Vendar je ta podpora omejena
izključno na glajenje robov (FSAA - Full Scene Antialiasing) in ne omogoča
označevanje posameznih vzorcev (samplov).
Kako deluje multi-sampling:
| Prvi vzorec, ki ga izrišemo (dvojiška maska 1000). |
Drugi vzorec, ki ga izrišemo (dvojiška maska 0100). |
Tretji vzorec, ki ga izrišemo (dvojiška maska 0010). |
Četrti vzored, ki ga izrišemo (dvojiška maska 0001). |
Ko vse štiri vzorce združimo skupaj dobimo takole sliko (dvojiška maska te
slike bi bila 1111, saj so v tej sliki vključeni vsi vzorci).
Primer učinka motion-blur. V osnovi izrisujemo samo besedilo "Test". V vsak
vzorec najprej izrišemo besedilo "Test" tja, kjer se besedilo-objekt trenutno
nahaja. Ta del slike je na vseh štirih slikah enak, in povzroči, da dobimo
povsem jasen vtis, kje se objekt v resnici nahaja. Zraven tega pa v vsak vzorec
izrišemo še objekt za nekaj korakov nazaj. Ko vse štiri vzorce združimo v eno
samo končno sliko (ki se tudi izriše na zaslonu) dobimo občutek, da se objekt
giblje in tudi kam se giblje.
Če pogledamo nekoliko natančneje, je vsaka pika posameznega vzorca doprinesla
1/4 končne slike. In v praksi se za vsako piko na končni sliki uporabi povprečna
vrednost te pike v vseh štirih vzorcih.
V tem primeru v vsak vzorec renderiramo svojo sliko. Smeri gibanja ni mogoče
razbrati.
Tukaj pa v vsak vzorec zapišemo tudi končno sliko. Zato lahko razberemo tudi
smer gibanja.
Dvojiške maske so zapisane v oklepajih zato, ker z njimi označujemo, na kateri
vzorec hočemo risati. Lahko namreč rišemo tudi na več vzorcev hkrati (če
postavimo recimo masko 0101). Osnovna maska, ki jo postavi DirectX 8.0 je
232 -1, in označuje renderiranje na vse razpoložljive vzorce
(maksimalno 32 vzorcev). Tukaj pa tiči tudi omejitev prej omenjenih grafičnih
kartic, te kartice sicer podpirajo multi-sampling, vendar ne omogočajo
spreminjanje te maske. Zato z multi-samplingom trenutno še ne moremo narediti
"motion-blur"-a in podobnih stvari (lahko pa jih vsaj nekaj naredimo ročno).
Seveda je tudi pri multi-samplingu potrebno omeniti, da je precej požrešen za
pomnilnik grafične kartice. V primeru, da renderiramo štiri vzorce, moramo
imeti vse (back buffer in z buffer) početverjeno. Edino velikost front bufferja
(kar je vidno na monitorju) je konstantna oziroma odvisna le od resulicije.
|
| Point sprites: |
Sprite poznamo predvsem iz 2D grafike. V 2D grafiki predstavlja sprite 2D
slikico, ki se jih izrisuje na neko ozadje brez kakšnih zapletenih operacij.
Primere si lahko ogledamo v praktično vseh 2D igrah (npr. Age of Empires: za
vsako enoto so posnete vse možne slikice, kako se enota giblje. Taka slikica se
imenuje sprite). DirectX 8.0 pa prinaša point sprite v 3D grafiko. Zakaj je
tokrat spredaj point? DirectX-u sedaj samo podamo točko (point), kjer se sprite
nahaja, 2D teksturo (sprite) in velikost sprita.
S to tehniko lahko naredimo precej zanimive stvari. Izdelamo lahko recimo
plamen na baklah, ogenj, vodomet, eksplozije,... Skratka vse, kar je povezano z
delci.
Lahko pa point sprite uporabimo tudi kot še eno tehniko za renderiranje
voxlov, kar zelo lepo demonstrira 3D Mark 2001. Sicer pa za tako vrsto
renderiranja potrebujemo zelo veliko zelo majhnih spritov, vendar lahko dosežemo
zelo veliko.
Primer uporabe point sprite-ov za simulacije učinkov z delci.
Point spriti imajo podobno kot multi-sampling delno podporo že na današnjih
grafičnih karticah. Kartice GeForce (razen GeForce 3, ki ima že strojno podporo)
s pomočjo procesorja iz ene točke in velikosti izračunajo dva trikotnika in ju
potem izrišejo. ATI Radeon trenutno tega še sploh ne podpira, vendar se bo
podpora podobna GeForce-evi pojavila v kakšnih novih gonilnikih.
|
| Zaključek: |
Tako prišli smo čez vse "vidne" novosti predstavljene v DirectX 8.0. Seveda
je sprememb v novi verziji še kar nekaj, med njimi so precej opazne tudi
izboljšave v komponentah DirectSound in DirectPlay, vendar je ravno grafika
tista, kar se takoj opazi. Pri vsem tem, pa moramo vedeti tudi to, da je sam
DirectX 8.0 tudi s programerskega stališča zelo nov, in predvsem precej
poenostavljen. Marsikateri programer si bo tako želel, da bi bile tudi ostale
komponente zasnovane po vzoru Direct3D.
Slike 3D tekstur so pobrane iz nekaterih prezentacij o realističnem
modeliranju oblakov s konference SIGGRAPH 2000 (prikaz 3D teksture za kompleksno
modeliranje pa je iz enega od ATI-jevih demo programov), prikaz multi samplinga
je v celoti moje delo (prvi del ročno v Paint Shop Pro-ju, drugi del pa je
dejansko renderiranje v Direct3D preko referenčnega načina). Demonstracija point
sprite-ov pa je ena izmed demo aplikacij v DirectX 8.0 SDK.
|
|
|