» »

TruForm (N-Patches)

ATI je s svojim R200 (ki se nahaja na karticah Radeon 8500) v svet računalniške grafike vnesel kar precej potrebne vedrine, ki je že nekaj časa nismo bili deležni. R200, poleg hitrosti, nudi tudi nekaj novosti, ki jih do sedaj še nismo videli implementiranih v grafične čipe. Ena izmed teh novosti je tudi TruForm. TruForm je ATI-jevo ime za n-patches (n-zlepki), ki jih lahko še drugače imenujemo tudi beizer patches (bezier zlepki). Skratka tri imena za eno in isto stvar...


Kaj so n-zlepki in kako delujejo?

N-Zlepki so eden izmed načinov predstavljanja krivulj v računalniški grafiki. Osnova n-zlepkov je isti postopek kot ga uporabimo za izris bezierjeve krivulje, samo da ga uporabimo v treh dimenzijah.

Primer bezierjeve krivulje, za katero potrebujemo štiri točke

TruForm deluje na klasičnih trikotnikih, za kar potrebujemo trikotniške n-zlepke. Za trikotniške n-zlepke potrebujeemo 10 kontrolnih točk. Tri kontrolne točke predstavljajo oglišča trikotnika, ostalih 7 pa moramo izračunati. Ker TruForm deluje v celoti na grafičnem procesorju si moramo za izračun preostalih kontrolnih točk pomagati s podatki, ki jih grafični procesor dobi. Šest dodatnih kontrolnih točk lahko dobimo tako, da v vsako točko postavimo ravnino, ki je pravokotna na normalo v tej točki. Nato pa poiščemo še točko, ki je na 1/3 dolžine do sosednje točke in jo preslikamo na ravnino (glej spodnjo sliko za boljšo predstavitev).

V točki P1 imamo normalo N, kar definira ravnino. Izračunamo točko na 1/3 razdalje med P1 in P2 ter jo preslikamo na ravnino.

Sedaj imamo vsega sukupaj 9 kontrolnih točk in potrebujemo še eno, ki pa jo dobimo tako, da izračunamo povprečje ostalih devetih točk.

Mreža kontrolnih vseh desetih kontrolnih točk.

Sedaj mora grafična kartica s pomočjo teh kontrolnih točk samo še izračunati nove trikotnike in postopek je končan. Nove trikotnike pa grafični procesor generira tako, da vsak rob razdeli na določeno število segmentov (število željenih segmentov poda aplikacija). Če imamo en segment se trikotnik ne spremeni. Pri dveh segmentih dobimo iz enega trikotnika 4 trikotnike, pri treh segmentih 9 trikotnikov, pri štirih pa že 16 trikotnikov. Kot vidite število trikotnikov narašča zelo hitro in lahko precej hitro zaduši grafično kartico. 


Praksa

No sedaj pa še zanimivejši del, kako namreč vse skupaj izgleda v praksi. Sicer ni ravno Serious Sama ampak en programček, ki sem ga sprogramiral in si ga lahko tudi sami pogledate. Modeli so sicer brez tekstur vendar so uporabljene točkovne luči tako, da se vseeno vidi kakšen je učinek na osvetlitev.

Živa bitja so ena izmed najprimernejših stvari za uporabo z TruFormom, saj niso sestavljena iz ostrih robov, kar kot bomo videli pozneje, povzroča probleme.

Delfin renderiran povsem običajno

Delfin renderiran z TruFormom (4 segmenti)

Žični model originalnega delfina

Žični model delfina renderiranega z TruFormom (4 segmenti)

O spremembah naj se vsak odloči sam, vendar je vse skupaj vedno videti bolje v gibanju. Sledi model vesoljske ladje, ki vsebuje nekoliko ostrejše robove.

Običajno renderiran model vesoljske ladje

Model vesoljske ladje renderiran z TruFormom (4 segmenti)

Žični model običajno renderirane ladje

Žični model ladje renderirane s TruFormom (4 segmenti)

Kot vidimo na modelu vesoljske ladje, ki je renderirana z TruFormom se že pojavijo težave pri stikanju robov. Ti problemi nastanejo zato, ker se točke na robovih običajno podvajajo. Zaradi podvajanja imajo te točke različne normale, kar povzroči da se sosednji robovi ne stikajo.

