A Cg programozási nyelv

Példaprogramok



Elérhető legjobb környezet lekérdezése

A következő függvény a videokártya által támogatott legfejlettebb profilokat kérdezi le, és jeleníti meg az adataikat DirectX 9 alatt.

static void checkProfiles() { char vprofile[64]; char fprofile[64]; char buffer[4096]; // Legjobb elerheto vertex profil megallapitasa myCgVertexProfile = cgD3D9GetLatestVertexProfile(); checkForCgError("getting latest vertex profile"); if (myCgVertexProfile == CG_PROFILE_VS_1_1) strcpy_s(vprofile, 64, "Vertex profile 1.1"); else if (myCgVertexProfile == CG_PROFILE_VS_2_0) strcpy_s(vprofile, 64, "Vertex profile 2.0"); else if (myCgVertexProfile == CG_PROFILE_VS_2_X) strcpy_s(vprofile, 64, "Vertex profile 2.x"); else if (myCgVertexProfile == CG_PROFILE_VS_2_SW) strcpy_s(vprofile, 64, "Vertex profile 2 sw"); else if (myCgVertexProfile == CG_PROFILE_VS_3_0) strcpy_s(vprofile, 64, "Vertex profile 3.0"); else strcpy_s(vprofile, 64, "Unknown vertex profile"); // Legjobb elerheto fragment profil megallapitasa myCgPixelProfile = cgD3D9GetLatestPixelProfile(); checkForCgError("getting latest pixel profile"); if (myCgPixelProfile == CG_PROFILE_PS_1_1) strcpy_s(fprofile, 64, "Fragment profile 1.1"); else if (myCgPixelProfile == CG_PROFILE_PS_1_2) strcpy_s(fprofile, 64, "Fragment profile 1.2"); else if (myCgPixelProfile == CG_PROFILE_PS_1_3) strcpy_s(fprofile, 64, "Fragment profile 1.3"); else if (myCgPixelProfile == CG_PROFILE_PS_2_0) strcpy_s(fprofile, 64, "Fragment profile 2.0"); else if (myCgPixelProfile == CG_PROFILE_PS_2_X) strcpy_s(fprofile, 64, "Fragment profile 2.x"); else if (myCgPixelProfile == CG_PROFILE_PS_2_SW) strcpy_s(fprofile, 64, "Fragment profile 2 sw"); else if (myCgPixelProfile == CG_PROFILE_PS_3_0) strcpy_s(fprofile, 64, "Fragment profile 3.0"); else strcpy_s(fprofile, 64, "Unknown fragment profile"); sprintf_s(buffer, 4096, "%s\n%s", vprofile, fprofile); MessageBoxA(0, buffer, "Teszt eredmenyek", MB_OK | MB_ICONINFORMATION | MB_TASKMODAL); }

A teljes program a példaprogramok között EnvTest néven található meg

Vertex shader példaprogram

Egy egyszerű vertex shader program bemutatására szolgál a whirl elnevezésű program.

A shader-t a keretprogram futási időben fordítja, ezért annak átírásával kényelmesen lehet kísérletezni.

A program egy négyzetrács csúcsait kapja bemenetként, és ezt csavarja meg. A csavarás algoritmusa egyszerűen, hogy az origótól távolabbi pontokat nagyobb szöggel forgatja el. A forgatás alap mértékét a CPU-tól a twisting paraméterben kapja, amit a CPU-n futó program képkockánként változtat.

A kód tartalmaz pár váloztatási lehetőséget, amit a megfelelő sorok ki- és bekommentezésével lehet kipróbálni

struct output { float4 position : POSITION; float4 color : COLOR; }; // A shader kimeno parameter strukturaja output whirl(float2 position : POSITION, // Vertex adatok - pozicio float4 color : COLOR, // Vertex adatok - szin uniform float twisting) // CPU-tol kapott parameters { output OUT; float l = length(position); // --- float angle = twisting * l*2; // a csavaras merteke aranyos // az origotol vett tavolsaggal float cosLength, sinLength; //sincos(angle, sinLength, cosLength); // sin/cos szamitas, // Vertex Profile 1.1 alatt rossz! sinLength = sin(angle); cosLength = cos(angle); OUT.position[0] = cosLength * position[0] + // forgatas origo korul -sinLength * position[1]; // '' OUT.position[1] = sinLength * position[0] + // '' cosLength * position[1]; // '' OUT.position[2] = 0; OUT.position[3] = 1; // --- // Kiprobalhato: // Rajzolas torzitas nelkul //OUT.position = float4(position,0,1); //az eredeti szinezes kek-feher, de swizzling-el konnyen lecserelheto, //sot a szelek sotetedjenek is OUT.color = float4(color.rbb*(1.2-l),1); // Kiprobalhato: // Rajzolas sajat szinnel //OUT.color = color; // Csak sotetitessel //OUT.color = color*(1.2-l); return OUT; }

A futás során a shader program nagyságrendileg 30 000 csúcsot dolgoz fel képkockánként

A környezet által átadott négyzetrács és a változó paraméter számos egyéb kísérletet tesz lehetővé, csupán a Cg program megváltoztatásával.