CGT_1 - Úvod

Tato kapitola má následující čtyři části:

Co je to Cg?

Tato kniha vás má naučit jak používat programovací jazyk zvaný Cg. Programovací jazyk Cg vám umož�uje kontrolovat tvar, vzhled a pohyb vykreslovaných objektů používajících programovatelný grafický hardware. Snoubí tak programovaou kontrolu těchto atributů s neuvěřitelnou rychlostí a možnostmi dnešních grafických procesorů. Nikdy předtím neměli praktici pracující s počítačovou grafikou tolik kontroly nad obrázky generovanými v reálném čase.

Cg poskytuje vývojářům kompletní programovací platformu která se lehce používá a dovoluje rychlou tvorbu speciálních efektů a zážitky kinematografické kvality v reálném čase na různých platformách. Poskytnutím nové abstraktní vrstvy Cg odstra�uje potřebu vývojářů programovat přímo ve strojovém jazyce grafického hardware a tak se lépe zaměřit na OpenGL, DirectX, Windows, Linux, Macintosh OS X a konzole jako je Xbox. Cg byl vyvinut v úzké spolupráci s Microsoft Corporation a je kompatibilní jak s OpenGL API tak s HLSL pro DirectX 9.0 od Microsoftu.

Cg znamená "C pro grafiku". Programovací jazyk C je populární, obecně použitelný vyvinutý v 70-tých letech. Jeho popularita a čistý návrh poskytuje základ pro mnoho dalších programovacích jazyků. Například C++ a Java zakládají jejich syntaxi a strukturu převážně na C. Jazyk Cg sám je stejně tak založený na C. Pokud znáte C nebo některý z mnoha jazyků odvozených od C bude pro vás Cg jednoduchý.

Na druhou stranu pokud nejste obeznámeni s C nebo obecně s progamováním ale baví vás počítačová grafika a chcete se naučit něco nového, čtěte dále. Cg programy bývají krátké a srozumitelné.

Většinu této kapitoly tvoří pozadí které vám poskytne hodnotný kontext pro porozumění Cg a jeho efektivní využití. Na druhou stranu vám může víc vyhovovat učit se Cg pomocí příkladů. Nebojte se přeskočit na Kapitolu 2 kdykoli se budete chtít ponořit více do tohoto tutoriálu.

Jazyk pro programovatelný grafický hardware

Cg se liší od C, C++ a Javy protože je velmi sepcializovaný. Nikdy nikdo v Cg nenapíše tabulkový nebo textvý procesor. Místo toho se Cg zaměřuje na schopnost programově kontrolovat tvar, vzhled a pohyb objektů vykreslovaných grafickým hardware. Tento typ jazyka se nazývá stínovací jazyk. Avšak Cg umí více než jen stínovat. Například Cg programy mohou provádět fyzikální simulace, kompozici a ostatní úlohy mimo stínování.

Přemýšlejte o Cg programu jako o detailním receptu jak vykreslit objekt použitím programovatelného grafického hardware. Například můžete napsat v Cg program, který vytvoří hrbolatý povrch nebo animuje virtuální postavu. Později se v části 1.3 dozvíte více o na historii stínovacích jazyků a kam Cg do této historie patří.

Model datového toku Cg

Mimo to že je Cg specializován na grafiku je taky spolu s ostatními stínovacími jazyky odlišný od konvečních programovacích jazyků protože jsou založené na výpočetním datovém modelu. V tomto modelu se výpočet provádí jako odezva na data která proudí sekvencí procesů.

Cg programy pracují s vertexy a fragmenty (představte si "pixely" pokud nevíte co je to fragment) které jsou zpracovávany při vykreslování obrázku. Představte si program v Cg jako černou skří�ku do které vtékají vertexy a fragmenty z jedné strany, jsou nějak transformovány a pak vytékají na druhé straně. Nicméně ta skří�ka není opravdu úplně černá protože musíte určit, v Cg programu který píšete, co přesně se uvnitř děje.

Pokaždé když je zpracováván nějaký vertex nebo fragment při vykreslování 3D scény provede se váš vertex nebo fragment program. Sekce 1.3 vysvětluje model datového toku v Cg podrobněji.

Nejnovější osobní počítače a herní konzole obsahují grafické procesory (GPU) které jsou určené k provádění grafických úloh jako je transformování a vykreslování 3D modelů. Vaše Cg programy se tak vykonávají přímo v GPU vašeho počítače.

Specializace GPU a generealizace CPU

Ať už má nebo nemá počítač či herní konzole GPU, musí zde být CPU na kterém běží operační systém a aplikace. CPU jsou navržena obecně. CPU vykonává aplikace (například textových procesorů a účetních balíků) napsané v obecných jazycích jako je C++ nebo Java.

Díky specializovanému návrhu je GPU v grafických úlohách, jako je vykreslování 3D scén rychlejší, než by bylo klasické CPU. Nové GPU zpracovávají desítky milionů vertexů za sekundu a vykreslují stovky nebo dokonce miliardy fragmentu za sekundu. Budoucí GPU budou mnohem rychlejší. To je mnohonásobně větší rychlost než s jakou by CPU zvládlo zpracovat podobný počet vertexů a fragmentů. Avšak GPU nemůže vykonat ty samé zbytkové, obecné programy jako CPU.

Specializované, vysoce výkonné GPU je důvod proč Cg existuje. Obecně zaměřené programovací jazyky jsou příliš otevřené pro speciální úlohy jako je zpracovávání vertexů a fragmentů. Naproti timu Cg je plně zaměřeno na tuto úlohu. Cg také poskytuje abstraktní exekuční model který je stejný jako exekuční model GPU. Více se o tomto unikátním exekučním modelu GPU naučíte v části 1.2.

Výkonnostní odůvodnění Cg

K zachování iluze interaktivity (plynulosti pohybu) musí aplikace udržovat animaci na 15 nebo více snímcích za sekundu. Obecně se považuje 60 nebo více snímků za sekundu za animaci v "reálném čase", což je hodnota na které se jeví interakce s aplikací jako plynulá. Obrazovka počítače může mít milion nebo více pixelů které musí být překresleny. Pro 3D scény musí obvykle GPU zpracovávat každý pixel na obrazovce několikrát, třeba při výpočtech ořezávání (překryvu) objektů nebo při upravování vzhledu každého pixelu. To znamená že 3D aplikace běžící v reálném čase mohou vyžadovat aktualizaci milionů pixelů za sekundu. Souběžně s požadavky na vykreslování pixelů se musí zpracovávat 3D modely které se skládají z vertexů a musí být správně transformovány předtím, než jsou sestaveny do polygonů, čar, a bodů které budou rasterizovány jako pixely. To může vyžadovat transformaci desítek milionů vertexů za sekundu.

Přesto se toto zpracování grafiky děje navíc k nemalému úsilí CPU aktualizovat animaci s každým novým obrázkem. Realita je taková že potřebujeme jak speciální vlastnosti GPU tak i schopnosti CPU zpracovávat grafiku. Obě jednotky musí vykreslovat scény tak aby byla zachována interaktivita a kvalita kterou hráčí 3D aplikací a her požadují. To znamená že vývojář může napsat svou aplikaci nebo hru v C++ a poté použít Cg aby dostal maximum z výkonu a schopností GPU.

Koexistence s konvenčními jazyky

Cg v žádném případě nesnaží nahradit jakýkoli obecný jazyk. Cg je pomocný jazyk navržený speciálně pro GPU. Programy napsané pro CPU v konvenčních jazycích jako je C nebo C++ mohou použít běhové prostředí jazyka Cg (popsané v části 1.4.2) k načtení Cg programů a následné vykonání v GPU. Běhové prostředí jazyka Cg je standardní sada rutin používaná k načítání, překladu, manipulaci a konfiguraci Cg programů pro vykonání v GPU. Aplikace předávají Cg programy aby informovaly GPU jak vykonat programovatelné vykreslovací efekty, kterých by jinak nebylo možné dosáhnout pomocí CPU na srovnatelné vykreslovací frekvenci s GPU.

Cg umož�uje zvláštní způsob paralelního zpracování. Zatímco CPU vykonává klasickou aplikaci, ta stejná aplikace také řídí zpracování vertexů a fragmentů v GPU pomocí programů napsaných Cg.

