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.