» »

DirectX 8: 3D teksture, multi-sampling in point sprites

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.

rimer 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.

Novosti DirectXa 9 - 1. del

Novosti DirectXa 9 - 1. del

No pa smo vendarle dočakali novo, dolgo pričakovano, različico knjižnice DirectX, ki jo je zlobni Microsoft, bolj ali manj skrbno skrival pred radovednimi očmi javnosti. V približno enaki tajnosti sta nastala tudi ta dva članka, ki vam bosta, vsaj upam tako, uspela ...

Preberi cel članek »

DirectX 9.0 - Osnove programiranja

DirectX 9.0 - Osnove programiranja

V prejšnjih dveh člankih smo si ogledali vse novosti, ki jih je Microsoft uvedel v DirectX. Ker verjamem, da mnogi med vami niso ravno programerji, vas pa vseeno zanima, kako izgleda življenje na drugi strani, sem se odločil, da vam to vsaj malo približam. V tem članku bo ...

Preberi cel članek »

DirectX 9.0 - Izboljšave knjižnice

DirectX 9.0 - Izboljšave knjižnice

V prejšnjem delu smo si ogledali novosti in izboljšave, ki so doletele programabilnost grafičnih kartic, torej osenčevalnike točk ter oglišč. Seveda pa novi pixel in vertex shaderji niso edina novost v DirectX 9.0. Novosti je še kar nekaj, vendar je res, da je ...

Preberi cel članek »

Čudežno popotovanje skozi grafični cevovod II

Čudežno popotovanje skozi grafični cevovod II

V prvem delu smo si ogledali strukturo sodobne grafične kartice. Med drugim smo omenili shaderje, ki so zaradi svoje programabilnosti, nekakšno srce in duša sodobnih GPU-jev. Različni shaderji so odgovorni za različne strukture v grafiki (v Direct3D 10 so to oglišča, ...

Preberi cel članek »

Čudežno popotovanje skozi grafični cevovod

Čudežno popotovanje skozi grafični cevovod

Trenutno očitno živimo v obdobju, ko razni *PU-ji (Processing Unit) rastejo kot gobe po dežju. Nedolgo tega je tržne police ugledal prvi pospeševalnik fizikalnih izračunov (PPU ali Physic Processing Unit) PhysX podjetja Ageia. In ker to očitno še vedno ni dovolj, ...

Preberi cel članek »