Jazyk Cg Josef Pelikán, MFF UK Praha

Podobné dokumenty
Josef Pelikán, CGG MFF UK Praha

Programovatelné shadery a jazyk Cg. Petr Kmoch

Programování GPU ( shaders )

Obsah. Předmluva 13 Zpětná vazba od čtenářů 14 Zdrojové kódy ke knize 15 Errata 15

Programování GPU ( shaders ) Josef Pelikán, MFF UK Praha

Úvod do jazyka C. Ing. Jan Fikejz (KST, FEI) Fakulta elektrotechniky a informatiky Katedra softwarových technologií

Opakování programování

Programování v C++ 1, 1. cvičení

Úvod do programovacích jazyků (Java)

Programovací jazyk C++ Hodina 1

IUJCE 07/08 Přednáška č. 1

Algoritmizace a programování

Příkazy preprocesoru - Před překladem kódu překladačem mu předpřipraví kód preprocesor - Preprocesor vypouští nadbytečné (prázdné) mezery a řádky -

Algoritmizace a programování

Základní pojmy. Úvod do programování. Základní pojmy. Zápis algoritmu. Výraz. Základní pojmy

Zápis programu v jazyce C#

Šablonové metaprogramování v C++ Miroslav Virius KSI FJFI ČVUT

Maturitní otázky z předmětu PROGRAMOVÁNÍ

PŘETĚŽOVÁNÍ OPERÁTORŮ

Obsah přednášky 7. Základy programování (IZAPR) Přednáška 7. Parametry metod. Parametry, argumenty. Parametry metod.

Výrazy, operace, příkazy

Ahoj mami. Uložení dat v počítači. Příklady kódování dat. IAJCE Přednáška č. 4

8 Třídy, objekty, metody, předávání argumentů metod

3D počítačová grafika na PC Josef Pelikán, MFF UK Praha

ZPRO v "C" Ing. Vít Hanousek. verze 0.3

přetížení operátorů (o)

Ukazka knihy z internetoveho knihkupectvi

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Programování shaderů GLSL

Odvozené a strukturované typy dat

Úvod do programování - Java. Cvičení č.4

Úvod do programovacích jazyků (Java)