Když je stínovací jazyk vykonávající se v reálném čase tak dobrý nápad, proč neikdo nepřišel s Cg dříve? Odpověď má co dělat s vývojem hardware počítačové grafiky. Před rokem 2001 většina grafického hardware, většinou nepříliš drahého který jsme mohli najít v počítačích a herních konzolích, byla pevně naprogramována na provádění specifických úloh pro zpracování vertexů a fragmentů. Tím "svázáním" myslíme že algoritmy byly pevně spjaty s hardware tak že nebyly programovatelné přímo grafickou aplikací. I přesto že tyto vázané grafické algoritmy mohly být nastaveny grafickými aplikacemi různými způsoby, aplikace samotné nemohly přeprogramovat hardware aby vykonával úlohy které jeho návrháři nepředpokládali. Tato situace se naštěstí změnila.

Vývoj grafického hardware pokročil a nyní jsou jednotky pro zpracovávání fragmentů a vertexů v současných GPU opravdu programovatelné. Před úsvitem programovatelného grafického hardware nebyl žádný důvod k existenci nějakého jazyka který by to umož�oval. Teď když je takový hardware dostupný, je zde i jasná potřeba usnadnit programování takového hardware. Cg činí programování GPU mnohem jednodušší stejně jako C učinilo jednodušší programování CPU.

Předtím než existoval Cg, bylo využití programovatelných částí GPU možné jen skrze nízkoúrov�ové strojové jazyky. Nečitelná syntaxe instrukcí a nutnost ručně manipulovat s registry hardware pomocí strojových jazyků jako stínovací vertex a pixel programy v DirectX 8 a některá rozšíření knihovny OpenGL, učinily z této činnosti boletnou úlohu pro vývojáře. Jak technologie GPU umož�ovala psát delší a složitější programy ve strojových jazycích, stala se poteba vyvinout vysokoúrov�ový jazyk zřejmou. Náročné nízkoúrov�ové progamování, které bylo nutné k dosažení optimálního výkonu se tak mohlo předat překladači, který optimalizuje výstup kódu a obsluhuje jinak zslouhavé časování instrukcí. Níže je malá ukázka v komplexním strojovém jazyce napsaném fragment programu popisujícím vzhled pokožky. Je těžký na pochopení, částečně díky specifickým odkazům na hardwarové registry.

. . .
DEFINE LUMINANCE = {0.299, 0.587, 0.114, 0.0};
TEX H0, f[TEX0], TEX4, 2D;
TEX H1, f[TEX2], TEX5, CUBE;
DP3X H1.xyz, H1, LUMINANCE;
MULX H0.w, H0.w, LUMINANCE.w;
MULX H1.w, H1.x, H1.x;
MOVH H2, f[TEX3].wxyz;
MULX H1.w, H1.x, H1.w;
DP3X H0.xyz, H2.xzyw, H0;
MULX H0.xyz, H0, H1.w;
TEX H1, f[TEX0], TEX1, 2D;
TEX H3, f[TEX0], TEX3, 2D;
MULX H0.xyz, H0, H3;
MADX H1.w, H1.w, 0.5, 0.5;
MULX H1.xyz, H1, {0.15, 0.15, 1.0, 0.0};
MOVX H0.w, H1.w;
TEX H1, H1, TEX7, CUBE;
TEX H3, f[TEX3], TEX2, 1D;
MULX H3.w, H0.w, H2.w;
MULX H3.xyz, H3, H3.w;
. . .
 

Naproti tomu dobře okomentovaný kód v Cg je přenositelnější, čitelnější, lépe se odlaďuje a znovupoužívá. Cg vám dává výhody vysokoúrov�ového jazyka jakým je C a současně je stejně výkonný jako nízkoúrov�ový strojový kód.

Ostatní aspekty Cg

Cg je jazyk pro programování v "malém". To ho činí mnohem jednodušším než jsou moderní obecné jazyky jako je C++. Protože se Cg specializuje na transformaci vertexů a fragmentů, nezahrnuje momentálně mnoho komplexních vlastností nutných pro masivní úlohy sofwarového inženýrství. Narozdíl od C++ a Javy Cg nepodporuje třídy a ostatní vlastnosti používané v objektově orientovaném programování. Současné implementace jazyka Cg neposkytují ukazatele nebo dokonce alokaci paměti (i když budoucí implementace mohou, protože klíčová slova jsou už vyhrazena). Cg nemá absolutně žádnou podporu pro vstupní / výstupní operace se soubory. Tímto a dalším je řečeno že tato omezení nejsou trvalými omezeními jazyka, ale spíše jen nasti�ují možnosti nejvýkonnějších GPU současnosti. Stejně jak technologie obecně dovoluje čím dál větší míru programovatelnosti GPU, tak můžete očekávat i růst jazyka Cg. Protože Cg je úzce založeno na C budou budoucí aktualizace jazyka přebírat další vlastnosti z C a C++.

Cg poskytuje pole a struktury. Má všechny konstrukce moderních jazyků potřebné k řízení toku: cykly, podmínky a volání funkcí.

Cg má nativní podporu vektorů a maticí protože jsou tyto datové typy a jim příbuzné matematické operace základem grafiky a většina grafického hardware přímo podporuje vektorové datové typy. Cg má také knihovnu funkcí nazvanou Standradní knihovna (Standard Library), která je vhodná pro operace s grafikou. Například tato standardní knihovna obsahuje funkci reflect pro výpočet vektorů odrazu.

Cg programy se vykonávají v relativní izolaci. To znamená že zpracovávání nějakého vertex programu nemá žádný efekt na ostatní současně zpracovávané vertexy nebo fragmenty. Neexistují žádné vedlejší efekty při vykonávaní Cg programu. Tento nedostatek vzájemné závislosti mezi vertexy a fragmenty činí Cg programy extrémně dobře uzpůsobené pro běh v rourovaném a paralelizovaném hardware.

Omezené exekuční prostředí Cg programů

Když napíšte program v jazyce navrženém pro moderní CPU na němž běží moderní operační systém, očekáváte že se víceméně libovolný program, pokud je správně napsaný, přeloží a v pořádku vykoná. To je díky tomu že CPU je navrženo k vykonávání obecně jakýchkoli programů pro které má systém více než dostatečné prostředky.

Avšak GPU jsou spíše specializovaný druh hardware a množina jejich vlastností se stále rozvíjí. Ne vše co napíšete v Cg lze přeložit na dané GPU. Cg obsahuje koncept hardwarových "profilů", které lze zvolit při překladu Cg programu. Každý profil odpovídá určité kombinaci architektury GPU a grafického API. Program nejen že musí být správný ale také musí spl�ovat podmínky profilu použitého pro překlad Cg programu. Například daný fragment profil může omezovat program jen na čtyři přístupy k textuře na jeden fragment.

S vývojem GPU bude přibývat více profilů odrážejících nové vlastnosti a které budou podporovány Cg. V budoucnosti se stanou profily méně důležitými díky lepším GPU. Ale nyní musí programátoři v Cg své programy omezit aby se ujistili že se přeloží a vykonají na současných GPU. Obecně budou budoucí profily nadmnožinami současných profilů, takže programy napsané pro současné profily se přeloží beze změny.

To vám může připadat omezující, ale v praxi fungují Cg programy uvedené v této knize na desítkách milionů GPU a předvádí ohromné vykreslovací efekty. Dalším důvodem pro omezení velikosti a rozsahu je to že čím menší a efektivnější jsou vaše progamy v Cg, tím rychleji poběží. Grafika v reálném čase je často o vyvážení rostoucí komplexnosti scény, rychlosti animace a pokročilém stínování. Proto je vždy dobré maximalizovat efektivitu vykreslování skrze uvážené vykreslování v Cg.

Zapamatujte si že omezení daná profily jsou omezeními současných GPU a ne jazyka Cg. Jazyk Cg je dostatečně mocný aby vyjádřil stínovací techniky které ještě není možné vykonat na všech současných GPU. 4asem se funkcionalita GPU vyvine dostatečně na to aby profily byly schopné provádět komplexní Cg programy. Cg je jazyk jak pro současná tak i budoucí GPU.