Problemi, ki nastanejo pri stikanju robov

No pa si poglejmo še model vesoljske postaje (ki si ga lahko ogledate tudi v priloženem programčku).

Model vesoljske postaje renderiran brez TruForma

Model vesoljske postaje renderiran z TruFormom (4 segmenti)

Žični model vesoljske postaje brez TruForma

Žični model vesoljske postaje z TruFormom (4 segmenti)

Kot lahko vidimo so se težave ponovno pojavile. Zanimivo je tudi to, da v bistvu ni nobene enostavne rešitve za odstranitev tega problema. Namreč tudi če ne uporabljamo podvajanja točk na robovih in imamo zato v vsaki točki samo eno normalo (pač povprečna normala vseh prejšnjih) se problemom ne izognemo. S tem sicer rešimo problem nespajanja robov, ampak nas čaka nov problem - "napihovanje modela". 

Ponovno se pojavijo problemi z robovi

Kako izgleda "napihnjen model"? Spodaj imate nekaj slikic, kaj se zgodi z modelom kocke...

Osnovni žični model kocke brez podvajanja normal

Žičnimodel kocke z TruFormom (4 segmenti) - modra kocka znotraj je original

Ista kocka renderirana z TruFormom in 16 segmenti

Kocka ima sicer to dobro lastnost, da je pravilen lik in v primeru, da bi imelo vsako oglišče kocke tri normale pravokotne na svoje ploskve ne bi doživeli zgoraj opisanih problemov, vendar pa to velja samo pri ravnih ploskvah. Poleg tega se površina v tem primeru sploh ne bi ukrivila, ampak bi TruForm samo razbil trikotnike na še manjše trikotnike.

Dobre strani: Slabe strani:
  • Zanimiva uporaba pri organskih modelih
  • Vse se izvaja na grafični kartici (na grafično kartico pošljemo samo osnovni model, ki ima dosti manj trikotnikov, kot jih bo imel konči model), s čimer se izognemo prevelikim količinam prenosa podatkov čez AGP vodilo
  • Uporaben praktično samo za organske modele
  • Problemi z robovi so praktično neizogibni

Zaključek

Mnenje o TruFormu naj si pač izdela vsak sam, vendar mene ni preveč prevzel. Radeon 8500 pa je tako ali tako dobra kartica tudi brez TruForma. Slike so vse razen dveh slik s kontrolnimi točkami, ki sta iz ATI-jeve strani, moje. Uporabljeni modeli pa se dobijo zraven DirectX 8.1 SDK.

Program si lahko sami snamete in pogledate tukaj. Program vedno uporablja n-zlepke, vendar bo v primeru Radeon-a 8500 uporabil strojno pospeševanje, na vseh ostalih karticah pa softwaresko emulacijo.

Tukaj pa si lahko snamete še celotno izvorno kodo in se malo igrate z njo.

DirectX 11

DirectX 11

Dve leti že mineva od Microsoftove razgrnitve novega operacijskega sistema Windows Vista, skupaj s katerim je luč sveta ugledala tudi zadnja različica multimedijskih knjižnic DirectX 10. Po rutinskih posodobitvah vsake dva-tri mesece, ki so večinoma posodabljale zgolj HLSL prevajalnik za shaderje, pa ...

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 »

Intervju z Richardom Huddyjem

Intervju z Richardom Huddyjem

Slo-Tech: Lahko našim bralcem najprej poveš nekaj o sebi ter o svojem delu pri ATIju? Richard Huddy: Delam v Evropi kot del skupine, ki podpira razvijalce iger -- spremljam razvoj naših novih tehnologij ter o njih predavam tehničnemu osebju, ki dela v segmentu razvoja iger. Hkrati ...

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 »

ATI Radeon 8500

ATI Radeon 8500

Temu članku bi lahko dal tudi naslov "Saga se nadaljuje", saj je le-to delo nekakšno logično nadaljevanje pred nekaj dnevi objavljenega testa grafične kartice Geforce3 Titanium 500, saj Radeon 8500 nastopa kot njen neposredni konkurent. Članek, ki ga boste v naslednjih ...

Preberi cel članek »