Technika 3D: Pixel shadery i pro běžné uživatele |
autor: Vrtal David , publikováno 28.4.2003 |
Obsah minulého článku, který jsem publikoval na PCtuningu nebyl zvolen zrovna nejvhodněji. Podle reakcí čtenářů byl článek málo vysvětlující a objevilo se v něm jen velmi málo nejasných příkladů, které by pojem pixel shader osvětlily i bežnému uživateli. Protože PCtuning je server, který se nezaměřuje jen na čtenáře, kteří jsou více ci méně pokročilí v hardwarové problematice, ale je určen i bežným uživatelům, rozhodl jsem se tuto problematiku znovu otevřít. Berte tedy tento článek jako jakýsi předstupeň k článku předchozímu. Článek je určen predevším těm méně 3D-hardwarově zdatným čtenářum, kteří by se také rádi něco málo o problematice týkající se grafických karet dozvěděli.
Poznámka: V první části se podíváme na to, co vlastně pixel shader je, v dalších (už komentovaných) příkladech si ukážeme, co takový pixel shader dovede v praxi.
Tolik na úvod a nyní se již podíváme na vlastní problematiku pixel shaderů. Napřed se ale podíváme na příklad scény, která je renderována použitím pixel shaderů. Na scéně je prezentováno vytvoření přirozených světelných efektů.
Příklad scény renderované s použitím pixel shaderů
Pixel shader je podobně jako vertex shader plně programovatelná jednotka, která je součástí architektury jádra grafické karty. Jejím hlavním úkolem je provádět matematické operace s takzvanými pixely. Z literatury jsem si vypůjčil fundovanou definici toho, co je přesně pixel shader. Zde je tato přesná definice:
Pixel shader je malý program, který zpracovává pixely a vykonává se v GPU - Graphics Processing Unit.
Bližší pohled na pixel shadery
Tolik k definici. Nevím jak moc je tato definice pochopitelná a proto si pojďme k tomuto tématu říci něco bližšího. Jak asi víte, jakákoliv renderovaná trojrozměrná scéna se skládá z takzvaných pixelů. V moderních trojrozměrných hrách se setkáváme s objekty, které jsou tvořeny z těchto základních stavebních prvků. Čím větší počet pixelů objekt obsahuje, tím větší je jeho detailnost. Bohužel se vzrůstajícím počtem pixelů roste také náročnost na hardwarové vybavení počítače, na kterém je hra provozována.
Abychom mohli takovéto náročné scény vytvářet, potřebujeme nástroj, který nám umožní provádět s pixely předem definované operace a na základě výsledků těchto operací vyrenderovat požadovanou scénu. No a tímto nástrojem je právě pixel shader. Pokud si předchozí definici, kterou jsem přebral z literatury trochu upravím, mohla by nakonec znít asi takto:
Pixel shader je součást grafické karty, která slouží k provádění transformačních operací se základními stavebními jednotkami každé trojrozměrné scény, takzvanými pixely.
Nyní bychom si měli vysvětlit jak souvisejí již představené vertex shadery s právě popisovanými pixel shadery. Pro tento účel nám poslouží následující obrázek pipeline grafické karty:
Poznámka: Nijak se tohoto schématu nelekejte a nenechte se jím odradit od dalšího čtení. Schéma jsem na toto místo vložil proto, že se mi bude hodit v následujícím výkladu.
Pokud se na toto schéma podíváte trochu podrobněji a budete postupovat od shora dolů, všimnete si, že na pipeline se nachází nejprve vertex shader a teprve poté pixel shader. Toto je účel, proč jsem schéma na toto místo vložil. Je důležité si uvědomit, že pixel shader se vždy nachází až za vertex shaderem. Z toho vyplývá, že ve většině případů potřebuje pixel shader ke své korektní funkci data zpracovaná vertex shaderem. Na oživení výkladu přikládám ilustrační obrázek. Je na něm vidět scéna vyrenderovaná pomocí pixel shaderů. Tato scéna demonstruje možnost dosažení realistických efektů. Zobrazované ovoce se přibližuje skutečnosti s dostatečnou přesností a výsledná scéna je téměř fotorealistická.
Realistická scéna renderovaná pomocí pixel shaderů
Pixel shader operuje s jednotlivými pixely, jež se skládají z jednotlivých vertexů. Na základě informací o jednotlivých vertexech provádí transformační operace s celým pixelem. V mnoha případech se dá mluvit o tom, že pixel shadery jsou řízeny pomocí vertex shaderů. Například při výpočtu takzvaného per-pixel lightning, což je případ osvětlení jednotlivých pixelů, potřebuje pixel shader znát orientaci jednotlivých vertexů, orientaci světelného vektoru a v mnoha případech i orientaci vektoru pohledu. No a právě informace o jednotlivých vertexech mu dodá vertex shader. V následujících dvou kapitolách následuje sada příkladů, která by vám měla ozřejmit pojem pixel shader ještě o něco lépe.
{mospagebreak title=První sada příkladů}V předchozích dvou kapitolách jsme si snad dostatečně přesně vysvětlil co je to vlastně pixel shader. Účelem této části je předvést vám na několika komentovaných příkladech co vlastně takový pixel shader dovede.
První příklad je scéna renderovaná s použitím pixel shaderů integrovaných v grafické kartě Matrox Parhelia. Scéna předvádí obrovské možnosti pixel shaderů pro renderování trojrozměrných scén, které zobrazují okamžiky z reálného života. Scéna zobrazuje mořské ryby v jejich přirozeném prostředí. Na rybě, která se nachází v popředí scény jsou dobře vidět realistické světelné efekty. Dále je zde vidět velice pěkně vymodelovaný model kusu skály, na kterém jsou vidět jednak světelné efekty a také hra stínu. Tento typ efektů je velice dobře použitelný v jakémkoliv typu her. Umožňuje vytvářet realistické virtuální světy do kterých se potom budou umisťovat postavy a objekty, jež ve hře figurují.
Podmořská scéna renderovaná pomocí pixel shaderů
Druhý příklad -pro tento příklad jsem si opět vypůjčil obrázek vygenerovaný pomocí pixel shaderů obsažených v grafické kartě Matrox Parhelia. Na schématu pipeline grafické karty, které jsem uváděl v kapitole II, vidíte její jednotlivé části. Většina novějších grafických karet však nemá takovouto pipeline pouze jednu, ale má jich několik. Následující obrázek uvádí příklad, kdy by jsme nevystačili pouze s jednou pipeline. Je na něm zobrazena mořská ryba, jejíž realistický povrch je vytvořen spojením informací vytvořených jednotlivými pipeline. V následujícím seznamu jsou vysvětleny jednotlivé aplikované efekty:
- Normal -normální povrch
- Caustic -povrch s leptaným efektem
- Decal -povrch s obtiskovýn efektem
- Specular -povrch se zrcadlovým efektem
- Quad-textured rendering -renderování scény s použitím kombinace čtyřech různých textur
Scéna renderovaná spojením čtyřech druhů textur
Tato kapitola přinese další sadu příkladů objasňující další možnosti pixel shaderů.
Třetí příklad -tento příklad nám představí další sadu světelných efektů, které lze použít na různé povrchy. Je zde použita sada tří obrázků sportovního auta na které jsou aplikovány různé efekty vytvořené použitím pixel shaderů. První dva obrázky ukazují model na který byly aplikovány efekty využívající odraz a lom světla.
Ukázka modelu auta z boku
Ukázka modelu auta zepředu
Poslední obrázek ukazuje spojení třech různých povrchů, jejichž vzájemným překrytím je dosaženo realistického povrchu karosérie automobilu. Druhy použitých povrchů jsou uvedeny v následujícím seznamu:
- Two tone paint -povrch s přechodem vytvořeným dvěma barevnými odstíny. Jedná se o obrázek umístěný v levém horním rohu.
- Sparkless -nejiskřící povrch. Jedná se o obrázek umístění v pravém horním rohu.
- Glass -skleněný povrch. Jedná se o povrch umístěný v levém dolním rohu.
- Final -finální povrch vytvořený kombinací předchozích třech povrchů. Jedná se o obrázek umístěný v pravém dolním rohu.
Kombinace třech povrchů pro dosažení finální efektu
Čtvrtý příklad -v tomto příkladu použijeme pro demonstraci technologické demo od Nvidie, které ukazuje tři druhy efektů dosažitelných použitím pixel shaderů. Všechny tři typy efektů budou demonstrovány na modelu chameleona. Jedná se o velice hezký model reálného zvířete, který se kvalitou svého zobrazení přibližuje realitě. První obrázek nám představuje efekt nazvaný odraz světla. Vidíte, že v tomto případě povrch těla chameleona kontrastně vystupuje vůči pozadí.
Efekt nazvaný odraz světla aplikovaný na model chameleona
Druhý obrázek představuje efekt nazvaný lom světla. V tomto případě je povrch těla chameleona téměř neviditelný a živočich téměř splývá se svým okolím.
Efekt nazvaný lom světla aplikovaný na model chameleona
Na posledním obrázku je předveden efekt stínu. V tomto případě je chameleon velice kontrastní vůči svému pozadí.
Efekt nazvaný stín aplikovaný na model chameleona
Na této sadě obrázků jsme si názorně předvedli, že pixel shadery se dají použít nejen pro zobrazení různých scén s technickými zařízeními, ale že je možno pomocí nich vytvářet i scény zobrazující působivé přírodní scenérie, se kterými se v našem okolí často setkáváme. Tím uzavírám tyto dvě kapitoly věnované demonstračním příkladům. V následující kapitole se souhrně podíváme na výčet jednotlivých možností pixel shaderů.
{mospagebreak title=Závěrečné zhodnocení}Jak již bylo několikrát zmíněno v předchozím textu, hlavní oblastí použití pixel shaderů je tvorba světelných efektů. Aplikace a použití světelných efektů při renderování trojrozměrných scén jste si mohli prohlédnout v kapitolách číslo III a IV. Z příkladů je doufám dostatečně patrné, že se dá použitím těchto efektů dosáhnout opravdu realistických scén. Kvalita efektů se v mnoha případech blíží kvalitě fotorealistické.
Hlavní oblastí použití scvětelných efektů jsou především moderní 3D hry. Zde jsou pomocí těchto efektů vytvářena realistická herní prostředí a realistické objekty, které se v těchto prostředích nacházejí. Tím se výrazně zvyšuje kvalita grafické stránky hry a je nám umožněno lépe se ponořit do prezentovaného děje.
Druhou oblastí ve které se s výhodou používají pixel shadery je práce se stíny. Rovněž aplikaci stínových efektů jste si měli možnost prohlédnout v kapitolách III a IV. Jejich použitím se scény stávající ještě více realistické. Pokud zvolíme v jakékoliv hře vhodnou kombinaci světla a stínu, dostáváme scény blížící se reálnému světu.
Poslední výhoda pixel shaderů má dost podstatnou spojitost s celkovým výkonem vaší počítačové sestavy při hraní her. Pokud by grafické karty neměly vestavěnou hardwarovou podporu pixel shaderů, veškeré výpočetní operace spojené s transformováním scén by byly prováděny vaším procesorem. Tento stav by při kvalitě grafiky, která je v dnešních hrách používána, byl výkonově neúnosný. Docházelo by k enormnímu zatěžování procesoru a ke znatelnému snižování výkonu při hraní hry. Proto se zabudováním hardwarové podpory pixel shaderů do jádra grafické karty přenesly tyto operace právě na toto grafické jádro. Tím se výrazně snížilo zatížení procesoru a dosáhlo se tím lepšího výkonu celé sestavy.
Tím bych asi tuto část našeho seriálu o technologiích použitých v grafických kartách ukončil. Doufám, že jsem článek napsal dostatečně srozumitelně i pro běžné uživatele. Dále také doufám, že článek podává sdělované informace přijatelnou formou. Nejdříve jsem chtěl dát do článku podrobný výpis jednotlivých možností pixel shaderů, ale nakonec jsem od toho upustil. Vysvětlení těchto efektů by vydalo na další samostatný článek a pokud bych uvedl jen jejich výčet, nic moc by vám to neřeklo. Na tyto možnosti se podíváme v některém z následujících dílů.
Redakce si vyhrazuje právo odstranit neslušné a nevhodné příspěvky. Případné vyhrady na diskuze(zavináč)pctuning.cz
tys to zVrtal autore. pls stop this neverending serie
Mozno sa mylim, ale toto je pravdepodobne nezmysel :-)) Som nevedel, ze pixely sa skladaju z vertexov. Dalej na obrazkoch auta je sklo rovnake pri kazdom efekte... To znamena, ze ked sa auto otaca, tak pravdepodobne tam ostanu tie "odrazy" bez zmeny(kedze realne odrazy by mal zaobstarat iba ten glass efekt), nemylim sa?
1."Jak asi víte, jakákoliv renderovaná trojrozměrná scéna se skládá z takzvaných pixelů."
-Pixel je zkratka z "picture element" a je to jeden bod 2D obrazu a s 3D to nema nic spolecneho a rozhodne se z nich neskladaji objekty
-Pixel je vysledna barva vypoctu v konkretnim miste obrazu. Objekty se tedy z nich muzou "skladat" leda az na obrazovce.
-Objekty se skladaji z vrcholu (vertexu), pripadne voxelu
2."Pixel shader operuje s jednotlivými pixely, jež se skládají z jednotlivých vertexů"
-Naprosty nesmysl, pixel se z zadnych vertexu (cesky vrcholu) nesklada
3."Následující obrázek uvádí příklad, kdy by jsme nevystačili pouze s jednou pipeline"
-Pocet pipelines nema s vyslednym obrazem nic spolecneho, jde pouze o rychlost. Kazda pipeline je stejna a pracuje s jinym pixelem.
4."Normal -normální povrch"
-Zadny normalni povrch, ale normalova textura (normala je kolmice na povrch), ktera urcuje jemne deformace.
5."Pokud by grafické karty neměly vestavěnou hardwarovou podporu pixel shaderů, veškeré výpočetní operace spojené s transformováním scén by byly prováděny vaším procesorem"
-Pokud graficka karta nepodporuje pixel shadery, zadny procesor je nemuze emulovat v realnem case.
-Jedina moznost je kompletni sofwarovy rendering (rychlosti ~30s/frame)
-CPU muze delat transformace, ale pouze s vrcholy. Tedy muze nahradit Vertex shader.
-Slovo transformace se v souvislosti s pixely nepouziva.
Ta textura s lesklosti se nazyva "Gloss map" a neni menena pixel shaderem. Ten meni pouze hodnotu ziskanou z teto textury.
treba tady
http://www.3drender.com/light/caustics.html
nebo treba tady
http://www.robinwood.com/Catalog/Technical/TipsPages/Caustics.html
Třeba to tak autor zamýšlel.. :-)
Některé příspěvky v diskuzi toho říkají mnohem více než celý článek a to nemluvím o tom, že opravují chyby. Někdy jsem rád, že tomu opravdu nerozumím ...
jsem fakt dobry, ze jsem na to prisel
rimmer
Je to strasliva nezodpovednost psat takove dezinformace na Zive. Je to o to strasnejsi kdyz je o teto problematice tak malo clanku v cestine. Kazdy zacatecnik po tomhle ceskem clanku skoci jak slepice po flusu a zacne svoje vedomosti budovat na spatnem zakladu.
Jeste jednou diky za tvou vseobjasnujici reakci a doufam ze i zacatecnici pochopi jak se veci ve skutecnosti maji.
Ten kdo tomu nerozumi vezme za vdek podanym vysvetlenim, protoze je pomerne spravne (a i kdyby nebylo, tak prevzaty obrazky postupu vykreslovani sceny sou presny urcite). Odbornikum to vadit taky nemusi, protoze ti vedi, jak to je a nejaky chybicky si muzou domyslet (3D grafici vedi...)
I pres chyby, ktery tento clanek obsahuje ho musim pochvalit, protoze ostatni HW servery sou tak maximalne schopny napsat "podporuje Pixel Shader" - tam autor uz ocividne vi kulovy o tom, co to vubec je.
A k jinymu ohlasu, ze by mel autor radsi psat o jinych novinkach - libi se mi, ze se nekdo POKUSIL neco takovyho napsat, protoze nejak nemam rad, kdyz se na 6 server po sobe dozvim zarucene nejcerstvejsi informaci o uvedeni Athlon XP 3000+. K cemu je mi to cist 6x ???
Moc lidi nema odvahu psat "vysvetlujici" clanky - je to mnohem tezsi nez psat obycejny suchy zpravy. A i pres mnoho chyb se musi snahat ocenit.
Takze jen tak dal, ale bez chyb!
Pravopisné chyby, o kterých se tady někteří rozepisují, jsou v odborných článích detaily, kterým se dá spíš zasmát, než je kritizovat.
Taky mi nevadí, že jsou články příliš pro amatéry nebo naopak příliš pro odborníky, ale ať jsou na jekékoli úrovni, nesmí být s chybnými nebo zavádějícími informacemi.
Jediná nevýhoda je: celkem drtivý dopad na výkon i když samozřejmě záleží na složitosti scény a potom se taky nemusí renderovat každičký detail, že. Obzvlášť, když cube mapy jsou většinou něco jako 6x256x256 nebo při nejlepším 6x512x512.
Otázkou je, zda a jak jí pak právě pixel shader použije. On jí totiž může s klidem ignorovat a plácnout tam texturu, která bude na nějakém světle nezávislá. Nebo to mezi sebou může vynásobit (diffuse lighting), sečíst (specular lighing) atp. Záleží jen na tvůrcích.
Snad jsem ti to trochu objasnil.