Vertexy, fragmenty a grafické roury

Aby jste Cg správně pochopili, musíte porozumět tomu jak GPU vykresluje obrázky. Tato část vysvětluje jak se grafický hardware vyvíjí a poté prozkoumává vykreslovací roury moderního grafického hardware.

Vývoj počítačového grafického hardware

Počítačová grafika se vyvíjí neuvěřitelnou rychlostí. Jak je vidět na obrázku níže, tuto inovaci řídí tři hybné síly. První je průmysl polovodičů, který se zavázal zdvojnásobovat počet tranzistorů (základní jednotka počítačového hardware) v mikročipu každých 18 měsíců. Toto neustálé zdvojnásobování výpočetního výkonu, historicky známé jako Mooreův zákon, znamená levnější a rychlejší počítačový hardware a je dobovou normou.

Druhou silou je výpočetní výkon vyžadovaný k simulaci světa kolem nás. Naše oči přijímají a naše mozky vyhodnocují obrazy našeho 3D světa ohromnou rychlostí a s překvapivou přesností. Nejsme ani nadosah tomu aby se počítačová grafika stala náhražkou reality. Realita je prostě příliš reálná. Počítačoví grafici však neohroženě pokračují k pokořená výzvy. Naštěstí je generování obrázků trapně paralelním problémem. "Trapně paralelním" myslíme, že návrháři grafického hardware mohou opakovaně rozdělit problém vytváření realistických obrázků do více fází, které jsou menší a lehčí na zvládnutí. Poté mohou návrháři hardware navrhnout ještě větší počet tranzistorů které mohou provádět všechny potřebné fáze.

Naší třetí hybnou silou je neutišitelné přání být vizuálně stimulováni a baveni nás všech. To je ta síla která "spojuje" zdroj našeho neustálého zdvojnásobování zdrojů počítačového hardware s úlohou vizuálního napodobování reality realističtěji než kdy předtím.

Jak vidíte na obrázku níže, tyto náhledy nám umož�ují s důvěrou předpovědět že grafický hardware bude mnohem rychlejší. Tyto inovace jen zvětšují naši společnou chuť po lepším a interaktivnějším 3D zážitku. Uspokojení tohoto požadavku je důvod který motivoval celý vývoj jazyka Cg.

Síly řídící inovaci grafického hardware

1.2.2 Čtyři generace počítačového grafického hardware

V polovině devadesátých let se ten nejrychlejší grafický hardware skládal z mnoha čipů pracujících společně na vykreslování obrázků a jejich zobrazování. Ty nejsložitější grafické počítačové systémy se skládaly z tuctů čipů rozprostřených na mnoha deskách. S postupem času a vývojem technologie výroby polovodičů začlenili hardwaroví návrháři komplikované vícečipové koncepty do jednoho grafického čipu. Tento vývoj vyústil v integraci a zmenšování.

Můžete být překvapeni že GPU dnes překonává CPU v počtu tranzistorů v jednom mikročipu. Počet tranzistorů je hrubým měřítkem toho kolik hardware se nalézá v jednom mikročipu. Například Intel umístil do svého Pentia 4 na ě.4 GHz 55 milonů tranzistorů; nVidia použila 125 milionů tranzistorů v původní GeForce FX GPU.

nVidia představila termín "GPU" koncem devadesátých let kdy se odkazovaný termín "řadič VGA" stal neplatným popisem grafického hardware v počítači. IBM představilo Video Graphics Array (VGA) v roce 1987. V té době byl řadič VGA to čemu dnes říkáme "hloupá" paměť snímků. To znamenalo že za aktualizování pixelů na obrazovce byla zodpovědná CPU. Dnes CPU pracuje s přímo s pixely jen zřídka. Místo toho návrháři implementují tuto funkci aktualizace pixelů přímo do GPU.

Lidé z průmyslu rozpoznali čtyři generace GPU. Každá genreace přináší lepší výkon a rozvíjející se programovatelnost GPU. Každá generace také ovliv�uje a začle�uje funkcionalitu dvou nejvýznamnějších 3D programovacích rozhraní, OpenGL a DirectX. OpenGL je ptevřeným standardem pro 3D programování pro Windows, Linux, UNIX a Macintosh. DirectX je byvíjející se sadou multimediálních programovacích rozhraní, včetně Direct3D pro programování v 3D.

Grafická akcelerace před příchodem GPU

Před příchodem GPU, společnosti jako Silicon Graphics (SGI) a Evans & Sutherland navrhly speciální a také drahý grafický hardware. Grafické systémy vyvinuté těmito společnostmi představily hodně takových konceptů, jako transformace vertexů a mapování textur, ze kterých dnes těžíme. Tyto systémy byly velmi důležité v historickém vývoji počítačové grafiky, ale protože byly tak drahé, nikdy nedosáhly komerčního úspěchu tak jako jednočipové GPU navržené pro PC a videoherní konzole. Dnes jsou GPU mnohem výkonnější a levnější než jakékoli prvotní systémy.

GPU první generace

První generace GPU (do roku 1998) zahrnuje karty nVidia TNT2, ATI Rage a 3Dfx Voodoo3. Tyto GPU jsou shopné vykreslovat předtransformované trojúhleníky a aplikovat jednu nebo dvě textury. Také implementují sadu DirectX 6. Pokud provádí nějaké 2D nebo 3D aplikace, snímají tyto GPU z CPU povinnost aktualizovat jednotlivé pixely. Avšak GOU této generace trpí dvěma zřejmými omezeními. Zaprvé, nemají schopnost transformovat vertexy 3D objektů; místo toho se tak děje v CPU. Zadruhé, mají docela omezenou sadu matematických operací pro kombinování textur k výpočtu barvy vykreslených pixelů.

GPU druhé generace

Tato druhá generace GPU (1999 - 2000) zahrnuje nVidia GeForce 256 a GeForce 2, ATI Radeon 7500 a S3 Savage3D. Tyto GPU snímají zátěž 3D transformace a osvětlování (T&L) z CPU. Rychlá transformace vertexů byla jednou z klíčových schopností které odlišovaly pracovní stanice od PC před touto generací. Jak OpenGL tak DirectX 7 podporují hardwarovou transformaci vertexů. Přestože se v této generaci množina matematických operací kombinování textur a obarvování pixelů rozšířila o kubické mapování textur a operace v kladné části, jsou možnosti stále omezené. Jinými slovy, tato generace se dá lépe konfigurovat, ale pořád není opravdu programovatelná.

GPU třetí generace

Třetí generace GPU (2001) zahrnuje nVidia GeForce3 a GeForce4 Ti, Microsoft Xbox a ATI Radeon 8500. Tato genereace umož�uje programování vertexů narozdíl od konfigurovatelnosti. Místo podpory klasické transformace a osvětlování specifikované v OpenGL a DirectX 7, umož�ují tyto GPU aplikaci sepcifikovat sekvenci instrukcí jak zpracovat vertexy. Je také dostupných poměrně víc možností nastavní zpracování pixelů, ale tyto módy nejsou dostatečně výkonně na to aby se daly považovat za programovatelné. Protože tyto GPU podporují programování vertexů ale neumož�ují opravdové programování pixelů je tato generace označována za přechodnou. Programovatelnost na úrovni vertexů byla uvedena v aplikacích díky DirectX 8 a rozšíření ARB_vertex_program OpenGL. Stínovací pixelové programy v DirecX 8 a něktěří spoluautoři rozšíření OpenGL umožnili této generaci konfigurovatelnost na úrovni fragmentů.

GPU čtvrté generace

Čtvrtá, současná generace GPU (2002 a dále) zahrnuje rodinu nVidia GeForce FX s architekturou CineFX a ATI Radeon 9700. Tyto GPU umož�ují programovatelnost jak na úrovni vertexů tak pixelů. Tato úrove� programovatelnosti otevírá možnost přenesení komplexních transformací vertexů a stínování pixelů z CPU na GPU. To je možné skrze DirectX 9 a různá rozšíření OpenGL. Toto je ta genreace GPU kde začíná být programování v Cg opravdu zajímavé. V následující tabulce je seynam vybraných nVidia GPU repreznetujících různé generace GPU.