for (i = 0, j = 5; i < 10; i++) { // tělo cyklu }

Logické operace. Datový typ bool. Relační operátory. Logické operátory. IAJCE Přednáška č. 3. může nabýt hodnot: o true o false

Připravil: David Procházka. Shadery

Algoritmy I. Cvičení č. 2, 3 ALGI 2018/19

NPRG031 Programování II --- 2/2 Z, Zk

Jazyk C# a platforma.net

PB161 Programování v jazyce C++ Přednáška 9

Algoritmizace a programování

Předmluva k aktuálnímu vydání Úvod k prvnímu vydání z roku Typografické a syntaktické konvence... 20

Programovací jazyk Pascal

Objektově orientované programování

Martin Flusser. Faculty of Nuclear Sciences and Physical Engineering Czech Technical University in Prague. October 17, 2016

Prezentace a vysvětlení programového prostředí NXC

Úvod do programování. Lekce 1

5 Přehled operátorů, příkazy, přetypování

1.1 Struktura programu v Pascalu Vstup a výstup Operátory a některé matematické funkce 5

Fakulta informačních technologíı. IZG cvičení 6. - Zobrazování 3D scény a základy OpenGL 1 / 38

Co je grafický akcelerátor

Paměť počítače. alg2 1

Android OpenGL. Pokročilé shadery

MATURITNÍ OTÁZKY ELEKTROTECHNIKA - POČÍTAČOVÉ SYSTÉMY 2003/2004 PROGRAMOVÉ VYBAVENÍ POČÍTAČŮ

Vyučovací hodina. 1vyučovací hodina: 2vyučovací hodiny: Opakování z minulé hodiny. Procvičení nové látky

EVROPSKÝ SOCIÁLNÍ FOND. Úvod do PHP PRAHA & EU INVESTUJEME DO VAŠÍ BUDOUCNOSTI

VÝUKOVÝ MATERIÁL. Bratislavská 2166, Varnsdorf, IČO: tel Číslo projektu

1. lekce. do souboru main.c uložíme následující kód a pomocí F9 ho zkompilujeme a spustíme:

Data, výrazy, příkazy

Obsah. Úvod 11 Základy programování 11 Objektový přístup 11 Procvičování 11 Zvláštní odstavce 12 Zpětná vazba od čtenářů 12 Errata 13

Obsah přednášky. programovacího jazyka. Motivace. Princip denotační sémantiky Sémantické funkce Výrazy Příkazy Vstup a výstup Kontinuace Program

Programovací jazyky. imperativní (procedurální) neimperativní (neprocedurální) assembler (jazyk symbolických instrukcí)

Operátory, výrazy. Tomáš Pitner, upravil Marek Šabo

Preprocesor. Karel Richta a kol. katedra počítačů FEL ČVUT v Praze. Karel Richta, Martin Hořeňovský, Aleš Hrabalík, 2016

Správné vytvoření a otevření textového souboru pro čtení a zápis představuje

Algoritmizace a programování

Stručný obsah První týden Druhý týden 211 Třetí týden 451 Rejstřík 787

Výrazy, operace, příkazy

7. přednáška - třídy, objekty třídy objekty atributy tříd metody tříd

Bitové operátory a bitová pole. Úvod do programování 2 Tomáš Kühr

Počítačové laboratoře bez tajemství aneb naučme se učit algoritmizaci a programování s využitím robotů CZ.1.07/1.3.12/

Generování vnitřní reprezentace programu

Preprocesor a koncepce (větších) programů. Úvod do programování 2 Tomáš Kühr

Jazyk C pro pokročilé

Třídy a struktury v C++

Algoritmizace a programování. Ak. rok 2012/2013 vbp 1. ze 44

6. Příkazy a řídící struktury v Javě

8. lekce Úvod do jazyka C 3. část Základní příkazy jazyka C Miroslav Jílek

IAJCE Přednáška č. 6. logický celek, řešící dílčí část problému Příklad velmi špatného zápisu programu na výpočet obsahu obdélníku

Algoritmizace, základy programování, VY_32_INOVACE_PRG_ALGO_01

11. Přehled prog. jazyků

PROMĚNNÉ, KONSTANTY A DATOVÉ TYPY TEORIE DATUM VYTVOŘENÍ: KLÍČOVÁ AKTIVITA: 02 PROGRAMOVÁNÍ 2. ROČNÍK (PRG2) HODINOVÁ DOTACE: 1

Strojový kód k d a asembler procesoru MIPS SPIM. MIPS - prostředí NMS NMS. 32 ks 32bitových registrů ( adresa registru = 5 bitů).

Android OpenGL. Práce s texturami

Jak v Javě primitivní datové typy a jejich reprezentace. BD6B36PJV 002 Fakulta elektrotechnická České vysoké učení technické

Datové typy strana 29

DTP Základy programování Úvod do předmětu

V dalších letech se pak začaly objevovat první normy pro jazyk C++ (ISO/IEC 14882:1998; ISO/IEC 9899:1999; ISO/IEC 14882:2003; ISO/IEC 14882:2011).

Jazyk C++, některá rozšíření oproti C

Čtvrtek 8. prosince. Pascal - opakování základů. Struktura programu:

IUJCE 07/08 Přednáška č. 4. v paměti neexistuje. v paměti existuje

Jazyk symbolických adres

Algoritmizace a programování

7 Formátovaný výstup, třídy, objekty, pole, chyby v programech

x86 assembler and inline assembler in GCC

IUJCE Přednáška č. 1. programování v C na vyšší úrovni základy objektově orientovaného programovaní v (C++, C#)

Textury v real-time grafice Josef Pelikán, MFF UK Praha Josef.Pelikan@mff.cuni.cz

Operační systémy. Cvičení 4: Programování v C pod Unixem

VÝUKOVÝ MATERIÁL. Bratislavská 2166, Varnsdorf, IČO: tel Číslo projektu

Programovací jazyk. - norma PASCAL (1974) - implementace Turbo Pascal, Borland Pascal FreePascal Object Pascal (Delphi)

Struktura programu v době běhu

Transkript:

Jazyk Cg 2005 Josef Pelikán, MFF UK Praha http://cgg.ms.mff.cuni.cz/~pepca/ Josef.Pelikan@mff.cuni.cz

Obsah architektura Cg Cg runtime cílové profily, integrace s OpenGL a Direct3D jazyk Cg datové typy, sémantika příkazy, podprogramy efektivita shaderů příklady,...

Vývojové prostředí Cg překlad programů pro OpenGL i pro Direct3D Cg programy není v 99% případů nutno měnit integrace s 3D API je ve dvou variantách (např. i komunikace aplikace Cg shader ) překlad Cg programů probíhá dynamicky, až v době běhu aplikace (optimalizace pro konkrétní GPU) cílové profily ( instrukční sady) možnost přeložit Cg do různých profilů výběr optimálního profilu pro aktuální GPU kompatibilita Cg programů jedním směrem zvlášť profily pro vertex- a pro fragment- programy

Prostředí Cg Aplikace OpenGL Cg runtime Direct3D Cg runtime Cg compiler Core Cg runtime 3D API: OpenGL nebo Direct3D GPU hardware

Jazyk Cg - základy syntax Cg je odvozena od ANSI C inspirace v modernějších jazycích (C++, Java, C#) Cg neobsahuje: typedef, enum, union, ukazatele, goto, break, continue, do, switch, case, default,... Cg má navíc: sémantiku parametrů, swizzle operátory, selekce při zápisu složek vektoru, vektorové operace ( SIMD ), uniform modifikátor Cg má jinak: práce s poli (viz níže), deklarace proměnných (C++) a komentáře (C++) datové typy: float, half, fixed, vektorové a maticové typy (float3, float4x4,...), sampler* typy (texturové objekty)

Příklad vertex programu struct VertOut { float4 coord : POSITION; float2 texcoord : TEXCOORD0; float4 diffuse : COLOR0; float4 specular : COLOR1; }; VertOut texlight ( float2 texcoord : TEXCOORD0, float4 pos : POSITION, float4 normal : NORMAL, uniform float4x4 modelviewproj, uniform float4x4 modelviewprojit, uniform float3 lightdir, uniform float3 halfdir, uniform float4 ambient, uniform float4 specular ) { VertOut o; float3 N = normalize( mul( modelviewprojit, normal ).xyz ); float cosa = dot( N, lightdir ); float cosb = dot( N, halfdir ); float4 light = lit( cosa, cosb, 32 ); o.coord = mul( modelviewproj, pos ); o.texcoord = texcoord; o.diffuse = ambient + light.yyyw; o.specular = specular * light.zzzw; return o; }

Překlad do ARBvp1.0!!ARBvp1.0 PARAM c[13] = { program.local[0..9], { 32 }, program.local[11..12] }; TEMP R0; DP4 R0.z, vertex.normal, c[6]; DP4 R0.y, vertex.normal, c[5]; DP4 R0.x, vertex.normal, c[4]; DP3 R0.w, R0, R0; DP4 result.position.w, vertex.position, c[3]; DP4 result.position.z, vertex.position, c[2]; RSQ R0.w, R0.w; DP4 result.position.y, vertex.position, c[1]; MUL R0.yzw, R0.w, R0.xxyz; DP3 R0.x, R0.yzww, c[8]; DP3 R0.y, R0.yzww, c[9]; MOV R0.z, c[10].x; DP4 result.position.x, vertex.position, c[0]; LIT R0.yzw, R0.xyzz; MOV result.texcoord[0].xy, vertex.texcoord[0]; ADD result.color, R0.yyyw, c[11]; MUL result.color.secondary, R0.zzzw, c[12]; END

Příklad fragment programu struct FragOut { float4 color : COLOR; }; FragOut texcolorglass ( float2 texcoord : TEXCOORD0, float4 diffuse : COLOR0, float4 specular : COLOR1, uniform sampler2d tex, uniform float4 colorglass ) { FragOut o; float4 tmp = saturate( diffuse * tex2d( tex, texcoord ) + specular ); o.color.rgb = lerp( tmp.rgb, colorglass.rgb, colorglass.a ); o.color.a = 1.0; return o; }

Překlad do ARBfp1.0!!ARBfp1.0 PARAM c[2] = { { 1 }, program.local[1] }; TEMP R0; TEMP R1; TEX R0.xyz, fragment.texcoord[0], texture[0], 2D; MUL R0.xyz, fragment.color.primary, R0; ADD_SAT R0.xyz, R0, fragment.color.secondary; ADD R1.xyz, -R0, c[1]; MAD result.color.xyz, R1, c[1].w, R0; MOV result.color.w, c[0].x; END

Profily překladu výstupní instrukční sada, abstraktní cílový procesor aplikace spolu s Cg runtime se mohou až za běhu rozhodovat, pro jaký cílový kód se program přeloží možnost lépe optimalizovat výsledek profily se značně liší obecností, silou i svými limity (viz různá rozšíření OpenGL) oddělení vertex programů a fragment programů zdrojový soubor může být jediný s více vstupními body ( entry points ) přetížení funkcí podle použitého profilu varianty kódu úplně pod kontrolou programátora

OpenGL profily pro vertex programy: arbvp1: základní multivendor (ARB_vertex_program) vp20: základní NVIDIA (NV_vertex_program) vp30: pokročilý NVIDIA (NV_vertex_program2) vp40: pokročilý NVIDIA (NV_vertex_program3) pro fragment programy: fp20: základní NVIDIA (NV_texture_shader, NV_register_combiners) arbfp1: pokročilý multivendor (ARB_fragment_program) fp30: pokročilý NVIDIA (NV_fragment_program) fp40: pokročilý NVIDIA (NV_fragment_program2)

DirectX profily pro vertex programy: vs_1_1: základní multivendor (DirectX 8) vs_2_0, vs_2_x: pokročilý miltivendor (DirectX 9) pro fragment programy: ps_1_1, ps_1_2, ps_1_3: základní multivendor (DirectX 8) ps_2_0, ps_2_x: pokročilý miltivendor (DirectX 9)

Přetížení podle profilu profil nebo jeho maska se předsazuje před funkci vs nahrazuje vs_1_1, vs_2_0 nebo vs_2_x vs_2 nahrazuje vs_2_0 nebo vs_2_x příklad: arbvp1 VertOut main ( ) { } vp40 VertOut main ( ) { while ( i < MAX && p[i] > 0.0 ) { }

Číselné datové typy int 32-bitové celé číslo, může být implementován jako float float 32-bitů single precision (IEEE 754) jediný povinný typ half 16-bitový low precision float (IEEE 754) může být implementován jako float fixed málorozsahový fixed-point [-2,2], minimálně 10 desetinných bitů

Další datové typy bool boolovská hodnota, false nebo true sampler* handler na texturový objekt, implicitně const sampler (generický), sampler1d, sampler2d, sampler3d, samplercube, samplerrect array, packed array definice polí jako v C, modifikátor packed povinně implementované vektory: type1, type2, type3, type4 (type je libovolný číselný typ) povinné matice: type1x1 až type4x4

Literály, přetypování číselné literály: zapisují se jako v C jednopísmenný suffix f (float), d (double), h (half), x (fixed) konstrukce vestavěných vektorů: typ( x, y, ) např. float4(0.0,1.0,0.0,1.0) přetypování: explicitní přetypování jako v C (type)expression sub-vektor: pomocí swizzlingu např.: float4 pos = { 0.5, 0.75, 0.2, 1.0 }; float3 vec = pos.xyz;

Kvalifikátory const překladač může informaci využít k optimalizaci in, out, inout parametry funkcí: in je default (volání hodnotou) out volání výsledkem, překladač kontroluje přiřazení (aspoň do jedné složky vektoru) inout - kombinace in a out uniform globální proměnné nebo parametry, které jsou inicializovány externě (aplikace, dlouhodobější hodn.) ostatní parametry jsou chápány jako varying

Preprocesor, komentáře klasická sada preprocesorových instrukcí z jazyka C zejména #define, #if, #ifdef, #else a #endif není povinné implementovat #include nebo makra v #define komentáře jako v C i C++ /* short note */ // full-line comment

Sémantiky identifikace dat procházejících skrz pipelines podobně jako v každém proudovém zpracování musí se shodnout FFP (zbytek grafického adaptéru), vertex program a fragment program zvláštní identifikátory v Cg na každý program 2 namespaces pro vstup a výstup syntax: identifikátor oddělený dvojtečkou od parametru, globální proměnné nebo hlavičky funkce in float4 norm : NORMAL; in float4 pos : POSITION; out float psize : PSIZE = 1.0; out float3 opos : POSITION;

Standardní sémantiky některé sémantiky jsou povinné a přesně definované např. POSITION na výstupu vertex programu sémantiky se liší pro různé profily, povinné sady: vstup vertex programu: POSITION, NORMAL, TANGENT, BINORMAL, PSIZE, TEXCOORD0 až 7, BLENDINDICES, BLENDWEIGHT výstup vertex programu: POSITION, PSIZE, COLOR0, COLOR1, TEXCOORD0 až 7 vstup fragment programu: PSIZE, COLOR0, COLOR1, TEXCOORD0 až 7 výstup fragment programu: COLOR, option. DEPTH

Swizzling ( permutace složek ) GPU umí zdarma permutovat složky vektorů též lze složky duplikovat nebo ignorovat moderní GPU: i negace nebo absolutní hodnota argumentů swizzle operátor. pro vektory: dvě rovnocenné sady znaků xyzw a rgba implicitní pořadí se uvádět nemusí při zápisu ( write mask operator ) se nesmí složky opakovat maticový swizzling _m<row><column>, číslováno od 0 _<row><column>, číslováno od 1 (kompat. s DirectX)

Swizzling - příklady duplikace float4 a = b.xxyy; float4 c = 1.0f.xxxx; a = c.wwww; b = sin( a.w ).xxxx; // same as float4(1.,1.,1.,1.) permutace a = b.wzyx; b = (a + c).xzyw; float4x4 M; a = M._m00_m11_m22_m33; // same as M._11_22_33_44 float3 vecprod = a.yzx * b.zxy a.zxy * b.yzx; maska zápisu a.xyz = float3(2.0,2.0,2.0) a.w = 1.0;

Řídící příkazy Cg logické operátory: &&! < <=!= == >= > fungují i s vektorovými operandy (po složkách) nepoužívá se zkrácené vyhodnocování! ternární operátor?: při vektorových operandech musí mít všechny vektory stejnou délkou, vše probíhá nezávisle po složkách if else povinné pro všechny profily, ale starší HW ho neumí for, while povinné, jestli lze počet opakování zjistit v době překladu, některé profily umějí i obecné cykly (vp40)

Funkce, příkaz discard deklarace jako v jazyce C nepovinná návratová hodnota ( void ) nemusí mít žádné argumenty (používá globál. proměnné) návratová hodnota je podobná out parametru mohou se vracet i vektory nebo matice (formálně je to rvalue ) static funkce nemůže být kompilovaná jako hlavní program není přístupná z jiných souborů discard příkaz ruší zpracování fragmentu/vrcholu DirectX profily používají místo něj funkci clip()

Vestavěné funkce vysoce optimalizované pokud nejsou dnes realizovány jediným assemblerským příkazem, může to tak být v budoucích profilech skoro vždy se vkládají do kódu ( inlining ) funkce nemusí být podporovaná ve všech profilech viz detailní referenci okruhy vestavěných funkcí: aritmetika geometrie čtení z texturových objektů diferenciály

Aritmetické funkce omezovače abs, ceil, clamp, fmod, frac, frexp, max, min, modf, round, saturate čistá aritmetika acos, asin, atan, atan2, cos, cosh, cross, degrees, determinant, dot, exp, exp2, ldexp, lerp, lit, log, log2, log10, mul(*,*), noise, pow, radians, rsqrt, sign, sin, sincos, sinh, smoothstep, step, sqrt, tan, tanh, transpose predikáty all, any, isfinite, isinf, isnan

Texturové funkce prvním argumentem je vždy objekt typu sampler* použitá funkce musí vždy souhlasit s dimenzí textury jediné použití sampler* objektů v Cg programech! projektivní varianty funkcí před adresováním se provede převod z homogen. souř. další pomocné argumenty: parciální derivace, hloubka z ( depth compare ) texturovací funkce (počet [přetížených] variant): tex1d(4), tex1dproj(2), tex2d(4), tex2dproj(2), texrect(4), texrectproj(2), tex3d(2), tex3dproj(1), texcube(2), texcubeproj(1)

Geometrické a ostatní funkce geometrie distance, faceforward, length, normalize, reflect, refract diferenciály ddx, ddy ladění debug

Cg runtime a Cg API Cg API: překládá programy z jazyka Cg do formy použitelné ve zvoleném 3D API (OpenGL nebo DirectX) spojuje GPU programy s aplikací aplikace může posílat uniform i varying data do GPU GPU i zavedené GPU progr. správně interpretují tato data dvě možnosti: 1. statický překlad Cg programů (slinkuje se předem celá aplikace) 2. použití Cg runtime překlad Cg při každém spuštění aplikace (pružnější a efektivnější řešení)

Cg runtime Aplikační program OpenGL Cg runtime Direct3D Cg runtime Cg compiler Core Cg runtime 3D API: OpenGL nebo Direct3D

Cg runtime výhody: kompatibilita do budoucna i v dosud neexistujících profilech lepší optimalizace v budoucích profilech aplikace není závislá na profilu a konkrétním přeloženém kódu (může využít speciální schopnosti GPU) správa parametrů snadné předávání uniform parametrů z aplikace do GPU společné jádro ( Core Cg runtime ) + varianty pro obě API ( cggl a cgd3d )

Cg runtime pro OpenGL knihovny cg.dll a cggl.dll (podobně v Linuxu) #include <Cg/cg.h> #include <Cg/cgGL.h> 1. Cg kontext (OpenGL už musí běžet!) CGcontext ctx = cgcreatecontext(); 2. překlad Cg programu (z paměti nebo souboru) CGprogram vp = cgcreateprogram( ctx, CG_SOURCE, programtext, CG_PROFILE_VP20, main, args ); nebo ze souboru cgcreateprogramfromfile( ctx, CG_SOURCE, "vertexprog.cg, CG_PROFILE_VP20, "main", args );

Použití Cg runtime II 3. upload přeloženého programu do GPU cgglloadprogram(vp); 4. handle parametrů ( uniforms ) CGparameter light = cggetnamedparameter( vp, lightvec ); nebo např. cggetnamedparameter( vp, "main.lightvec ); 5. nastavení uniform parametrů cgglsetparameter4fv( light, value ); nebo třeba cgglsetparameter4f( light, 1.f, 0.f, 0.f, 1.f );

Použití Cg runtime III 6. povolení příslušného profilu cgglenableprofile( CG_PROFILE_VP20 ); 7. přepnutí vertex programu (mohu jich mít více) cgglbindprogram( vp ); 8. nyní všechny vykreslovací procedury používají daný vertex program! 9. zákaz příslušného profilu cggldisableprofile( CG_PROFILE_VP20 ); 10. úklid prostředků cgdestroyprogram( vp ); cgdestroycontext( ctx );

Efektivní programování v Cg počítat s vektorovým počítáním (SIMD) překladač se snaží automaticky vektorizovat každý Cg kód, ale pokud na to programátor sám myslí, je to lepší.. efektivně používat swizzling pomáhá vektorizaci někdy jsou výhodné netradiční a nezvyklé postupy.. používat standardní funkce lepší kód i v budoucích profilech pro velmi složité funkce používat předpočítané textury moderní GPU mají velmi rychlé čtení textur a dost texturovacích jednotek

Efektivní programování v Cg II používat datové typy s minimální přesností (která ještě dostačuje naší aplikaci) fixed je rychlejší než half, ten je rychlejší než float používat efektivní vestavěné funkce pro stínování používat dot() saturate() je ve fragment programu zdarma používat lit() konstantní hodnoty přesunout do VP nebo na CPU lineárně nebo téměř lineárně se měnící veličiny počítat ve VP a nechat si je interpolovat do fragmentů zkoumat vždy možnost méně přesné, rychlejší varianty

Efektivní programování v Cg III netransponovat matici jen kvůli násobení! mul( transpose(m), v ) == mul( v, m ) minimalizovat délku podmíněného kódu ve fragmentových programech profily < fp40 neumějí opravdové podmíněné skoky program se vykonává tak, že se spočítají všechny větve a až na konci se provede podmíněné přiřazení

CgFX formát textový formát pro výměnu shaderů i celých algoritmů syntakticky identický s.fx (Microsoft) místo HSLS jazyka je použitý Cg shadery ve vyšším jazyce i v assembleru možnost popsat FFP algoritmus (FFP fázi) napojení na GUI ( tweakable parameters ) propojení s texturami a datovými soubory (3D) CgFX obsahuje kompletní popis vizuálního efektu víceprůchodové algoritmy, nastavení GPU stavu, apod. starší terminologie: effect file (Microsoft)

CgFX techniky popis (konfigurace) efektu pro jeden cílový profil fragment shader verze / FFP verze jemné detaily / hrubý LoD syntax: technique ShaderVersion { }; každá technika může obsahovat více průchodů každý průchod definuje použití shaderů na vrcholech, fragmentech nebo konfiguraci FFP typicky se v jedné technice nemíchá FFP se shadery ( Zfighting )

Popis jednoho průchodu nastavení zobrazovacího řetězce (zápis do depthbufferu, použití stencil-bufferu, apod.) použitý vertex shader a fragment shader příklad: pass firstpass { DepthWriteEnable = true; AlphaBlendEnable = true; MinFilter[0] = Linear; MagFilter[0] = Linear; PixelShader = asm { ps.1.1 tex t0; mov r0, t0; }; };

Globální proměnné CgFX popis globálních proměnných (sémantika) proměnné CgFX souboru, propojení s aplikací přes sémantiku float4x4 myviewmatrix : ViewMatrix; texture2d texture : DiffuseMap; použití v shaderech (na pozici uniform parametrů): pass firstpass { ZEnable = true; ZWriteEnable = true; CullMode = None; VertexShader = compile vp30 vsmy ( myviewmatrix, texture, ); };

Anotace globálních proměnných jak má být hodnota proměnné ( tweakable ) nastavována v GUI aplikaci (FX Composer, ) píše se do špičatých závorek: float4x4 bumpheight < string gui = slider ; float uimin = 0.0f; float uimax = 1.0f; float uistep = 0.1f; > = 0.5f;

Literatura Randima Fernando, Mark J. Kilgard: The Cg Tutorial, Addison-Wesley, 2003, ISBN: 0321194969 http://developer.nvidia.com/cg/