Cg

Cg (zkratka pro C pro grafiku [1] ) je programovací jazyk na vysoké úrovni vyvinutý společností Nvidia v úzké spolupráci s Microsoftem pro programování shaderů . Cg je založeno na programovacím jazyce C. I když sdílejí stejnou syntaxi , některé funkce C byly změněny a přidány nové datové typy, aby se Cg více hodil pro programování GPU . Tento jazyk se specializuje na programování GPU a nepoužívá se pro GPGPU . Výstup kompilátoru Cg poskytuje programy pro shadery DirectX nebo OpenGL . Od roku 2012 je Cg zastaralá, bez další podpory. [2]

Obecné informace

Díky technologickému pokroku v počítačové grafice se některé oblasti programování 3D grafiky staly poměrně složitými. Pro zjednodušení procesu byly do grafických karet přidány nové funkce, včetně možnosti měnit jejich vykreslovací kanály pomocí shaderů.

Na začátku byly shadery programovány na velmi nízké úrovni a pouze v jazyce symbolických instrukcí . Přestože použití jazyka symbolických instrukcí dalo programátorovi úplnou kontrolu nad kódem a flexibilitu, bylo poměrně obtížné jej používat. Pro programování GPU bylo zapotřebí pohodlnějšího vysokoúrovňového jazyka, takže bylo vytvořeno Cg, aby tyto problémy vyřešilo a usnadnilo vývoj shaderů.

Některé z výhod Cg:

Podrobnosti

Datové typy

Cg má šest základních datových typů . Některé z nich jsou stejné jako v C, ale jsou zde další přidané speciálně pro programování GPU. Jedná se o tyto typy:

Cg také obsahuje vektorové a maticové datové typy založené na základních datových typech jako float3a float4x4. Tyto datové typy jsou při práci s 3D programováním zcela běžné. Cg má také datové typy struktury a pole, které fungují podobně jako jejich ekvivalenty v jazyce C.

Operátoři

Cg podporuje širokou škálu operátorů, včetně obecných aritmetických operátorů z C, ekvivalentních aritmetických operátorů pro vektorové a maticové datové typy a obecných logických operátorů.

Funkce a struktury managementu

Cg podporuje základní řídicí struktury C, jako jsou if ... else, whilea for. Má také podobný způsob definování funkcí.

Cg Standardní knihovna

Stejně jako C má Cg sadu funkcí pro běžné programovací úlohy GPU. Některé funkce mají ekvivalenty C, jako jsou matematické funkce absa sin, zatímco jiné jsou specializované na úlohy grafického programování, jako jsou funkce mapování textur tex1Da tex2D.

Cg runtime knihovna

Cg programy jsou jen shadery a potřebují podpůrné programy, které zvládnou zbytek procesu vykreslování. Cg lze použít se dvěma grafickými API : OpenGL nebo DirectX . Každý z nich má vlastní sadu funkcí pro komunikaci s programem Cg, jako je nastavení aktuálního Cg shaderu, předávání parametrů atd.

Kromě schopnosti kompilovat zdrojový kód Cg pro sestavení má běhové prostředí Cg také schopnost kompilovat shadery za běhu podpůrného programu. To umožňuje zkompilovat shader s nejnovějšími optimalizacemi dostupnými pro hardware , na kterém program aktuálně běží. Tato metoda však vyžaduje, aby zdrojový kód shaderu byl kompilátoru k dispozici jako prostý text, což uživateli programu umožňuje přístup ke zdrojovému kódu shaderu. Někteří vývojáři to vidí jako hlavní nevýhodu této techniky.

Abychom se vyhnuli odhalení zdrojového kódu shaderu a stále podporovali některé specifické optimalizace hardwaru, byl vyvinut koncept profilů. Shadery lze sestavit podle různých platforem grafického hardwaru (podle profilů). Po spuštění podpůrného programu se načte nejvíce optimalizovaný shader podle jeho profilu. Například může existovat profil pro grafickou kartu , která podporuje složité shadery, a jiný profil, který podporuje pouze minimální shadery. Vytvořením shaderu pro každý z těchto profilů podpůrný program zvyšuje počet podporovaných hardwarových platforem bez obětování kvality obrazu na výkonných systémech.

Příklad Cg shaderu

// vstup vertex struct VertIn { float4 pos : POSITION ; barva float4 : COLOR0 ; }; // výstup vertex struct VertOut { float4 pos : POSITION ; barva float4 : COLOR0 ; }; // vertex shader main entry VertOut main ( VertIn IN , jednotný float4x4 modelViewProj ) { VertOut OUT ; OUT . pos = mul ( modelViewProj , IN . pos ); // výpočet výstupních souřadnic OUT . barva = IN . barva ; // kopírování vstupní barvy na výstup OUT . barva . z = 1,0 f ; // modrá složka barvy = 1.0f return OUT ; }

Poznámky

  1. Cg FAQ . Získáno 7. září 2018. Archivováno z originálu 7. září 2018.
  2. Cg Toolkit | Vývojář NVIDIA . Získáno 7. září 2018. Archivováno z originálu 7. září 2018.