GeneraceRokJméno výrobkuZpracováníPočet tranzistorůAntialiasing fill ratePolygon ratePoznámka
Prvníkonec r. 1998Riva TNT0.25 mikronů7M50M6M1
Prvnízačátek r. 1999Riva TNT20.22 mikronů9M75M9M2
Druhákonec r. 1999GeForce 2560.22 mikronů23M120M15M3
Druházačátek r. 2000GeForce 20.18 mikronů25M200M25M4
Třetízačátek r. 2001GeForce 30.15 mikronů57M800M30M5
Třetízačátek r. 2002GeForce 4 Ti0.15 mikronů63M1200M60M6
Čtvrtázačátek r. 2003GeForce FX0.13 mikronů125M2000M200M7

Poznámky

  1. Dvě textury v DirecX 6
  2. AGP 4x
  3. Neprogramovatelný vertex hardware, kombinátory registrů, kubické mapy, DirectX 7
  4. Výkonnost, paměŤ s paralelním (zdvojeným) přenosem dat (DDR)
  5. Vertexové programy, exponenciální texturování, stínování textur, DirectX 8
  6. Výkonnost, antialiasing
  7. Programovatelnost vertexů a fragmentů, pixely v plovoucí čárce, DirectX 9, AGP 8x

Legenda k tabulce

Poznámky obsahují ty nejvýznamnější pokroky v každé generaci. Poměr výkonu nemusí být porovnatelný s výrobky jiných výrobců hardware.

Budoucí GPU budou dále rozšiřovat programovatelnost současných GPU a Cg zjednodušší programování těchto GPU.

Potrubí grafického hardware

1.2.3 Potrubí grafického hardware

Potrubí je pořadí jednotlivých částí pracujících paralelně a v pevném pořadí. Každá část obdrží svůj vstup od předchozí části a pošle svůj výstup části následující. Tak jako na montážní lince kde se vyrábí tucty automobilů současně každý automobil v jiné fázi kompletace, tak potrubí klasického grafického hardware zpracovává spousty vertexů, geometrických primitiv a fragmentů podobně.

Obrázek výše ukazuje potrubí grafického hardware tak jak ho naleznete v dnešních GPU. 3D aplikace posílá do GPU sled vertexů zabalených do geomterických primitiv, typicky jsou to polygony, čáry a body. Jak můžete vidět na obrázku níže, existuje mnoho způsobů jak popsat geometrická primitiva.

Každý vertex má svou polohu ale obvykle také několik dalších vlastností jako je barva, sekundární barva (odlesková), jednu nebo dvě sady souřadnic textury a normálový vektor. Normálový vektor říká, kterým směrem je povrch natočen u určitého vertexu a typicky se používá při výpočtech osvětlení.

Typy geometrických primitiv

Vertexová transformace

Vertexová transformace je první část zpracování v potrubí grafického hardware. Vertexová transformace provádí sekvenci matematických operací s každým vertexem. Tyto operace zahrnují transformaci pozice vertexu na obrazovku pro účely rasterizeru, generování souřadnic pro texturování a osvětlování vertexu nutné k určení jeho barvy. Mnoho z těchto úloh si vysvětlíme později v následujících kapitolách.

Sestavení a rasterizace primitiv

Transformované vertexy jsou zaslány do další části nazvané sestavení a rasterizace primitiv. V prvním kroku sestavování primitiv se vertexy sestaví do geometrických primitiv na základě informace která doprovází tento sled vertexů. Tak vzniknou jednolivé trojúhelníky, čáry nebo body. Tato primitiva mohou být ořezána do výhledového prostoru tvaru komolého jehlanu (view frustum, viditelná oblast v 3D prostoru od obrazovky monitoru směrem "dovnitř") stejně jako mohou být ořezána na velikost ořezových rovin specifikovaných danou aplikací. Rasterizer ale také může některé polygony vyřadit ze zpracování v závislosti na tom zda jsou přivrácené či odvrácené. Tento proces je známý jako proces třídění.

Polygony které přežily kroky ořezávání a třídění musí bý rasterizovány. Rasterizace je proces při kterém se určuje množina pixelů pokrytá geometrickým primitivem. Všechny polygony, čáry a body jsou rasterizovány podle pravidel definovaných pro každý typ primitiva. Výsledkem rasterizace je množina loakací jednotlivých pixelů a stejně tak fragmentů. Neexistuje žádný vztah mezi počtem vertexů nějakého primitiva a počtem fragmentů které vzniknou při jeho rasterizaci. Například trojúhelník tvořený jen třemi vertexy by mohl zaujímat celou obrazovku, takže po rasterizaci by vznikly miliony fragmentů!.

Předtím jsme vám řekli aby jste přemýšleli o pixelu jako o fragmentu pokud jste nevěděli co přesně to fragment je. Avšak v tomto okamžiku se stává rozdíl mezi pixelem a fragmentem důležitý. Pojem "pixel" je zkratka pro "bod na obrazovce" (picture element). Pixel představuje obsah snímkové paměti na určité pozici, jako je barva, hloubka a jakékoli ostatní hodnoty spojené s danou pozicí. Fragment je potenciální stav kterým se daný pixel aktualizuje.

Pojem "fragment" používáme protože rasterizace rozloží každé geometrické primitivum, jako třeba trojúhelník, na fragmenty o velikosti pixelu pro každý pixel který pokrývá geomtrické primitivum. Fragment je asociovaný k pozici pixelu, hodnotě hloubky a množině interpolovaných parametrů jako je barva, sekundární (odlesková) barva a jedné nebo dvěma sadám souřadnic textury. Tyto rozličné interpolované parametry jsou odvozeny od transformovaných vertexů které tvoří dané geomterické primitivum použité k vytvoření fragmentů. Můžete o fragmentu uvažovat jako o "potenciálním pixelu". Pokud fragment projde různé testy během rasterizace (v části rastrových operací která je krátce popsána níže) je fragment použit k aktualizaci pixelu v snímkové paměti.

Interpolace, texturování a obarvování

Když je primitivum rasterizováno do kolekce jednoho nebo více fragmentů, interpolace, texturování a obarvování interpoluje potřebné parametry fragmentu, provede sled texturovacích a matematických operací a určí výslednou barvu každého fragmentu. Navíc tato fáze může stanovit novou hloubku nebo vyloučit fragment aby se neaktualizovala snímková paměť pro odpovídající pixel. Tato možnost umož��uje produkci jednoho nebo žádného obarveného fragmentu pro každý vstupní fragment.

Rastrování

Rastrování provádí poslední sekvenci operací s fragmentem těsně před aktualizací snímkové paměti. Tyto operace jsou standardní součástí OpenGL a Direct3D. Během této části zpracování jsou odstraněny skryté povrchy díky procesu známěmu jako hloubkové testování. Ostatní efekty jako je míchání a stínování na bázi šablon se také provádějí v této fázi.

Rastrovací operace kontrolují každý fragment pomocí testů, včetně nůžkového, alfa, šablonového a hloubkového. Tyto testy zahrnují konečné hodnoty barvy nebo hloubky, pozici pixelu a hodnoty náležící každému pixelu jako je hodnota hloubky a šablony pixelu. Pokud selže jakýkoli test, pak tato část vyloučí fragment aniž by aktualizovala barevnou hodnotu pixelu (může nastat zápis do šablony). Splnění hloubkového testu může nahradit hodnotu hloubky pixelu hloubkou fragmentu. Po všech testech operace míchání zkombinuje výslednou barvu fragmentu z odpovídající barevnou hodnotou pixelu. Nakonec snímková paměť nahradí barvu pixelu nově namíchanou barvou. Obrázek níže ukazuje že rastrovací operace je sama o sobě vlastně sledem jednotlivých částí potrubí. Ve skutečnosti by mohly všechny předchozí popsané části být rozděleny na menší části.

Standardní rastrovací operace v OpenGL a Direct3D

Vizualizace grafického potrubí

Následující obrázek vyobrazuje části grafického potrubí. Na obrázku jsou rasterizovány dva trojúhelníky. Zpracování začíná transformováním a obarvením vertexů. V dalším kroku sestavování primitiv jsou z vertexů vytvořeny trojúhelníky, jak naznačují přeřušované čáry. POté rasterizer "vyplní" trojúhelníky fragmenty. Nakonec jsou hodnoty vertexů interpolovány a použity pro texturování a obarvování. Všimněte si že z pár vertexů je vygenerováno mnoho fragmentů.

