Cg (programovací jazyk) - Cg (programming language) - Wikipedia
Scéna obsahující několik různých shaderů 2D HLSL. Zkreslení sochy je dosaženo čistě fyzicky, zatímco struktura obdélníkového rámečku vedle ní je založena na intenzitě barev. Náměstí v pozadí bylo transformovaný a otočeno. Částečné průhlednost a odraz vody v popředí jsou přidány shaderem aplikovaným nakonec na celou scénu. | |
Rodina | stínovací jazyk |
---|---|
Vývojář | nVIDIA, Microsoft |
webová stránka | vývojář |
Dialekty | |
Cg, HLSL, Playstation Shading Language | |
Ovlivněno | |
C, Stínovací jazyk RenderMan | |
Ovlivněno | |
GLSL |
Cg (zkratka pro C pro grafiku) a Stínovací jazyk na vysoké úrovni (HLSL) jsou dvě jména daná vysoké úrovni stínovací jazyk vyvinutý uživatelem Nvidia a Microsoft pro programování shadery. Cg / HLSL je založen na Programovací jazyk C. a ačkoli sdílejí stejnou základní syntaxi, byly některé vlastnosti C upraveny a byly přidány nové datové typy, aby Cg / HLSL bylo vhodnější pro programování jednotky grafického zpracování.[1][2]
Existují dvě hlavní větve jazyka Cg / HLSL: kompilátor Nvidia Cg (cgc), který poskytuje výstup DirectX nebo OpenGL a Microsoft HLSL, který vydává shadery DirectX ve formátu bytecode.[3][4] Cvid společnosti Nvidia byl zastaralé v roce 2012, bez dalšího vývoje nebo podpory k dispozici.[5]
Shadery HLSL mohou umožnit hluboké zvýšení rychlosti a detailů stejně jako mnoho dalších zvláštní efekty ve 2D i 3D počítačová grafika. Jazyk Cg / HLSL původně obsahoval pouze podporu pro shadery vrcholů a shadery pixelů, ale postupně byly zavedeny i další typy shaderů:
- Představeno rozhraní DirectX 10 (Shader Model 4) a Cg 2.0 shadery geometrie.[6]
- Představeno rozhraní DirectX 11 (Shader Model 5) vypočítat shadery (GPGPU ) a shadery teselace (trup a doména). Ten je přítomen v Cg 3.1.
- Představeno rozhraní DirectX 12 (Shader Model 6.3) sledování paprsku shadery (generování paprsků, průnik, bit / nejbližší zásah / miss).
Pozadí
Kvůli technickému pokroku v grafickém hardwaru se některé oblasti programování 3D grafiky staly poměrně složitými. Pro zjednodušení procesu byly na grafické karty přidány nové funkce, včetně možnosti upravit jejich vykreslovací kanály pomocí shaderů vrcholů a pixelů.
Na začátku byly vertexové a pixelové shadery programovány na velmi nízké úrovni, pouze s montážním jazykem jednotky pro zpracování grafiky. Přestože použití montážního jazyka dalo programátorovi úplnou kontrolu nad kódem a flexibilitou, jeho použití bylo poměrně těžké. K programování GPU byl potřeba přenosný jazyk vyšší úrovně, a proto byl vytvořen Cg, aby tyto problémy překonal a usnadnil vývoj shaderu.
Některé z výhod používání Cg přes montáž jsou:
- Kód na vysoké úrovni se snadněji učí, programuje, čte a udržuje než kód sestavení.
- Cg kód je přenosný na širokou škálu hardwaru a platforem, na rozdíl od montážního kódu, který obvykle závisí na hardwaru a platformách, pro které je napsán.
- Kompilátor Cg může optimalizovat kód a automaticky provádět úkoly na nižší úrovni, které je těžké provést a náchylné k chybám v sestavení.
Jazyk
Typy dat
Cg má šest základních datových typů. Některé z nich jsou stejné jako v jazyce C, zatímco jiné jsou přidány zejména pro programování GPU. Jsou to tyto typy:
- plovák - 32bitové číslo s plovoucí desetinnou čárkou
- polovina - 16bitové číslo s plovoucí desetinnou čárkou
- int - 32bitové celé číslo
- pevný - 12bitové číslo pevného bodu
- bool - logická proměnná
- sampler * - představuje objekt textury
Cg také obsahuje vektorové a maticové datové typy, které jsou založeny na základních datových typech, jako jsou float3 a float4x4. Takové datové typy jsou při programování 3D grafiky zcela běžné. Cg má také strukturu a datové typy polí, které fungují podobně jako jejich ekvivalenty C.
Operátoři
Cg podporuje širokou škálu operátorů, včetně běžných aritmetických operátorů z C, ekvivalentních aritmetických operátorů pro vektorové a maticové datové typy a společné logické operátory.
Funkce a řídicí struktury
Cg sdílí základní řídicí struktury s C, jako if / else, while a for. Má také podobný způsob definování funkcí.
Sémantika
Předprocesor
Cg implementuje mnoho C preprocesor směrnice a její systém makroexpanze. Implementuje #zahrnout
.[7]
Funkce HLSL
- Jmenný prostor
- Anotace
životní prostředí
Cíle kompilace
Programy Cg jsou postaveny pro různé shader profily které představují GPU s různými schopnostmi.[8] Tyto profily rozhodují mimo jiné o tom, kolik instrukcí může být v každém shaderu, kolik registrů je k dispozici a jaký druh zdrojů může shader použít. I když je program správný, může být pro zpracování profilu příliš složitý.[7]
S přibývajícím počtem typů profilů a shaderů společnost Microsoft přepnula použití výrazu „Shader Model“ na seskupení sady profilů nalezených v generaci GPU.[9] Cg podporuje některé z novějších profilů až do Shader Model 5.0, stejně jako překlad do glsl nebo hlsl.[8]
Verze shaderu pixelů | 1,0 až 1,3[10] | 1.4[10] | 2.0[10][11] | 2,0a[10][11][12] | 2,0b[10][11][13] | 3.0[10][14] | 4.0[15] 4.1[16] 5.0[17] |
---|---|---|---|---|---|---|---|
Závislý limit textury | 4 | 6 | 8 | Neomezený | 8 | Neomezený | Neomezený |
Limit instrukce textury | 4 | 6*2 | 32 | Neomezený | Neomezený | Neomezený | Neomezený |
Registr pozic | Ne | Ne | Ne | Ne | Ne | Ano | Ano |
Instrukční sloty | 8+4 | 8+4 | 32 + 64 | 512 | 512 | ≥ 512 | ≥ 65536 |
Provedené pokyny | 8+4 | 6*2+8*2 | 32 + 64 | 512 | 512 | 65536 | Neomezený |
Indukce textury | 4 | 4 | 4 | Neomezený | 4 | Neomezený | Neomezený |
Interpolované registry | 2 + 4 | 2 + 6 | 2 + 8 | 2 + 8 | 2 + 8 | 10 | 32 |
Predikce instrukce | Ne | Ne | Ne | Ano | Ne | Ano | Ne |
Rejstřík vstupních registrů | Ne | Ne | Ne | Ne | Ne | Ano | Ano |
Temp registry | 2 | 6 | 12 až 32 | 22 | 32 | 32 | 4096 |
Konstantní registry | 8 | 8 | 32 | 32 | 32 | 224 | 16×4096 |
Libovolný třpytivý | Ne | Ne | Ne | Ano | Ne | Ano | Ano |
Pokyny k přechodu | Ne | Ne | Ne | Ano | Ne | Ano | Ano |
Registrovat počet smyček | Ne | Ne | Ne | Ne | Ne | Ano | Ano |
Registr obličeje (2stranné osvětlení) | Ne | Ne | Ne | Ne | Ano | Ano | Ano |
Dynamické řízení toku | Ne | Ne | Ne | Ne | Ne | Ano (24) | Ano (64) |
Bitové operátory | Ne | Ne | Ne | Ne | Ne | Ne | Ano |
Nativní celá čísla | Ne | Ne | Ne | Ne | Ne | Ne | Ano |
- PS 1.0 - Nevydaný 3dfx Rampage, DirectX 8.
- PS 1.1 — GeForce 3, DirectX 8.
- PS 1.2 — 3Dlaby Wildcat VP, DirectX 8.0a.
- PS 1.3 — GeForce 4 Ti, DirectX 8.0a.
- PS 1.4 — Radeon 8500-9250, Matrox Parhelia, DirectX 8.1.
- Shader Model 2.0 — Radeon 9500-9800 / X300-X600, DirectX 9.
- Shader Model 2.0a — GeForce FX / PCX optimalizovaný model, DirectX 9.0a.
- Shader Model 2.0b — Radeon X700-X850 shader model, DirectX 9.0b.
- Shader Model 3.0 — Radeon X1000 a GeForce 6, DirectX 9.0c.
- Shader Model 4.0 — Radeon HD 2000 a GeForce 8, DirectX 10.
- Shader Model 4.1 — Radeon HD 3000 a GeForce 200, DirectX 10.1.
- Shader Model 5.0 — Radeon HD 5000 a GeForce 400, DirectX 11.
- Shader Model 5.1 — GCN 1+, Fermi +, DirectX 12 (11_0 +) s WDDM 2.0.
- Shader Model 6.0 - GCN 1+, Kepler +, DirectX 12 (11_0 +) s WDDM 2.1.
- Model shaderu 6.1 - GCN 1+, Kepler +, DirectX 12 (11_0 +) s WDDM 2.3.
- Model shaderu 6.2 - GCN 1+, Kepler +, DirectX 12 (11_0 +) s WDDM 2.4.
- Model shaderu 6.3 - GCN 1+, Kepler +, DirectX 12 (11_0 +) s WDDM 2.5.
- Model shaderu 6.4 - GCN 1+, Kepler +, Skylake +, DirectX 12 (11_0 +) s WDDM 2.6.
- Shader Model 6.5 - GCN 1+, Kepler +, Skylake +, DirectX 12 (11_0 +) s WDDM 2.7.
„32 + 64“ pro Provedené pokyny znamená „32 instrukcí textury a 64 aritmetických instrukcí.“
Verze shaderu vrcholů | VS 1.1[18] | VS 2.0[11][18][19] | VS 2.0a[11][18][19] | VS 3.0[14][18] | VS 4.0[15] VS 4.1[20] VS 5.0[17] |
---|---|---|---|---|---|
# instrukčních slotů | 128 | 256 | 256 | ≥ 512 | ≥ 65536 |
Max. Počet provedených pokynů | 128 | 1024 | 65536 | 65536 | Neomezený |
Predikce instrukce | Ne | Ne | Ano | Ano | Ano |
Temp registry | 12 | 12 | 16 | 32 | 4096 |
# konstantní registry | ≥ 96 | ≥ 256 | 256 | ≥ 256 | 16×4096 |
Statické řízení toku | Ne | Ano | Ano | Ano | Ano |
Dynamické řízení toku | Ne | Ne | Ano | Ano | Ano |
Hloubka dynamického řízení toku | N / A | N / A | 24 | 24 | 64 |
Načtení textury vrcholů | Ne | Ne | Ne | Ano | Ano |
# vzorkovačů textur | N / A | N / A | N / A | 4 | 128 |
Instance geometrie Podpěra, podpora | Ne | Ne | Ne | Ano | Ano |
Bitové operátory | Ne | Ne | Ne | Ne | Ano |
Nativní celá čísla | Ne | Ne | Ne | Ne | Ano |
Standardní knihovna
Stejně jako v C, Cg / HLSL obsahuje sadu funkcí pro běžné úkoly v programování GPU. Některé z těchto funkcí mají ekvivalenty v jazyce C, například matematické funkce abs a sin, zatímco jiné se specializují na úlohy programování GPU, například mapování textury funkce tex1D a tex2D.
Runtime knihovna Cg
Programy Cg jsou pouze shadery vrcholů a pixelů a potřebují podpůrné programy, které zvládnou zbytek procesu vykreslování. Cg lze použít se dvěma grafikami API: OpenGL nebo DirectX. Každá z nich má vlastní sadu funkcí Cg pro komunikaci s programem Cg, jako je nastavení aktuálního shaderu Cg, předávání parametrů a takové úkoly.
Kromě možnosti kompilovat zdroj Cg do kódu sestavení má běhový modul Cg také schopnost kompilovat shadery během provádění podpůrného programu. To umožňuje modulu runtime kompilovat shader pomocí nejnovějších optimalizací dostupných pro hardware, na kterém program aktuálně provádí. Tato technika však vyžaduje, aby byl zdrojový kód shaderu k dispozici v prostém textu kompilátoru, což uživateli programu umožňuje přístup ke zdrojovému kódu shaderu. Někteří vývojáři to považují za hlavní nevýhodu této techniky.
Abychom se vyhnuli odhalení zdrojového kódu shaderu a udrželi některé optimalizace specifické pro hardware, byl vyvinut koncept profilů. Shadery lze sestavit tak, aby vyhovovaly různým grafickým hardwarovým platformám (podle profilů). Při provádění podpůrného programu se načte nejlepší / nejoptimalizovanější shader podle jeho profilu. Například může existovat profil pro grafickou kartu, která podporuje komplexní shadery pixelů, a další profil pro jednu, která podporuje pouze minimální shadery pixelů. Vytvořením shaderu pixelů pro každý z těchto profilů podpůrný program rozšiřuje počet podporovaných hardwarových platforem, aniž by byla obětována kvalita obrazu na výkonných systémech. “
Překladače a dialekty
Cg dialekt měl vždy jen jeden kompilátor v podobě Nvidia's Cg toolkit.
Společnost Microsoft vydala dva kompilátory pro HLSL. Původní kompilátor byl FXC s uzavřeným zdrojem (Effect Compiler), podporovaný do roku 2015. Byl zastaralý ve prospěch open-source LLVM - založený na DXC (DirectXShaderCompiler) s podporou novějších funkcí HLSL.[21] Oba kompilátory generují bytecode: zatímco starší FXC používal DXBC, DXC nyní používá DXIL. DXC může také emitovat SPIR-V bytecode.[22]
The Skupina Khronos také napsal kompilátor HLSL založený na LLVM ve formě rozhraní pro glslang, jejich překladač GLSL-to-SPIR_V. Podpora SPIR-V znamená, že shadery mohou být multiplatformní a již je neomezují na zásobník DirectX.[23] Tuto úlohu dříve prováděli převaděči na úrovni zdroje jako HLSL2GLSL, ale výsledný kód je často nafouknutý.[24]
Odvozené jazyky
The Jazyk stínování PlayStation je založen na Cg / HLSL.[25]
Stínovací jazyk ReshadeFX je také založen na Cg / HLSL. Shadery napsané v ReshadeFX jsou kompilovány do OpenGL, DX nebo Vulkan a vkládány do her, aby fungovaly jako filtry pro následné zpracování.[26]
Příklady
Ukázkový shader Cg vrcholu
// vstupní vrcholstruktur VertIn { float4 poz : POZICE; float4 barva : BARVA0;};// výstupní vrcholstruktur VertOut { float4 poz : POZICE; float4 barva : BARVA0;};// hlavní položka shaderu vrcholůVertOut hlavní(VertIn V, jednotný float4x4 modelViewProj) { VertOut VEN; VEN.poz = mul(modelViewProj, V.poz); // výpočet výstupních souřadnic VEN.barva = V.barva; // kopírování vstupní barvy na výstup VEN.barva.z = 1.0F; // modrá složka barvy = 1,0f vrátit se VEN;}
Aplikace a hry, které používají Cg nebo HLSL
- 3DVIA Virtools
- Adobe Photoshop
- Maya[27]
- Battlefield 2
- Motor Cafu
- Crystal Space
- Dolphinity Racer
- Zemské speciální síly - Poločas rozpadu
- Enemy Territory: Quake Wars
- Vydání Doom 3 BFG
- EON Professional ™ / Ultra ™ z EON realita
- eyeon Fusion
- Far Cry
- Garshasp: The Monster Slayer
- GLScene
- Gun Metal
- Hitman: Blood Money
- Irrlichtův motor
- League of Legends
- Lightfeather 3D Engine
- Světelná vlna 11.6[28]
- muvee Reveal
- OGRE
- OpenEmu
- Panda3D
- PCSX2
- PlayStation 3
- RetroArch
- LEST.
- Snes9x
- Unity herní engine[29]
- Neskutečný motor
Viz také
- Programování
- Počítačová grafika
- Shadery vrcholů a pixelů
- Jazyk shaderu na vysoké úrovni
- Stínovací jazyk OpenGL
- Shader Model
- OpenGL
- DirectX
Reference
- ^ „Fusion Industries :: Cg and HLSL FAQ ::“. 24. srpna 2012. Archivovány od originál dne 24. srpna 2012.
- ^ „Cg Tutorial - Kapitola 1. Úvod“. developer.download.nvidia.cn.
- ^ "Zápis shaderů HLSL v Direct3D 9 (Windows)". msdn.microsoft.com.
- ^ „Cg FAQ“. NVIDIA DesignWorks. 8. března 2011. Citováno 25. května 2017.
- ^ „Cg Toolkit | NVIDIA Developer“. 8. března 2011.
- ^ https://developer.download.nvidia.com/cg/Cg_2.0/2.0.0012/Cg-2.0_Jan2008_ReleaseNotes.pdf
- ^ A b Mark J. Kilgard, Cg ve dvou stránkách, 2003.
- ^ A b "Dokumentace profilu Cg". Vývojář Nvidia.
- ^ „Shader Models vs Shader Profiles - Win32 apps“. docs.microsoft.com.
- ^ A b C d E F „Rozdíly Pixel Shader“. msdn.microsoft.com. 2011-02-08.
- ^ A b C d E Peeper, Craig (2004-03-15). „Microsoft DirectX High Level Shader Language (HLSL)“ (PPT). microsoft.com. str. 5–8, 24–25.
- ^ Shimpi, Anand Lal. „NVIDIA představuje GeForce FX (NV30)“.
- ^ Wilson, Derek. „ATI Radeon X800 Pro a XT Platinum Edition: R420 dorazí“.
- ^ A b Shader Model 3.0, Ashu Rege, NVIDIA Developer Technology Group, 2004.
- ^ A b Systém Direct3D 10, David Blythe, Microsoft Corporation, 2006.
- ^ „Registers - ps_4_1 (Windows)“. msdn.microsoft.com.
- ^ A b „Registers - ps_5_0 (Windows)“. msdn.microsoft.com.
- ^ A b C d „Rozdíly shaderu vrcholů“. msdn.microsoft.com. 2011-02-08.
- ^ A b Shimpi, Anand Lal. „NVIDIA představuje GeForce FX (NV30)“.
- ^ „Registers - vs_4_1 (Windows)“. msdn.microsoft.com.
- ^ „Přenos z FXC na DXC“. GitHub.
- ^ „microsoft / DirectXShaderCompiler: This repo hosts the source for the DirectX Shader Compiler which is based on LLVM / Clang“. Microsoft. 21. října 2020.
- ^ „glslang: Khronos-referenční frontend pro GLSL / ESSL, částečný frontend pro HLSL a generátor SPIR-V“. Skupina Khronos. 21. října 2020.
- ^ Matt Turner. Video na Youtube.
- ^ Stenson, Richard; Ho, Chrisi. „PlayStation Shading Language pro PS4“. GDC Europe 2013.
- ^ "Stínovací jazyk ReShade FX". GitHub.
- ^ „Plug-in Maya Cg | NVIDIA“.
- ^ „LightWave - přehled funkcí 11.6“.
- ^ „Unity - Manual: Writing Shaders“.
Další čtení
- Randima Fernando, Mark J. Kilgard, Cg Tutorial: Definitivní průvodce programovatelnou grafikou v reálném čase, Addison-Wesley Professional, ISBN 0-321-19496-9
- Randima Fernando, Drahokamy GPU: Programovací techniky, tipy a triky pro grafiku v reálném časeAddison-Wesley Professional, ISBN 0-321-22832-4
- William R. Mark, R. Steven Glanville, Kurt Akeley, Mark J. Kilgard, Cg: Systém pro programování grafického hardwaru v jazyce CSborník ze dne SIGGRAPH 2003, doi:10.1145/1201775.882362
externí odkazy
- cgc-opensrc - Mirror pro kompilátor open source nvidia, 2002
- Jsou shromážděny některé základní materiály (např. Designový papír) tyto poznámky k kurzu ze Siggraph 2005
- Materiály hostované Nvidia:
- Výukový program NeHe Cg vertex shader
- Dokumentace pro standard Cg Shader používaný emulátory
- Aras Pranckevičius, Cross Platform Shaders v roce 2014.