Technika 3D: Úvod do Pixel Shaderů |
autor: Vrtal David , publikováno 9.4.2003 |
V dnešní době došlo k masivnímu rozšíření počítačů do všech oblastí lidské činnosti. Setkáváme se s nimi nejen při komerčním použití, ale i ve většině domácností. Každý počítač se skládá z několika hardwarových komponent, přičemž některé jsou pro výkon počítače důležité více a některé méně. Jednou z nejdůležitějších komponent je grafická karta. Její správná volba se dá provést podle několika kritérií. Jedná se například o to k jakému účelu se bude počítač používat, kolik jsme ochotni do něj investovat, zda kupujeme sestavu předem sestavenou nebo zda si počítač stavíme sami, atd. Mnozí z uživatelů však vůbec netuší z jakých částí se jejich grafická karta vůbec skládá, k jakému účelu se dají její jednotlivé části použít a jakým stylem s těmito částmi herní a softwaroví vývojáři pracují.
V architektuře grafické karty se nyní, kromě grafického čipu a pamětí, nacházejí dvě programovatelné jednotky nazvané vertex a pixel shadery. Běžný i trochu technicky zdatnější uživatel však vůbec nemá ponětí, že jeho grafická karta něco takového obsahuje a pokud ano, tak neví jaký je jejich účel a použití. Účelem tohoto článku je seznámit vás trochu blíže s účelem první z těchto dvou částí grafické karty, takzvaných pixel shaderů. Jejich umístění v architektuře grafického čipu je patrné z obrázku.
Blokové schéma grafického čipu
Chtěl bych, aby jste po přečtení tohoto článku měli alespoň základní tušení o co u této technologie jde a proč se jí dnes při technické specifikaci nových grafických čipů věnuje taková pozornost. Chci vás upozornit, že se v tomto případě nejedná o přehnané působení marketingových oddělení výrobců a distributorů grafických karet, ale že tato jednotka má opravdu veliký význam pro nasazení grafické karty v různých typech aplikací. Efekty, kterých lze použitím pixel shaderů dosáhnout jsou vidět na obrázcích.
Ukázka možností pixel shaderů verze 2.0 v 3Dmark 03
{mospagebreak title=Základní popis funkcí pixel shaderů }Pixel shader je jedna ze základních částí architektury grafického čipu. Jedná se o jednotku, která je plně programovatelná. Posupný vývoj přinesl několik generací této jednotky. Jednotlivými generacemi se zabývám v samostatném odstavci uvedeném níže. S jednotlivými generacemi se zvyšuje počet instrukcí, které můžeme pro tuto jednotku použít. Na diagramu vidíte paralelní uspořádání pipeline struktury aritmeticko logické jednotky pixel shaderu, takzvané ALU.
Paralelní uspořádání pipeline struktury aritmeticko logické jednotky
Pokud se na diagram podíváme podrobněji, jistě si všimnete toho, že na blokovém schématu jsou opravdu patrné dvě paralelně uspořádané větve. Větev na levé straně je na obrázku označená jako Vector pipe. Jedná se o vektorovou pipeline, která pracuje a operuje čistě s vektorovými daty. Vektorová data jsou často nazývána jako data barev. Z toho důvodu obsahují tři barevné kanály RGB, kde R (red) znamená barevný kanál pro červenou barvu, G (green) znamená barevný kanál pro zelenou barvu a B (blue) znamená barevný kanál pro modrou barvu. Větev na pravé straně je v diagramu označena jako Alpha pipe. Jedná se o skalární pipeline, která operuje s jednoduchými datovými hodnotami alfa. Tyto hodnoty najdete na diagramu pod označením A (alfa). Jedná se o takzvaný alfa kanál.
Nyní si podrobně popíšeme jednotlivé části nacházející na diagramu.
- Vstupní registry -na obrázku jsou označeny jako input register(s) . Jedná se o vstupní data obsahující informace o RGBA signálu.
- Komponenta pro kopírování -na obrázku je označena jako component copy . Jedná se o zdrojový selektor registru, který kopíruje data z jednoho kanálu do ostatních kanálů. Tato operace se běžně nazývá swizzling.
- Modifikování dat -na obrázku označeno jako modify data . Jedná se o takzvané zdrojové modifikátory registrů. Tyto modifikátory se používají ke změně hodnot čtených ze zdrojových registrů předtím, než dojde k běhu instrukcí. Modifikátory mohou být použity k nastavení rozsahu dat v registrech připravovaných pro instrukci. Mohou být použity pouze pro aritmetické instrukce. Nelze je použít pro instrukce adresující textury.
- Prováděcí instrukce -na obrázku je označena jako execute instruction . Používá se pro provádění aritmetických a texturově adresovaných operací s daty o pixelech. Pipes určené pro barevný kanal nebo pro alpha kanál nemohou běžet se stejnými instrukcemi ani nemohou používat stejné zdrojové registry.
- Modifikování výsledku -v diagramu je označeno jako modify result . Je prováděno pomocí takzvaných instrukčních modifikátorů. Tyto modifikátory slouží ke změně výstupních dat instrukcí ještě předtím, než jsou zapsány do výstupních registrů. Mohou být použity pro násobení nebo dělení výsledků faktorem dva a dále pro sevření výsledku nacházejícího se mezi nulou a jedničkou. Instrukční modifikátory jsou aplikovány až po běhu instrukce, ale před tím než je výsledek zapsán do cílového registru. Můžeme použít instrukční modifikátor tří typů. Jejich seznam je uveden níže.
- Modifikátor pro násobení -po načtení dat z registrů násobí tato vstupní data faktorem dva.
- Modifikátor pro dělení -po načtení dat z registrů dělí tato vstupní data faktorem dva.
- Saturační modifikátor -slouží k sevření rozsahu hodnot v registrech nacházejících se mezi nulou a jedničkou.
- Modifikátor pro násobení -po načtení dat z registrů násobí tato vstupní data faktorem dva.
- Maskování -v článku nazvané jako masking . Pro tuto operaci se používají takzvané masky pro zápis do registru. Jejich účelem je kontrolovat, které komponenty cílového registru byly zapsány pomocí instrukcí. Dále kontrolují, které kanály (red , green, blue, alpha) byly v cílovém registru zaktualizovány.
- Výstupní registr -v diagramu označený jako output register . Nachází se na konci shaderu. Obsahuje v sobě informace o konečné barvě.
Za období po které se pixel shadery objevují jako standardní součást grafickýh karet se vyvinuly již tři generace. Každá z generací obsahuje ještě nějaké vývojové stupně. Přehled všech generací pixel shaderů včetně jejich popisu je uveden v následujícím seznamu.
-
Pixel shadery generace 1.X (Radeon 8500/GeForce 3)
- První vývojový stupeň 1.1
- Druhý vývojový stupeň 1.2
- Třetí vývojový stupeň 1.3
- Čtvrtý vývojový stupeň 1.4
- Pixel Shadery generace 2.X (Radeon 9500/9700)
- Pixel shadery generace 2.X Extended (GeForce FX)
- Pixel shadery generace 3.X (R400)
V dalším textu se povádíme na rozdíly mezi jednotlivými generacemi pixel shaderů. Budu se věnovat pouze základním změnám, neboť Podrobnější popis by byl již nad rámec tohoto článku.
První generace označená 1.X
Nejdříve se podíváme na první generaci pixel shaderů označovanou jako 1.X. V následujícím krátkém seznamu si uvedeme maximální počty použitelných instrukcí. Typickckým představitelem karet s pixel shadery verze 1.1-1.2 jsou grafické karty s čipy Geforce 3, Geforce 3 Ti 200, Geforce 3 Ti 500 a Radeon 7500. Pixel shadery 1.3 používají grafické karty s čipy Geforce 4 Ti 4200, Geforce 4 Ti 4400, Geforce 4 Ti 4600, Geforce 4 Ti 4800 a Geforce 4 Ti 4800 SE. Pixel shadery 1.4 používá například grafická karta Radeon 8500.
- Verze 1.1 - 8 instrukcí.
- Verze 1.2 - 12 instrukcí.
- Verze 1.3 - 12 instrukcí.
- Verze 1.4 - 14 instrukcí.
V této verzi byla vytvořena celá řada nových instrukcí. Jedná se o tyto skupiny instrukcí:
- Instrukce pro nastavování-def, ps.
- Aritmetické instrukce-add, cmp, cnd, dp3, dp4, lrp, mad, mov, mul, nop, sub.
- Makra-exp, frc, log, m3x2, m3x3, m3x4, m4x3, m4x4.
- Texturové instrukce-tex, texbem, texbeml, texcoord, texcrd, texdepth, texdp3, texdp3tex, texkill, texld, texm3x2depth, texm3x2pad, texm3x2tex, texm3x3, texm3x3pad, texm3x3tex, texm3x3spec, texm3x3vspec, texreg2ar, texreg2gb, texreg2rgb.
Dále byly přidány nové registry: constant, temporary, texture, color.
A nakonec byly přidány nové modifikátory: instruction modifiers, register modifiers, source register selectors, register write masks.
Druhá generace označená 2.X
V této verzi došlo k podstatným změnám. Byly vytvořeny nové typy instrukcí a některé staré typy byly naprosto zrušeny. Maximální počet instrukcí v této verzi je 96. Z toho může být 64 instrukcí aritmetických a 32 instrukcí texturových. Podrobný výpis změn v instrukcích je uveden v následujícím seznamu. Tuto verzi pixel shaderů používají grafické karty Radeon 9700 a Radeon 9700 Pro.
- Instrukce pro nastavování-žádné změny.
- Aritmetické instrukce-žádné změny.
- Makra-žádné změny.
- Texturové instrukce
- Byly odstraněny instrukce-tex, texbem, texbeml, texcoord, texcrd, texdepth, texdp3, texdp3tex, texm3x2depth, texm3x2pad, texm3x2tex, texm3x3, texm3x3pad, texm3x3tex, texm3x3spec, texm3x3vspec, texreg2ar, texreg2gb, texreg2rgb.
- Byly přidány instrukce-texldb, texldp.
- Byly odstraněny instrukce-tex, texbem, texbeml, texcoord, texcrd, texdepth, texdp3, texdp3tex, texm3x2depth, texm3x2pad, texm3x2tex, texm3x3, texm3x3pad, texm3x3tex, texm3x3spec, texm3x3vspec, texreg2ar, texreg2gb, texreg2rgb.
Dále byly přidány nové registry: constant float, sampler, output color, output depth.
A nakonec byly přidány nové modifikátory: negate, partial precision, saturate.
Druhá generace rozšířená označená 2.X Extended
V této verzi došlo k podstaným změnám v oblasti instrukcí. Byly vytvořeny nové kategorie instrukcí, které se nenacházejí v předchozích verzích. Minimální počet instrukcí v této verzi je 96. Maximální počet instrukcí v této verzi je 512. Podrobný výpis změn v instrukcích je uveden v následujícím seznamu. Tuto specifikaci používají grafické karty Geforce FX 5800 a Geforce FX 5800 Ultra.
- Instrukce pro nastavování - žádné změny.
- Aritmetické instrukce - žádné změny.
- Makra - žádné změny.
- Instrukce pro kontrolu statického toku - call, callnz, else, end, endif, endloop, endrep, if, label,loop, rep, ret.
- Instrukce pro kontrolu dynamického toku - break, breakc, ifc
- Gradientní instrukce - dsx, dsy.
- Texturové instrukce -texldd.
- Predikace - setp instruction, p# register.
Dále byly přidány nové registry: constant integer, constant Boolean, loop counter, predicate.
A nakonec byly přidány nové modifikátory: arbitrary swizzle.
Třetí generace označená 3.X
V této verzi nedošlo k žádným podstatným změnám v oblasti instrukcí. Nebyly vytvořeny žádné nové kategorie instrukcí. Pouze došlo k rozšíření použitelného počtu instrukcí. Minimální počet instrukcí v této verzi je 512. Maximální počet instrukcí v této verzi je 32 768. Tato specifikace existuje zatím pouze ve vývojové podobě a zatím není obsažena v žádném hardwaru (plánuje se do R400). Vývojáři zatím mají možnost se specifikací pracovat a blíže se s ní seznamovat. Až dojde k jejímu začlenění do grafických karet, budou schopni pružně reagovat na nový hardware a vytvářet pro něj aplikace plně využívající přínosy této nové specifikace. Podrobný výpis změn v instrukcích je uveden v následujícím seznamu.
- Instrukce pro nastavování - žádné změny.
- Aritmetické instrukce - žádné změny
- Makra - žádné změny.
- Instrukce pro kontrolu statického toku - žádné změny.
- Instrukce pro kontrolu dynamického toku - žádné změny
- Gradientní instrukce - žádné změny.
- Texturové instrukce - žádné změny.
- Predikace - žádné změny.
Registry: beze změny.
A nakonec modifikátory: opět beze změny.
Závěr
Účelem tohoto článku bylo seznámit především běžné uživatele s tím co je to pixel shader. Doufám, že i pokročilí uživatelé si článek rádi přečtou a že z něj budou moci načerpat přínosné informace. Myslím si, že takovýchto článků není na českém intermetu mnoho a proto tedy doufám, že jsem alespoň trochu přispěl k rozšíření obzorů českých uživatelů internetu.
Redakce si vyhrazuje právo odstranit neslušné a nevhodné příspěvky. Případné vyhrady na diskuze(zavináč)pctuning.cz
Pěkný článek, ale opravdu z něj není jasné, na čem se pixel shadery podílí. (např. http://meshuggah.4fo.de/ShaderIntro.htm">http://meshuggah.4fo.de/ShaderIntro.htm) To by chtělo upřesnit a navíc porovnat obraz s využitím pixel shaderů a bez nich. Dále bych upřesnil jejich fyzické umístění, na začátku je napsáno, že existují vedle gpu a pamětí, dále je uváděno, že jsou základním prvkem architektury gpu - o tom by se také dalo polemizovat, jsou součástí GF3, Radeounu7500 a výše, starší grafiky tedy nefungují? :-)
Článek na toto téma je fajn, uvítal bych další, rozvíjející tuto tématiku (klidně seriál) - třeba už od toho, jak se tvoří 3d scéna a první 3d akcelerátory, až po novější a novější technologie do dneška. Okořenit to dalšímí "fíčurkami" - jak (zjednodušeně) dostat televizi do PC, jak funguje přehrávání filmů (na úrovni grafiky, o kompresi by to bylo na další seriál), co je to hydravision, příp nview a tak dále.
A ohodnoceni clanku- "pro experty" je uplne mimo... (jak pise i sam autor)
Shadery jsou jak bylo správně řečeno jednotky grafické karty, které zpracovávají jednoduché "programy". Tyto kartě říkají, jak naložit s grafickými daty (geometrie, světla -> barvy, textury, atd.). Oproti standartní(DirectX7) neboli "fixed-function" pipeline mají výhodu, že se právě dají programovat (v určitých mezích, daných právě verzí shaderů).
Příkladem pro pixel-shader budiž třeba multi-texturing. Zde si můžete napsat postup, jakým způsobem se textury do sebe namíchají. K dispozici jsou různé matematické operace, které můžete pospojovat a dosáhnout tak kýženého efektu. V původní "fixed" pipeline jsou k dispozici pouze předdefinované operace a některé speciální efekty se jimi dosahují poměrně komplikovaně. Pro pixel-shadery stačí napsat "jen" správný program.
Pozn. Snažil jsem se to shrnout jen tak "v kostce". Ti, co programují 3D aplikace nejspíš vědí, o čem mluvím a laikům to snad možná něco nastínilo, doufám:-))
Zdraví autor článku.
Zdravím všechny čtenářa a doufám, že nám zachovají svou přízeň. Hlavně díky vám můžeme provoz kvalitní časopis.
Autor článku.
Autor článku.
Po přečtení má radost ale trochu vystřízlivěla. Velmi bych ocenil např. srovnání nějakých velmi primitivních scén (třeba autorem naprogramovaných) s názorně ukázaným efektem pixel shaderu (šipkou apod.) a poznamenáním rozdílů. Také by mě zajímalo, co vlastě musí autoři 3D scény do aplikace zakomponovat. Model, textury apod. si představí každý, ale tohle už je těžší...
Samozřejmně chápu, že komplexní článek je zaměřen trochu výše, než na "běžné uživatele" a vyžaduje více času a zanlostí...
Ovesm ak mas kartu ktora ako R8500, GF3, GF4 atd... robi tuto pracu cez Shadery...to jest ovela rychlejsie.
takze podporuje vsedky do 1.4
Ak ma dakto pochybnosti. Tu je dokaz : Ak by UT2003 ci U2 boli cisto DX8.1 hry nespustil by si ich na starsich DX7 kartach. Ale ide....
Prva naozaj FULL DX8.1 hra zo vsetkymi featurkami bude az Doom3
Článek sípše vychází jako počtení pro lidi, kteří o pixel shaderech ještě ani neslyšeli, nebo jen okrajově.
Ono s dokumentací z netu a pár obrázky z 3D Marku udělá tohle kdokoli
Jde o to, ze VS pracuje na urovni vertexu (vrcholu). Snad vsichni z vas vi, ze kazdy objekt ve "hre" je v podobe poskladanych trojuhleniku (polygonu). V kazdem vrcholu trojuhelnika se nachazi VERTEX. Vertexy urcuji geometrii telesa. V DX8 a vyse muzete pracovat s VERTEXY pomoci VS. Je potreba udelat transformace, pripadne osvetleni (TaL). Prave toto se provadi ve vertex shaderu, coz je vlastne maly procesor, ktery provadi vas kod (napsany specialnimi instrukcemi VS). Tento kod je pak "spusten" na kazdy vertex, ktery je tranformovan do vaseho 3D sveta. Vyhoda spociva v tom, ze VS jdou programovat, takze muzete udelat plno zajimavych efektu s GEOMETRII telesa pripadne OSVICENIM.
Vertex ma za prve pozici ve forme 3D souradnic x, y a z (obsahuje samozrejme i dalsi atributy, ale ty nas ted nezajimaji - barvu, normalovy vektor, texturove koordinaty), tyto souradnice prichazi do vstupnich registru VS a vy s nimi muzete pracovat jako s vlastnimi. Dale muzete vyuzit konstantni registry C, ktere naplnite programove predem, pred spustenim vlastni tranformace. Nakonec tam jsou jeste odkladaci a hlavne VYSTUPNI registry, do ktery zapisete vyslednou pozici, barvu, pripadne texturove koordinaty. S temito daty se dale pracuje, mohou napriklad putovat do PS atd.
Tak a ja si myslim, ze PS pracuji hodne podobne, jen maji svuj instrukcni soubor a HLAVNE pracuji na urovni pixelu, takze vas program je spusten na kazdy renderovany pixel! Jak jiz bylo receno, PS se pouzivaji napr. pro multi-texturing, ale daji se s tim delat dalsi figle, ktere jeste bohuzel neznam.
Jo PS jsou implementovany az v Radeonu 8500(LE). Celkove PS nejsou zdaleka ve vsech kartach. Napriklad cela rada MX je uplne vypousti!
Snad jsem vam pomohl.
Swap
S pozdravem autor článku.
já jsem svůj příspěvek nepsal proto, abych si postěžoval, že tohle udělá každý. Sám vím, jak je časově náročné něco napsat, protože jsem pro PCT 3 články napsal, ale spolupráci jsem ukončil.
Pravda, že o problematice graf. karet mnoho nevím, ale zabývám se programováním v jiných oblastech a chtěl bych se jen dozvědět něco nového, což mi článek bohužel nedal.
S pozdravem autor článku.
V helpu je tohle popsany dost podrobne a myslim ze na to je nekolik technik....
Špatně se to vysvětluje, pokud nevíš, jak funguje grafická pipeline. Zkus msdn.microsoft.com a najdi si tam dokumentaci k DirectX SDK. Tam je to docela fajn popsaný, sice v angličtině, ale co, že?!
Lightmapy se dělají multitexturingem. Pokud karta umí 2 textury v jednom průchodu (což už snad od dob TNT zvládá každá), tak je to jenom plus (a hlavně se to o něco líp programuje).
Když máš light-mapu, tak pak záleží, jestli chceš pomocí ní dosáhnou difúzního nebo specularního osvětlení. Podle toho pak zvolíš operaci mezi texturama. Pro difúzní D3DTOP_MODULATE a pro speculární D3DTOP_ADD (popř. jejich odvozeniny 2X, signed, atd.,).
Jinak v DX SDK je sample, jmenuje se to tušim MFC Texture nebo tak nějak a tam jsou tyhle operace ukázaný i s kódem.