Vizualizace grafického potrubí

1.2.4 Programovatelné grafické potrubí

Dominantním trendem v oblasti návrhu grafického hardware dnes je úsilí nabídnout více programovatelnosti GPU. Násedující obrázek ukazuje fáze zpracování vertexů a fragmentů v potrubí programovatelné GPU.

Tento obrázek ukazuje více detailů než předchozí, ale co více, ukazuje jak je zpracování vetexů a fragmentů rozloženo do programovatelných jednotek. Programovatelný vertexový procesor je hardwarová jednotka která provádí Cg vertexové programy, kdežto programovatelný fragmentový procesor je jednotka která provádí Cg fragmentové programy.

Jak je vysvětleno v sekci 1.2.2, návrhy GPU pokročily a vertexové a fragmentové procesory v GPU se změnily z konfigurovatelných na programovatelné. V dalších dvou sekcích jsou prezentovány důležité vlastnosti těchto procesorů.

Programovatelné grafické potrubí

Programovatelný vertexový procesor

Následující obrázek ukazuje typický programovatelný vertexový procesor. Model datového toku ačíná načtením každého atributu vertexu (jako pozice, barva, souřadnice textur atd.) do vertexového procesoru.

Model datového toku v programovatelném vertexovém procesoru

Vertexový procesor pak opakovaně zachytává další instrukci a provádí ji dokud se vertexový program neukončí. Instrukce vstupují do mnoha odlišných sad registrů které obsahují vektorové hodnoty jako je pozice, normála nebo barva. Registry určené atributům vektoru jsou pouze ke čtení a obsahují aplikačně-závislou sadu atributů vertexu. Do dočasných registrů lze číst i zapisovat a používají se k výpočtu mezivýsledků. Výstupní registry slouží pouze k zápisu. Za zapisování výsledků do těchto registr je zodpovědný proogram sám. Když se vertexový program ukončí, výstupní registry obsahují nově transformovaný vertex. PO fázi sestavení trojúhelníků a rasterizaci jsou interpolované hodnoty každého registru předány do fragmentového procesoru.

Větší část zpracování vertexů používá limitovanou sadu operací. Nezbytné jsou vektorové operace s plovoucí desetinnou čárkou na dvou, tří nebo čtyřsložkových vektorech. Tyto operace zahrnují sčítání, násobení, násobné sčítání (multiply-add), skalární součin, minimum a maximum. Hardwarová podpora pro negaci vektoru a složkově-závislé míchání (schopnost náhodně přeuspořádat složky vektoru) zobec��uje tyto instrukce pro matematické operace s vektory aby poskytovaly negaci, odečítání a vektrový součin. Složkově-závislé maskování kontroluje výstup všech instrukcí. Kombinování operací recipročních (reciprocal) a recipročního odmoc��ování (reciprocal square root) s násobením a skalárními součiny umož��uje dělení vektoru skalárem a normalizaci vektoru. Exponenciální, logartmické a trigonometrické výpočty jsou základem pro osvětlování, mlhu a geometrických výpočtů. Specializováné instrukce mohou zlehčit výpočet funkcí pro osvětlování a slábnutí.

V nenovějších programovatelných vertexových procesorech je také dostupná další funkcionalita jako je relativní adresování konstant a kontrola datového toku pro větvení a opakování.

Programovatelný fragmentový procesor

Programovatelné fragmentové procesory vyžadují mnoho stejných matematických operací jako programovatelné vertexové procesory, ale také podporují operace s texturami. Texturovací operace umož��ují procesoru přístup k obrázku textury pomocí sady souřadnic textury a poté navrátit filtrovaný vzorek obrázku textury.

Novější GPU nabízí podporu hodnoty s plovoucí desetinnou čárkou; starší GPU mají více limitované celočíselné datové typy. I když jsou k dipozici operace v plovoucí desetinné čárce, operace s fragmenty jsou efektivnější s méně přesnými datovými typy. GPU musí zpracovávat mnoho fragment najednou, takže větvení není dostupné v současných generacích GPU, ale to se pravděpodobně časem změní jak půjde hardware dopředu.

Model datového toku v programovatelném fragmentovém procesoru

Cg dovoluje napsat fragmentový program který se větví a iteruje simulováním konstrukcí s podmínečným přiřazením nebo rozbalováním cyklů.

Předchozí obrázek ukazuje tok v současném fragmentovém procesoru. Stejně jako v programovatelném vertexovém procesoru, datový tok obsahuje provádění sledu instrukcí dokud se program neukončí. Opět zde lze najít sadu vstupních registrů. Avšak spíše než vertexové atributy, vstupní registry fragmentového procesoru určené pouze pro čtení obsahují interpolované parametry každého fragmentu odvozené z parametrů primitiva fragmentu. Dočasné registry pro čtení/zápis obsahují mezivýsledky. Zapisovací operace do výstupních registrů zapisují barvu a občas i novou hloubku fragmentu. Instrukce fragmentového programu zahrnují i zachytávání textur.

1.2.5 Cg poskytuje programovatelnost vertexů a fragmentů

Tyto dva nové programovatelné procesory v GPU vyžadují, aby programátor poskytl program který má každý z procesorů vykonat. To co poskytuje Cg je jazyk a překladač který umí přeložit stínovací algoritmus do formy kterou může GPU zpracovat. S Cg lze vytvořit snadněji program na úrovni velmi podobné programům napsaným v C spíše než program který je na tak nízké úrovni jaká je popsána na předchozích dvou obrázcích.

1.3 Historický vývoj Cg

Dědictví Cg pochází ze tří zdrojů, jak je vidět na obrázku níže. Zaprvé, Cg zakládá svou syntaxi a sémantiku na programovacím jazyku C. Zadruhé, Cg zahrnuje mnoho konceptů ze stínovacích jazyků nepreacujících v reálném čase jako je RenderMan, stejně jako dřívějšícj jazyků vyvinutých na akademické půdě. Zatřetí, Cg zakládá svou grafickou funkcionalitu na OpenGL a Direct3D API pro 3D úlohy v reálném čase.

Zdroje technologického dědictví Cg

Následující obrázek ukazuje obecné programovací jazyky, 3D API a stínovací jazyky které inspirovaly vývoj Cg.

Dříve jsme se zmínili o tom jak Cg pozvedává syntaxi a sémantiku jazyka C. Během kurzu v této knize zjistíme, že Cg většinou dělá to co by programátoři v C očekávali. Cg se liší od C v situacích kdy jak specializace Cg nebo požadavky výkonnost ospravedl��ují takovou změnu.

1.3.1 Spolupráce Microsoftu a nVidie na vývoji Cg a HLSL

nVidia a Microsoft spolupracovaly na vývoji jazyka Cg. Microsoft nazývá svou implementaci vysokoúrov��ový stínovací jazyk (High-Level Shading Language), neboli HLSL. HLSL a Cg jsou jeden jazyk ale různá jména odráží různé technologie které každá společnost používá. HLSL je součástí Microsoft DirectX Graphics, tedy komponenty DirectX 9 multimédií. Direct3D je 3D komponent Microsoft DirectX Graphics. Cg je nezávislé na 3D programovacím rozhraní a lze jej plně integrovat s Direct3D i OpenGL. Správně napsaná Cg aplikace funguje jak s OpenGL, tak i s Direct3D.

Tato flexibilita znaměná že implementace Cg od nVidie umož��uje vlastnit programy které pracují s oběma dominantními 3D rozhraními nezávisle na tom jaký operační systém si vyberete. Cg funguje ať už si vyberete Windowws, Linux, Mac OS X, herní konzoli nebo jiný 3D hardware jako platformu. Cg programy fungují na hardware od různých výrobců protože Cg spoléhá na Direct3D nebo OpenGL. Cg programy fungují na programovatelných GPU od všech významných výrobců hardware, jako je 3D Labs, ATi, Matrox a nVidia.

