Tento Φlßnek navazuje na p°ehled funkcφ grafick²ch karet z minulΘho Chipu a sna₧φ se vysv∞tlit teoretickΘ zßklady, kterΘ je k jejich pochopenφ dobrΘ znßt
Phong∙v osv∞tlovacφ model
V tomto textu budeme pou₧φvat pojmy vektor (popisuje nejen velikost, ale i sm∞r v prostoru, bude oznaΦovßn tuΦn²m pφsmem, nap°. R) a skalßrnφ souΦin. Skalßrnφ souΦin dvou vektor∙ je reßlnΘ Φφslo, kterΘ °φkß, jak jsou tyto vektory zorientovßny û skalßrnφ souΦin dvou kolm²ch vektor∙ je roven nule, zatφmco u dvou vektor∙ rovnob∞₧n²ch je nenulovΘ Φφslo. ╚φm shodn∞jÜφ je sm∞r dvou vektor∙, tφm v∞tÜφ je jejich skalßrnφ souΦin.
Phong∙v osv∞tlovacφ model vychßzφ z nßsledujφcφch fakt∙ (viz obrßzek). Sv∞teln² zdroj osv∞tluje vyÜet°ovan² bod a sm∞r k n∞mu m∙₧eme vyjßd°it jako vektor L. Ten vektor zφskßme tak, ₧e odeΦteme sou°adnice sv∞telnΘho zdroje a sou°adnice vyÜet°ovanΘho bodu. Nejd∙le₧it∞jÜφ p°i v²poΦtu osv∞tlovßnφ je kolmice k povrchu (normßla, normßlov² vektor) oznaΦenß jako N. DalÜφm vektorem je odra₧en² paprsek R, kter² zφskßme snadno z vektoru N a L, a V je vektor mφ°φcφ sm∞rem k pozorovateli.
Phong∙v osv∞tlovacφ model vypoΦφtßvß intenzitu sv∞tla, kterß se odrazφ z bodu do oka pozorovatele, a p°edpoklßdß, ₧e toto sv∞tlo lze rozd∞lit na t°i zßkladnφ slo₧ky, na slo₧ku difuznφ, zrcadlovou a ambientnφ. NejjednoduÜÜφ p°φpady odrazu sv∞tla jsou zßrove≥ p°φpady meznφ. P°i ·plnΘm difuznφm odrazu se sv∞telnß energie p°ichßzejφcφ z libovolnΘho sm∞ru rovnom∞rn∞ rozpt²lφ do vÜech sm∞r∙. Tuto vlastnost majφ tzv. lambertovskΘ povrchy, v nich₧ se proto v∙bec nic neodrß₧φ. Jejich nejv∞rn∞jÜφm p°φkladem v realit∞ je prachobyΦejn² kbelφk z um∞lΘ hmoty Φi k°φda. Tento model se velice snadno implementuje, a proto v∞tÜina objekt∙ v poΦßtcφch poΦφtaΦovΘ grafiky vypadala jako z plastiku.
Druh² p°φpad odrazu, kter² se snadno simuluje, je ideßlnφ zrcadlov² odraz (specular reflection). Zde se p°ichßzejφcφ energie odrazφ p°esn∞ pod ·hlem, pod kter²m na povrch dopadla. Pokud zjednoduÜφme zß°enφ na jedin² paprsek, pak zrcadlov² odraz odpovφdß situaci, kdy se paprsek odrazφ p°esn∞ pod ·hlem, pod kter²m dopadl. ╚ßst sv∞tla se m∙₧e samoz°ejm∞ pohltit, a tak je odra₧en² paprsek oslaben². Difuznφ odraz odpovφdß situaci, kdy se paprsek odrazφ do vÜech stran rovnom∞rn∞ û vznikne tedy jak²si trs paprsk∙.
Ambientnφ slo₧ka reprezentuje tzv. sv∞teln² Üum, kter² je konstantnφ pro celou scΘnu, a je chßpßna jako sv∞tlo, kterΘ vzniklo mnohonßsobn²m odrazem mezi objekty a na ΦßsteΦkßch vzduchu, vodnφ pßry, prachu atd.
Fyzikßlnφ modely vypoΦφtßvajφ osv∞tlenφ daleko p°esn∞ji. Phong∙v osv∞tlovacφ model je empirick² a empiriΦnost tkvφ prßv∞ v onom rozd∞lenφ sv∞tla na t°i nezßvislΘ slo₧ky. Ve skuteΦnosti je samoz°ejm∞ sv∞tlo jedno jedinΘ a uvedenΘ zjednoduÜenφ je v podstat∞ kombinacφ meznφch p°φpad∙ odrazu. Podφvejme se nynφ, jak se barva bodu vypoΦφtß.
OznaΦme intenzitu sv∞tla, kterΘ se odrß₧φ k pozorovateli, I, difuznφ p°φsp∞vek ID, zrcadlov² Is a ambientnφ IA. Intenzita sv∞telnΘho zdroje bude oznaΦena jako IL a ambientnφ Üum v celΘ scΘn∞ bude oznaΦen Iamb
Difuznφ slo₧ka osv∞tlenφ se vypoΦφtß podle vztahu
ID = rd IL (N.L),
kde rd °φkß, jak znaΦn∞ povrch odrß₧φ difuznφ slo₧ku sv∞tla. Je-li tento koeficient roven jednΘ, odrß₧φ povrch ·pln∞, nulovß hodnota naopak °φkß, ₧e neodrß₧φ v∙bec. ╚len v zßvorce je skalßrnφ souΦin vektor∙ kolmice k povrchu a sm∞ru ke sv∞tlu. Skalßrnφ souΦin je nulov² pro kolmΘ vektory a nejv∞tÜφ pro vektory, kterΘ mφ°φ stejn²m sm∞rem. Ze vztahu vypl²vß, ₧e se difuznφ slo₧ka odrß₧φ pouze v zßvislosti na poloze sv∞telnΘho zdroje a nenφ zßvislß na tom, odkud objekt sledujeme.
Zrcadlovß slo₧ka se vypoΦφtß jako
IZ = rZ IL (V.L)h,
kde rZ je koeficient odrazu zrcadlovΘ slo₧ky. ╚len v zßvorce je op∞t skalßrnφ souΦin dvou vektor∙ a vidφme, ₧e tato slo₧ka je zßvislß na poloze pozorovatele. Zrcadlov² odraz bude nejv∞tÜφ, kdy₧ se budeme dφvat ve sm∞ru odra₧enΘho paprsku. ╚len v zßvorce b²vß zvykem umoc≥ovat na n∞jakΘ reßlnΘ Φφslo h. Zrcadlovß slo₧ka zp∙sobuje na objektu "prasßtko" a h urΦuje jeho polom∞r û Φφm je v∞tÜφ, tφm je "prasßtko" menÜφ.
Ambientnφ vztah je v²poΦetn∞ nejjednoduÜÜφ
IA = rA Iamb.
Iamb popisuje mno₧stvφ sv∞telnΘho Üumu ve scΘn∞, a jak jsme °ekli, je ve scΘn∞ konstantnφ.
Je d∙le₧itΘ si uv∞domit, ₧e v²poΦet se provßdφ postupn∞ pro jednotlivΘ barevnΘ kanßly (Φerven², zelen² a modr²). Pokud tedy budeme na zcela Φerven² objekt svφtit modr²m sv∞tlem, bude v²slednß barva Φernß.
Stφnovßnφ
Stφnovßnφm (shading) se rozumφ v²poΦet barevn²ch p°echod∙ zp∙soben²ch nestejn²m osv∞tlenφm r∙zn²ch Φßstφ objektu. Nebylo by nijak d∙le₧itΘ se stφnovßnφm explicitn∞ zab²vat, kdyby s nφm nebyl spojen jeden velk² problΘm. Pokud je naÜφm ·kolem zobrazit n∞jak² objekt osv∞tlen² n∞kolika sv∞teln²mi zdroji pomocφ Phongova osv∞tlovacφho modelu, musφme nejd°φve vypoΦφtat body, kterΘ se promφtnou do urΦit²ch pixel∙ obrazovky, pro n∞ najφt odpovφdajφcφ vzory na povrchu objektu, k nim urΦit normßlovΘ vektory a na ka₧d² takov²to bod aplikovat Phong∙v osv∞tlovacφ model. Prßv∞ poslednφ zmφn∞n² krok je nejvφce v²poΦetn∞ nßroΦn². V²poΦetnφ nßroΦnost je v₧dy d∙vodem k hledßnφ jednoduÜÜφch algoritm∙ a v tomto p°φpad∞ se nejΦast∞ji pou₧φvß prßv∞ stφnovßnφ.
Podstata stφnovßnφ spoΦφvß v tom, ₧e se v²poΦet osv∞tlenφ provßdφ pouze pro n∞kterΘ d∙le₧itΘ body objektu a tyto hodnoty se n∞jak²m zp∙sobem distribuujφ na jeho zb²vajφcφ Φßsti. V poΦφtaΦovΘ grafice se dnes pou₧φvajφ v podstat∞ Φty°i druhy stφnovßnφ:
* konstantnφ stφnovßnφ (flat shading),
* Gouraudovo stφnovßnφ (Gouraud shading) neboli interpolace barvy,
* Phongovo stφnovßnφ (Phong shading) neboli interpolace normßly,
* V²poΦet osv∞tlenφ na ·rovni pixelu.
Uva₧ujme dßle troj·helnφk (pro rychlΘ zobrazovßnφ se geometrie objekt∙ aproximuje sφtφ troj·helnφk∙) zadan² vrcholy a p°edpoklßdejme, ₧e v nich znßme normßlovΘ vektory.
Konstantnφ stφnovßnφ p°i°azuje celΘmu troj·helnφku jedinou barvu na zßklad∞ hodnoty v jednom z vrchol∙, tak₧e se v²poΦet osv∞tlenφ provßdφ pro ka₧d² troj·helnφk jen jednou. Tento postup je v²poΦetn∞ nejmΘn∞ nßroΦn², ale na p°echodech troj·helnφk∙ se objevujφ v²raznΘ hrany a objekt zφskßvß nerealistick² ploÜkov² vzhled.
U Gouraudova stφnovßnφ se barva vypoΦφtßvß ve vÜech t°ech vrcholech a zφskanΘ hodnoty se lineßrn∞ interpolujφ. V²sledkem je daleko realistiΦt∞jÜφ vzhled s vyhlazen²mi p°echody mezi sousednφmi troj·helnφky. Gouraudovo stφnovßnφ mß jednu nev²hodu, pro kterou se n∞kdy pou₧φvß stφnovßnφ Phongovo. Gouraudov²m stφnovßnφm vypoΦφtßme barvu ve dvou vrcholech a interpolujeme ji. Podle Phongova modelu by, vzhledem k poloze sv∞tla a pozorovatele, uprost°ed mezi uzly m∞lo dojφt k odlesku (zrcadlovΘmu odrazu). Vzhledem k tomu, ₧e barvu nepoΦφtßme pro ka₧d² bod, ale jen interpolujeme, k odlesku nedojde.
Tuto zßvadu ΦßsteΦn∞ °eÜφ Phongovo stφnovßnφ. Proto₧e nejnßroΦn∞jÜφ b²vß v²poΦet normßlovΘho vektoru, pokouÜφ tento problΘm °eÜit tak, ₧e interpoluje normßlu mezi dv∞ma uzly a toto p°iblφ₧enφ pou₧φvß k v²poΦtu osv∞tlenφ. Je nutnΘ podotknout, ₧e Phongovo stφnovßnφ je v²poΦetn∞ daleko nßroΦn∞jÜφ ne₧li stφnovßnφ Gouraudovo p°edevÜφm proto, ₧e se rovnice Phongova osv∞tlovacφho modelu vypoΦφtßvajφ pro vÜechny body objektu.
Stφnovßnφ na ·rovni pixelu je vlastn∞ v²poΦet p°esnΘho osv∞tlenφ pro ka₧d² pixel. Nev²hodou je, ₧e se musφ n∞kde udr₧ovat normßlovΘ vektory pro ka₧d² bod.
Komprese textur S3
V originßlnφm algoritmu musφ b²t textura reprezentovßna v ÜestnßctibitovΘ reprezentaci RGB565, tj. p∞t bit∙ pro Φervenou slo₧ku, Üest pro zelenou a p∞t pro modrou. Zelenß slo₧ka mß k dispozici nejvφce bit∙, a je tedy reprezentovßna nejp°esn∞ji, proto₧e lidskΘ oko je na tuto barvu nejvφce citlivΘ. Varianty tΘto kompresnφ metody, nap°φklad od 3dfx, dovolujφ i jinΘ reprezentace, princip je vÜak stejn², i kdy₧ jmΘno je jinΘ.
Prvnφm krokem komprese (viz obrßzek) je rozd∞lenφ obrßzku na dla₧dice sklßdajφcφ se ze 4 x 4 pixel∙. Ka₧d² pixel je potom zak≤dovßn pouze do dvou bit∙ nßsledujφcφm zp∙sobem:
V ka₧dΘm Φtverci se naleznou dv∞ nejtypiΦt∞jÜφ barvy. Ob∞ se pak zak≤dujφ jako dvoubitovß informace, jedna jako 11 a druhß jako 00. Pro ob∞ tyto barvy se uschovß i jejich p°esnß hodnota RGB v ÜestnßctibitovΘm modu RGB565. Ostatnφ pixely z tohoto Φtverce se zak≤dujφ jako dvoubitovß informace podle svΘ barvy tak, ₧e se barva mezi extrΘmnφ 00 a 11 lineßrn∞ interpoluje. Prßv∞ lineßrnφ interpolace zavßdφ do tohoto algoritmu ztrßtu informace. Pouze dva pixely z Üestnßcti jsou reprezentovßny p°esn∞ a zb²vajφcφ jsou odhadnuty. Samoz°ejm∞ je zde i podstatnß ztrßta barevnΘ informace, proto₧e umo₧≥ujeme pouze Φty°i barvy v ka₧dΘm Φtverci. Jeliko₧ vÜak odhadujeme v₧dy pouze Φtrnßct pixel∙, je tato ztrßta vizußln∞ p°ijatelnß.
Jak je to s velikostφ zßznamu obrazu? V p∙vodnφm Φtverci bylo 4 x 4 Üestnßctibitov²ch pixel∙, celkem tedy 4 x 4 x 16 = 256 bit∙. Po kompresi tak zφskßme 2 x 16 bit∙ pro extrΘmnφ hodnoty a 16 x 2 bity pro pixely vypoΦφtßvanΘ, celkem tedy 64 bit∙. V²sledek je ze z°ejm²ch p°φΦin d∞liteln² osmi. V²sledn² obrßzek mß tedy pouze neuv∞°iteln²ch 25 % velikosti obrßzku p∙vodnφho.
Dekomprese je snadnß. Pro ka₧d² Φtverec 4 x 4 pixel∙ se nejprve p°eΦte tabulka s p°esn∞ reprezentovan²mi barvami a barvy pro vÜechny dvojice bit∙ mezi 00 a 11 se z nich urΦφ lineßrnφ interpolacφ. Celou tuto zßle₧itost lze samoz°ejm∞ snadno °eÜit hardwarov∞. Celß kompresnφ metoda by samoz°ejm∞ nebyla k niΦemu, kdyby programßto°i nem∞li mo₧nosti ji vyu₧φt v existujφcφch standardech pro rychlΘ zobrazovßnφ. Tato technika byla p°ijata jak do DirectX, tak do OpenGL.
Nutno °φci, ₧e kvalita komprimovan²ch obrßzk∙ je velmi vysokß. Na fotografie Φi na obrßzky obsahujφcφ pom∞rn∞ velk² Üum je vynikajφcφ. Nepoda°ilo se mi nikde najφt podstatnou vizußlnφ degradaci, i kdy₧ jsem obrßzky zkoumal dosti peΦliv∞. Pokud bychom zm∞°ili p°esnou chybu originßlu a komprimovanΘho obrazu, nap°φklad RMS, patrn∞ by se jednalo o p°ekvapiv∞ vysokΘ Φφslo. LidskΘ vnφmßnφ je vÜak tolerantnφ k Üumu a prßv∞ systematickΘ chyby jsou touto metodou zavßd∞ny do obrazu minimßln∞. Metoda samoz°ejm∞ vnßÜφ urΦitou degradaci do obraz∙ obsahujφcφch tenkΘ hrany, vÜechny pravidelnΘ vzory a samoz°ejm∞ obrßzky syntetickΘ. Interpolacφ m∙₧e dojφt k tomu, ₧e nap°φklad Φßra jdoucφ p°es r∙znΘ dla₧dice mß na nich vypoΦφtßnu i r∙znou barvu a ₧e tak dojde k jejφmu poniΦenφ. Tento jev demonstruje obrßzek. P°i kritizovßnφ tΘto metody je vÜak nutnΘ mφt na pam∞ti, k Φemu je urΦena. Jejφm cφlem nenφ fungovat jako standard pro reprezentaci obraz∙, ale slou₧φ pro mapovanφ textur. Na pohybujφcφm se objektu tento defekt patrn∞ nezaregistrujeme.
Hrbolatß textura (bump texture)
V poΦφtaΦovΘ grafice hraje klφΦovou ·lohu kolmice k povrchu objektu (normßla, normßlov² vektor), kterß mß zcela zßsadnφ vliv p°i v²poΦtu osv∞tlenφ vyÜet°ovanΘho bodu. Z polohy pozorovatele, z polohy sv∞tel a ze sm∞ru kolmice k povrchu v urΦitΘm bod∞ lze vypoΦφtat barvu tohoto bodu, vr₧enΘ stφny aj. Zm∞nou sm∞ru normßlovΘho vektoru zφskßme tzv. hrbolatou texturu (bump texture, bump mapping). Jak je asi z°ejmΘ, Φφm je povrch objektu hrbolat∞jÜφ, tφm komplikovan∞ji se m∞nφ sm∞r normßly mezi dv∞ma sousednφ body.
Hrbolatou texturu tedy zφskßme tak, ₧e p°i v²poΦtu osv∞tlenφ objektu zm∞nφme sm∞r normßly k povrchu, jako by se jednalo o hrbolat² povrch. Textura tedy v tomto p°φpad∞ neurΦuje ani barvu, ani pr∙hlednost, ale Φlenitost povrchu. HrbolatΘ textury se prozradφ na okrajφch objekt∙, na kterΘ jsou naneseny. Nap°φklad koule, kterß vypadß jako divoce Φlenitß, nemß obrys odpovφdajφcφ drsnΘmu povrchu, ale hladce kruhov², jako by byla zcela hladkß. To je patrnΘ i na stφnu, kter² je objektem vrhßn.
Podkladem pro hrbolatou texturu m∙₧e b²t obyΦejn² obrßzek, jeho₧ odstφny chßpeme jako popis Z sou°adnic (podobn∞ jako vrstevnice na map∞). N∞kdy se takov²mto texturßm °φkß t°φrozm∞rnß vytlaΦenß textura (emboss texture). HrbolatΘ textury jsou velice populßrnφ a pro svou jednoduchost se velmi Φasto pou₧φvajφ. Jejich nev²hodou je, ₧e p°i velikΘm zv∞tÜenφ p∙sobφ nep°irozen∞. Jejich v²hodou naopak je, ₧e jde o efektivnφ a jednoduchou metodu, kterß je v souΦasnΘ dob∞ standardnφ v²bavou hardwarov²ch akcelerßtor∙.
Antialiasing
PoΦφtaΦovß grafika pracuje s diskrΘtnφm obrazem, kter² je slo₧en z pixel∙. Dochßzφ tedy k tomu, ₧e se nenulov²m ploÜkßm û pixel∙m û p°i°azuje konstantnφ barva obyΦejn∞ na zßklad∞ hodnoty jedinΘho bodu z reßlnΘho sv∞ta. Tento proces (vzorkovßnφ) zavßdφ nep°esnosti, zp∙sobujφcφ jevy znßmΘ jako alias, k nim₧ dochßzφ zejmΘna u objekt∙, kterΘ jsou velikostφ srovnatelnΘ s pixelem. Tyto objekty, pokud se pohybujφ, jsou jednou vid∞t, a podruhΘ ne. Dochßzφ takΘ k "zubatosti" hran Φi k p°eruÜovßnφ tenk²ch Φar apod. Techniky, kterΘ se pokouÜejφ alias odstranit, se jmenujφ antialiasing a mohou pracovat v podstat∞ ve dvou re₧imech û s objekty nebo s celou scΘnou. Antialiasing objekt∙ û Φar, bod∙ a troj·helnφk∙ û mß zßkladnφ nev²hodu v tom, ₧e musφ udr₧ovat informace o scΘn∞. KonkrΘtn∞ se objekty musφ zobrazovat odp°edu ve sm∞ru pozorovatele. To je mimo°ßdn∞ nep°φjemnΘ, a proto se antialiasing objekt∙ pou₧φvß zcela v²jimeΦn∞.
Celoobrazovkov² antialiasing (Full Screen Antialiasing û FSSA) by se vlastn∞ m∞l jmenovat antialiasing scΘny. Na rozdφl od antialiasingu objekt∙ pracuje s celou scΘnou, se vÜemi objekty najednou (tedy ne s celou obrazovkou, ke kterΘ pat°φ nap°φklad i rßmeΦky oken).
O co v tΘto metod∞ jde? Alias vznikß podvzorkovßnφm spojitΘ informace, tedy nedostatkem informace. Jedinß cesta, jak ho odstranit Φi snφ₧it, je dodat informaci do signßlu. Toho lze docφlit pouze p°esn∞jÜφm zobrazovßnφm, co₧ je samoz°ejm∞ Φasov∞ nßroΦnΘ. Pro FSAA se pou₧φvajφ dv∞ techniky, kterΘ jsou zalo₧eny na tzv. vzorkovßnφ s vyÜÜφ frekvencφ (supersampling).
Prvnφ spoΦφvß v zobrazenφ celΘ scΘny ve vyÜÜφm rozliÜenφ a v jejφm nßslednΘm zmenÜenφ. ObyΦejn∞ se pou₧φvß rozliÜenφ, kterΘ je dvakrßt (4 x, 8 x, ...) vyÜÜφ, proto₧e se zmenÜenφ provßdφ jednoduÜe pr∙m∞rovßnφm skupiny pixel∙. Nev²hodou tΘto techniky je, ₧e se pravidelnΘ vzory û alias û stejn∞ objevφ, ale na vyÜÜφch frekvencφch. Touto cestou jde nap°φklad NVIDIA.
Jinou technikou je pou₧itφ nßhodnΘho vzorkovßnφ s vyÜÜφ frekvencφ (stochastic/random supersampling). Princip tkvφ v tom, ₧e se scΘna vykreslφ z jednoho pohledu v po₧adovanΘm rozliÜenφ n∞kolikrßt, avÜak poka₧dΘ se s nφ malinko pohne. Posunutφ vÜak musφ b²t minimßlnφ, typicky uvnit° jednoho pixelu (proto se jφ n∞kdy nep°esn∞ °φkß subsampling). Pro posunutφ se pou₧φvß technika zvanß rozt°esenφ (jittering). ScΘna se tedy zobrazφ n∞kolikrßt, ale tato informace se musφ n∞kde uchovat. Prßv∞ pro tuto techniku se v²teΦn∞ hodφ akumulaΦnφ buffer (u 3dfx se mu z nepochopiteln²ch p°φΦin °φkß T-buffer). V tΘto pam∞ti se zobrazovanß informace jednoduÜe posbφrß, spoΦφtß se pr∙m∞r a nakonec se vÜe zobrazφ. V²sledkem je kvalitn∞jÜφ obraz. Vynikajφcφ na tΘto tΘm∞° patnßct let starΘ metod∞ je, ₧e p°evßdφ alias na Üum, kter² je vizußln∞ mnohem mΘn∞ patrn² ne₧ pravidelnΘ vzory. Nev²hodou je, ₧e se scΘna musφ zobrazit n∞kolikrßt. UrΦit∞ vÜak lze v hardwarov²ch akcelerßtorech vyu₧φt faktu, ₧e data jsou ji₧ uvnit°, a tak lze vÜe v²teΦn∞ urychlit.
Pokud ob∞ zmφn∞nΘ metody srovnßme, prvnφ z nich je obyΦejn∞ rychlejÜφ, i kdy₧ neposkytuje tak hezkΘ v²sledky jako druhß.