Podpora od různých výrobců hardware, možnost použít více API a multiplatformita Cg činí tento jazyk tou nejlepší volbou při psaní programů pro programovatelné GPU.

1.3.2 Neinteraktivní stínovací jazyky

Standardní rozhraní RenderMan popisuje nejvíce známý stínovací jazyk pro neinteraktivní stínování. Pixar vyvinul tento jazyk na konci osmdesátých let k vytvoření vysoce kvalitní počítačové animace s jemným stínováním pro tvorbu filmů a reklam. Pixar vytvořil kompletní renderovací systém implementováním vlastního standardního rozhraní RenderMan, PRMan (PhotoRealistic RenderMan). RenderMan Shading Language je pouze jednou komponentou systému.

Stínovací stromy

Inspirací k vytvoření RenderMana vzešla z dřívějšího nápadu stínovacích stromů. Rob Cook, v té době u Lucasfilmu a který později odešel k Pixaru, publikoval v roce 1984 na konferenci SIGGRAPH dokument o stínovacích stromech. Stínovací strom uspořádává různé stínovací operace jako uzly ve stromové struktuře. Následující obrázek ukazuje stínovací strom pro vykreslování měděného povrchu. Listy uzlů jsou vstupní data která stínovacího stromu. Uzly bez listů představují jednoduché dílčí stínovací operace. Během renderovacího procesu renderer vyhodnocuje stínovací strom asociovaný s daným povrchem aby mohl určit barvu povrchu ve výsledném renderovaném obraze. Aby vyhodnotil stínovací strom, renderer provádí stínovací operace spojené s nejvyšším uzlem ve stínovacím stromu.

Příklad stínovacího stromu založeného na původním SIGGRAPH dokumentu Roba Cooka

Avšak aby se vyhodnotil daný uzel, musí renderer nejprve vyhodnotit potomky uzlu. K plnému vyhodnocení stromu se používá rekurze. Výsledkem vyhodnocení stínovacího stromu v konkrétním bodu na povrchu je barva tohoto bodu.

Stínovací stromy vzešly z myšlenky že jeden před definovanástínovací by nikdy nestačil pro všechny objekty a scény které by bylo potřeba renderovat.

Diagramy stínovacích stromů jsou skvělé pro vizualizaci datového toku stínovacích operací. Avšak pokud jsou stínovací stromy složité, stanou se jejich diagramy nepraktickými. Výzkumnící v Pixaru i jinde zjistili že každý stínovací strom je limitovaný typem programu. Tento poznatek byl popudem pro nový druh programovacího jazyka známehé jako stínovací jazyk.

Stínovací jazyk RenderMan

Stínovací jazyk RenderMan vzešel ze stínovacích stromů a poznatku že potřeba volné kontroly vzhledu renderovaných povrchů vedoucí k fotorealismu vyžaduje programovatelnost.

Většina dnešních neinteraktivních rendererů používaných v produkci ma nějaký druh podpory stínovacího jazyka. Stínovací jazyk RenderMan je nejvíce zažitým a známým jazykem pro neinteraktivní renderování a na konci devadesátých let byl významně renovován a rozšířen.

Hardwarově přizpůsobitelné stínovací jazyky

Hardwarová implementace algoritmu je nejefektivnější když se úloha rozloží do dlouhé sekvence kroků kde je každý krok limitován krokem předchozím a jednotlivými podkroky (to znamená, že kroky mohou být pospojovány).

Vertexové a fragmentové potrubí popsané v sekci 1.2 je extrémně přizpůsobivé hardwarové implementaci. Avšak Reyesův algoritmus používaný v jazyce PR RenderMan není příliš vhodný pro efektivní hardwarovou implementaci, hlavně kvůli vysokoúrov��ovému přístupu ke geometrii. Současné GPU spoléhají kompletně na grafické potrubí založené na vertexech a fragmentech.

Výzkumníci na univerzitě v Severní Karolíně (UNC) začali zkoumat programovatelný grafický hardware v polovině devadesátých let, kdy UNC vyvíjela novou grafickou hardwarovou architekturu nazvanou PixelFlow. Tento projekt započal novou linii výzkumu grafického hardware a hardwarově přizpůsobivých stínovacích jazyků Marca Olanoa a ostatních na uNC. Nanštěstí byl PixelFlow příliš drahý a komerčně tak neuspěl.

Následně pak výzkumníci v Silicon Graphics pracovali na systému překladu stínovacích programů do více průchodů při renderování OpenGL. I když hardware s OpenGL v té době nebyl programovatelný ve smyslu dnešních GPU, stínovací systém OpenGL provádí opakované průchody aby dosáhl požadovaného záměru.

Výzkumníci ze Stanfordovy univerzity, včetně Kekoy Proudfoota, Billa Marka, Svetoslava Tzvetkova a Pata Hanrahana, začali budovat stínovací jazyk navržený pro druhou a třetí generaci GPU. Tento jazyk, známý jako stanfordský stínovací jazyk v reálném čase (Stanfrod Real-Time Shading Language, čili RTSL), mohl přeložit stínovací programy napsané v RTSL do jednoho nebo více průchodů v OpenGL.

Výzkum na Stanfordově univerzitě inspiroval nVidii k vlastnímu vývoji hardwarově přizpůsobitelného stínovacího jazyku komerční kvality. Bill Mark se v roce 2001 přidal k nVidii aby vedl úsilí o definici a implementaci stínovacího jazyka který dnes nazýváme Cg. Během tohoto procesu komunikovala nVidia s firmou Microsoft na dohodě o společné syntaxi a vlastnostech.

1.3.3 Programovací rozhraní pro 3D grafiku

Třetím vlivem působícím na Cg byla dvojice standardů programovacích rozhraní pro 3D, OpenGL a Direct3D. Vliv těchto proramovacích rozhraní na Cg je neustálý.

1.4 Prostředí Cg

Cg je jen jednou složkou celé softwarové a hardwarové infrastruktury pro renderování komplexních 3D scéna programovatelnými GPU v reálném čase. Tato sekce vysvětluje jak Cg interaguje s aktuálními 3D aplikacemi a hrami.

Standardní 3D programovací rozhraní: OpenGL a Direct3D

V dávných časech 3D grafiky na PC (předtím než byly GPU), se CPU staralo o všechny vertexové transformace a operace s pixely vyžadující renderování 3D scény. Grafický hardware poskytoval jen paměť pro pixely které zobrazoval na obrazovku. Programátoři museli implementovat své vlastní renderovací algoritmy k vykreslení 3D grafiky v software. V jistém smyslu bylo tehdy co se týká zpracování vertexůa fragmentů kompletně programovatelné. naneštěstí CPU byla příliš slabá na produkci zajímavých 3D efektů.

Dnes, 3D aplikace už neimplementují jejich vlastní renderovací algoritmy pro 3D grafiku pomocí CPU; raději se spoléhají na OpenGL nebo Direct3D, dvě standardní programovací rozhraní pro 3D, které komunikují s CPU.

OpenGL

na počátku devadesátých let vyvinula společnost Silicon Graphics knihovnu OpenGL ve spolupráci s organizací nazvanou OpenGL Architecture Review Board (ARB), která spojila hlavní výrobce grafických systémů. Původně OpenGL běžela jen na výkonných UNIXových grafických stanicích. Microsoft, zakládající člen ARB potom implementoval podporu OpenGL aby podpořil 3D grafiku pro svůj operační systém Windows NT. Později Microsoft přidal podporu OpenGL do Windows 95 a všech následujících operačních systémů.

OpenGL není omezeno na jeden operační nebo zobrazovací systém. K podpoře UNIXových stanic a OS Windows na PC, OpenGL je podporována také Apple na osobních počítačích Macintosh. Uživatelé Linuxu mohou použít buď otevřenou implementaci OpenGL nazývanou Mesa nebo harwarově akcelerovanou implementaci jako je ta nVidia OpenGL pro Linux. Tato flexibilita dělá z OpenGL nejlepší multiplatformní programovací rozhraní v oboru 3D grafiky.

Za poslední desetiletí se OpenGL rozvinula sspolu s grafickým hardware. OpenGL je rozšiřitelná, což znamená že implementátoři OpenGL mohou inkrementálně přidávat novou funkcionalitu. To se týká i standardizovaných rozšíření ARB pro programovatelnost vertexů a fragmentů. Jakmile jsou rozšíření široce přijata, stávají se obvykle součástí jádra OpenGL standardu takže standard jako celek pokročí kupředu. V době psaní této knihy je dostupná OpenGL verze 1.4. Neustálá práce na vývoji OpenGL se děje na pozadí prací různých OpenGL ARB skupin. Tato práce zahrnuje programovací rozhraní jak na úrovni assembleru tak vysokoúrov��ová rozhraní. Protože Cg funguje jako vrstva nad těmito rozhraními, bude fungovat i s budoucími revizemi OpenGL.

Direct3D

Microsoft začal s vývojem programovacího rozhraní Direct3D kolem roku 1995 jako částí multimediálního balíčku DirectX. Microsoft uvedl DirectX a Direct3D aby nastartoval spotřebitelský trh pro 3D grafiku, částečně i kvůli hrám, na Pc s Windows. Herní konzole Xbox podporuje Direct3D také. Direct3D je nejvíce populární API pro hry na Windows díky minulosti protože nejvíce odpovídá schopnostem dostupného grafického hardware.

Téměř každý rok Microsoft aktualizuje DirectX, včetně Direct3D, aby udržel rychlost s inovací hardware na PC. V době psaní této knihy je aktuální verze DirectX 9.0, která zahrnuje HLSL, Microsoft implementaci stejné jazykové syntaxe a konstrukcí jako je Cg.

Zmírnění napětí mezi programovacími rozhraními pro 3D

Před pár lety rozhraní OpenGL a Direct3D soupeřila mezi sebou aby se vidělo která z nich by mohlo dominovat na Windows PC. Tato soutěž pokračuje pro obě rozhraní dobře, a každé zvýšilo svou výkonnost, kvalitu a funkcionalitu. V oblasti programovatelnosti GPU, na kterou se Cg zaměřuje, mají obě programovací rozhraní srovnatelné schopnosti. To proto že OpenGL i Direct3D běží na stejněm GPU hardware a tento grafický hardware určuje funkcionalitu a výkon. OpenGL má lehkou výhodu ve funkčnosti protože výrobci hardware jsou schopni lépe zviditelnit svoji sadu nových vlastností skrze OpenGL, i když tato specifická rozšíření vývojářům komplikují život.

Většina sofwarových vývojářů si nyní vybírá programovací rozhraní pro 3D podle vlastní chuti, historie a jejich cílovém trhu a hardwarové platformě spíše než podle technických specifikací.

Cg podporuje obě programovací rozhraní. Můžete napsat programy v Cg které budou fungovat jak s OpenGL tak s Direct3D programovacím rozhraním. To je velká výhoda pro vývojáře 3D obsahu. Mohou spojit jejich 3D obsah s programy napsanými v Cg a potom jej renderovat bez ohledu jaké progamovací rozhraní bude konečná aplikace používat pro renderování 3D.

1.4.2 Cg překladač a běhové prostředí

Žádná GPU nemůže vykonat Cg program přímo v jeho textové podobě. Proces známý jako překlad musí přeložit Cg programy do formy kterou GPU může vykonat. Cg překladač prvně přeloží Cg program do formy která je přijatelná pro vybrané progamovací rozhraní v 3D, ať už OpenGL nebo Direct3D. Potom aplikace pošle OpenGL nebo Direct3D formu Cg programu do GPU pomocí příslušných OpenGL nebo Direct3D příkazů. OpenGl nebo Direct3D ovladač provede konečný překlad do formy kterou může hardware dané GPU vykonat.

Detaily tohoto překladu závisí na kombinaci schopností GPU a programovacího rozhraní pro 3D. Způsob jakým Cg program přeloží svou OpenGl nebo Direct3D meziformu záleží na typu a generaci GPU v počítači. Může se stát že GPU nepodporuje část Cg programu z důvodu vlastních omezení GPU. Například Cg fragmentový program se nepřeloží pokud program bude přistupovat k více texturovacím jednotkám než cílová GPU podporuje.

Podpora dynamického překladu

Když překládáte program napsaný v klasickém programovacím jazyce jako je C nebo C++, je překlad statický. Překladač přeloží program do spustitelného souboru který běží přímo na CPU. Program stačí přeložit jen jednou a nemusíme ho překládat znovu pokud nezměníme kód programu. To nazýváme statický překlad.

Cg se liší tím že nabízí dynamický překlad, i když statický překlad je taky podporován. Cg překladač není samostatný program ale součást knihovny známé jako běhové prostředí Cg. 3D aplikace a hry používající Cg programy musí být s tímto prostředím spojeny. Apliakce používající Cg pak volají funkce běhového prostředí Cg, které mají předponu cg aby přeložily Cg programy. Dynamický překlad umož��uje Cg programům optimalizaci pro danou GPU v počítači uživatele.

CgGL a CgD3D, specifické knihovny 3D API

Cg poskytuje navíc k jádru Cg dvě příbuzné knihovny. Pokud vaše aplikace používá OpenGL, použijete k volání příslušné OpenGL funkce knihovnu CgGL která předá přeložený Cg program ovladači OpenGL. Stejně tak, pokud vaše aplikace používá Direct3D, použijete CgD3D knihovnu k volání příslušné Direct3D funkce která předá přeložený Cg program ovladači Direct3D. Normálně byste použili buď CgGL nebo CgD3D, ale ne obojí, protože většina aplikací používá buď OpenGL nebo Direct3D, ne obojí.

V porovnání s jádrem Cg běhové knihovny která obsahuje Cg překladač jsou CgGL a CgD3D knihovny relativně malé. Jejich práce je uskutečnit příslušné OpenGL nebo Direct3D volání nunté ke konfiguraci Cg programů pro jejich vykonání. Tato volání pošlou přeložený Cg program příslušnému ovladači který dále přeloží program do formy kterou GPU může vykonat. Funkce CgGL knihovny začínají na cgGL; funkce CgD3D knihovny začínají na cgD3D.

Jak běhové prostředí Cg zapadá do vaší aplikace

Následující obrázek ukazuje jak typická 3D aplikace používá knihovny Cg. Pokd jste programátor(ka), budete se nejspíše chtít naučit víc o běhovém prostředí Cg a specifické knihovně 3D API kterou vaše aplikace používá k renderování 3D grafiky. Většina této knihy se zaměřuje na jazyk Cg samotný a na to jak psát programy v Cg, ale Příloha B obsahuje více informací o běhové knihovně Cg.

Jak Cg zapadá do standardní Cg aplikace

1.4.3 CgFX Toolkit a formát souborů

Cg programy potřebují 3D modely, textury a ostatní data se kterými mohou pracovat. Cg program bez dat je k ničemu. Cg programy a data také vyžadují vhodné nastavení a stav programovacího rozhraní pro 3D. Často pomůže mít způsob jak zabalit všechny informace nutné k renderování 3D modelu, včetně Cg programů s tím spojených.

Co CgFX umož��uje

CgFX je standardizovaný formát souboru určený k reprezentaci kompletních efektů a vzhledů. Stejně jako s Cg, Microsoft a nVidia spolupracovaly na vývoji CgFX formátu. CgFX jsou textové soubory se syntaxí která je nadmnožinou syntaxe Cg a může obsahovat jakékoli množství Cg programů. CgFX soubory lze poznat podle přípony .fx. Soubor CgFX popisuje kompletní renderovací stav dílčího efektu: vícenásobné průchody, stavy textur a jakýkoli počet jednotlivých vertexových a fragmentových programů které lze definovat k vytvoření uceleného vzhledu nebo dosažení efektu. Pro používání a parsování CgFX souborů je k dispozici doprovodný vývojářský balíček. Balíček nabízí uživatelské rozhraní i pro aplikace, takže aplikace využívající CgFX mohou automaticky nabídnout kontrolu a sémantiku uživatelům a rovněž vývojářům.

Cg programy popisují zpracování vertexů nebo fragmentů které probíhá v jednom renderovacím průchodu, ale některé komplexní stínovací algoritmy vyžadují průchodů více. CgFX nabízí formát k zakódování komplexních víceprůchodových efektů, včetně možnosti určit který Cg program je použit pro každý renderovací průchod.

Konkrétněji, CgFX podporuje navíc tři vlastnosti oproti tomu co nabízí samotné jádro jazyka Cg:

  1. CgFX posyktuje mechanismus pro určování více renderovacích průchodů a volitelné vícenásobné implementace jednoho efektu.
  2. CgFX vám dovoluje určit neprogramovatelné renderovací stavy, jako módy alfa testu a filtrování textur. Nastavení pro tyto renderovací stavy může být formou jednoduchých výrazů, které jsou vyhodnocovány v CPU při inicializaci efektu.
  3. CgFX dovoluje přidat k stínovacím programům a parametrům anotace. Tyto anotace poskytují dodatečné informace aplikacím, včetně aplikací pro tvorbu 3D obsahu. Například anotace může specifikovat povolený rozsah hodnot pro parametr stínovacího programu.

Mnohonásobné stínovací programy

cgFX formát souborů zapouzdřuje mnohonásobné implementace Cg programů daného stínovacího programu. To znamená že že můžete mít napsaný jeden Cg stínovací program pro GPU třetí a čtvrté generace, a současně také jednodušší program pro podporu méně schopné GPU druhé generace. Aplikace načítající CgFX soubor pak může za běhu určit tu nejvhodnější implemenataci stínovacího programu který má použít na základě GPU dostupné v počítači.

Mnohonásobné definice Cg programů pomocí CgFX je ednou cestou jak se vypořádat s různou funkcionalitou GPU různých generací různých výrobců hardware. Mnohonásobné definice vám také dovolí vyvinout Cg program specializovaný na určité 3D API - například, pokud OpenGL nabízí větší funkcionalitu skrze nějaké rozšíření. V jediném CgFX souboru mohou být obsaženy specializované programy pro Direct3D, standardní OpenGL nebo OpenGL s různými rozšířeními.

CgFX a digitální tvorba obsahu

CgFX Toolkit sestává z překladače CgFX, který podporuje celou syntaxi CgFX; CgFX API běhového prostředí pro načítání a manipulaci s CgFX soubory; zásuvné moduly aplikací pro tvorbu digitálního obsahu (DCC - Digital Content Creation) jako je Alias|Wavefront Maya a Discreet 3DS Max. Následující obrázek ukazuje použití CgFX v těchto aplikacích. SoftImage|XSI 3.0 poskytuje přímou podporu pro překlad Cg ve svém renderovacím stromu.

Před příchodem Cg neexistoval standardní způsob jak by měla DCC aplikace exportovat 3D obsah se všemi asociovanými informacemi o stínování nutnými k renderování obsahu v reálném čase. Dnes hlavní DCC aplikace používají CgFX ve svém procesu tvorby obsahu a podporují ho. To znamená že CgFX může znatelně zlepšit tok uměleckých návrhů z DCC aplikací do her a jiných 3D aplikací pracujcích v reálném čase. Použitím CgFX mohou umělci vidět a upravovat Cg stínovací programy a s nimi spojený 3D obsah ze své pblíbené DCC aplikace a kontrolovat jak bude jejich práce vypadat v 3D hře nebo aplikaci.

Aplikace pro tvorbu digitálního obsahu používající Cg a CgFX

Jak CgFX zapadá do vaší aplikace

Následující obrázek ukazuje jak je soubor CgFX obsahující mnohonásobné definice stínovacích programů použit v aplikaci ve spojení s Cg běhovým prostředím a vaším vybraným 3D API. Většina této knihy se zaměřuje na jazyk Cg samotný a na to jak psát Cg programy, spíše naž na CgFX, můžete nahlédnout pro více informací do Přílohy C kde najdete podrobnosti o formátu souborů CgFX a API běhového prostředí.

Jak CgFX zapadá do standardní aplikace

Dále v tutoriálu

Dokončením tohoto úvodu do programovacího jazyka Cg jste nyní připraveni na další lekce tutoriálu, který vás naučí jak psát Cg programy.

Cvičení

Cvičení na konci každé kapitoly vám pomůže zopakovat si vaše znalosti a vyvinout praktické programovací dovednosti.

  1. Zodpovězte: Vyjmenujte dvě standardní 3D programovací rozhraní pro které můžete přeložit Cg program. Které operační systémy podporují dané programovací rozhraní?
  2. Zodpovězte: Jaké jsou hlavní jednotky grafického potrubí? V jakém pořadí jsou tyto jednotky uspořádany?
  3. Zodpovězte: Ve které části potrubí se provádí vertexové a fragmentové programy?
  4. Zodpovězte: Co je to vertex? Co je to fragment? Odlište fragment od pixelu.
  5. Zkuste sami: Ještě jsme nezačali psát Cg programy (dostaneme se k tomu brzy v další kapitole), takže si odpoči��te a podívejte se na dobrý, počítačově animovaný film jako třeba Monsters Inc.

1.6 Další literatura

Cg staví na konceptech návrhů jiných počítačových jazyků, na návrhu počítařového hardware a počítačové grafice. Být spravedlivý ke všem v kontextu tohoto tutoriálu však není vždy příliš praktické. To o co se snažíme v sekci "Další literatura" na konci každé kapitoly je nabídnout vám ukazatele abyste se mohli naučit více o základech které jsou podkladem témat v každé kapitole.

Existuje mnoho knih o C. The C Programming Language, Third Edition (Prentice Hall, 2000), Brian Kernighan a Dennis Ritchie, je klasika; autoři vytvořili jazyk C. Cg obsahuje koncepty jak z C tak z C++. Momentálně lze najít více knih o C++ než o C. Klasika o C++ je The C++ Programming Language, Third Edition (Addison-Wesley, 2000), Bjarne Stroustrup, který tento jazyk vytvořil.

Chcete-li vědět víc o stínovacím jazyku RenderMan, přečtěte si The RenderMan Companion: A Programmer's Guide to Realistic Computer Graphics (Addison-Wesley, 1989), Steve Upstill. Pat Hanrahan a Jim Lawson uveřejnili SIGGRAPH dokument o RenderManovi nazvaný "A Language for Shading and Ligting Calculations" (ACM Press) v roce 1990.

SIGGRAPH dokument Roba Cooka z roku 1984 nazvaný "Shade Trees" (ACM Press) motivoval k vývoji RenderMana.

Vývoj programovatelného grafického harware a s ním spojených jazyků je aktivním a přínosným výzkumem již po více než jedno desetiletí. Anselmo Lastra, Steven Molnar, Marc Olano a Yulan Wang z UNC publikovali v roce 1995 dokument z ranného stádia výzkumu nazvaný "Real-Time Programmable Shading" (ACM Press). Výzkumníci z UNC také publikovali mnoho dokumentů a jejich programovatelné architektuře PixelFlow. Marc Olano a Anselmo Lastra publikovali v roce 1998 SIGGRAPH dokument nazvaný "A Shading Language on Graphics Hardware: The PixelFlow Shading System" (ACM Press).

Kekoa Proudfoot, Bill Mark, Svetoslav Tzvetkov a Pat Hanrahan publikovali v roce 2001 SIGGRAPH dokument nazvaný "A Real-Time Procedural Shading System for Programmable Graphics Hardware" (ACM Press) který popisuje stínovací jazyk pro GPU vyvinutý na Stanfordu.

Real-Time Rendering, Second Edition (A. K. Peters, 2002), napsaná Ericem Hainesem a Tomasem Akenine-Mollerem, je vynikajícím zdrojem dalších informací o grafickém hardware a technikách interakce.

The OpenGL Graphics System: A Specification dokumentuje OpenGL 3D programovací rozhraní. Nejlepším tutoriálem k programování s OpenGL je OpenGL Programming Guide: The Official Guide to Learning OpenGL, Third Edition (Addison-Wesley, 1999), Mason Woo, Jackie Neider, Tom Davis a Dave Shreiner. Mnohem více informací lze najít na www.opengl.org.

Dokumentace k programovacímu rozhraní Direct3D je k dispozici na stránkách firmy Microsoft msdn.microsoft.com

nVidia poskytuje další informace o běhovém prostředí Cg, CgFX a Cg samotném na svém webu pro vývojáře developer.nvidia.com