Cg
Inhaltsverzeichnis
Allgemein
C for Graphics (Abkürzung: Cg) ist eine von NVIDIA begründete Shader-Hochsprache zum Schreiben von Vertex-Shader- und Fragment-Shader-Programmen. Eine Besonderheit von Cg ist die Plattform- und Grafikbibliothekunabhängigkeit: Somit kann ein Cg-Programm sowohl mit Direct3D als auch OpenGL verwendet werden.
Grundlegende Verwendung in einem OpenGL Programm
Initialisierung
Zunächst muss ein entsprechender Shadersystem Kontext erstellt werden:
var
FContext: PCGContext;
FContext := cgCreateContext;
Laden des Programmes
Danach muss dass entsprechende Programm hereingeladen und kompiliert werden. Hierbei sollte noch das beste verfügbare Shaderprofil auslesen. Zudem ist zu entscheiden, ob man einen Vertex- oder eine Fragmentshader laden möchte:
var
FProgram: PCGProgram;
FProfile: TCGProfile;
srctype: Cardinal;
//Entsprechenden Typus für die Quelle auswählen
case ASourceType of
assSource: srctype := CG_SOURCE;
assCompiled: srctype := CG_OBJECT;
end;
//Bestes Profil für den gewählten Shadertyp wählen
case AShaderType of
astVertex: FProfile := cgGLGetLatestProfile(CG_GL_VERTEX);
astFragment: FProfile := cgGLGetLatestProfile(CG_GL_FRAGMENT);
end;
//Beste optionen für das Profil setzten
cgGLSetOptimalOptions(FProfile);
//Programm laden und compilieren - ABuf bezeichnet einen PChar, der
//den Programmquelltext oder den Programmobjectcode enthält,
//AProgramName den Namen der Hauptfunktion des Shaderprogrammes
FProgram := cgCreateProgram(FContext, srctype, ABuf,
FProfile, AProgramName, nil);
Fehlerabfrage
Nun sollte man abfragen ob es beim Compilieren Fehler gegeben hat. Mit der Folgenden Prozedur ist dies ein leichtes:
procedure GetCGError;
var
error: CGError;
str: PChar;
buf: string;
begin
buf := '';
str := cgGetLastErrorString(@error);
if (error <> CG_NO_ERROR) then
begin
if (error = CG_COMPILER_ERROR) then
buf :=
'Compiler error ' + #13#10 +
cgGetLastListing(FSystem.Context)
else
buf := 'CG Runtime error' + str;
end;
if buf <> '' then
MessageBox(buf);
end;
Laden des Programms
Im nächsten Schritt wird das Programm geladen:
cgGLLoadProgram(FProgram);
Binden und Entbinden
Möchten wir nun den Shader anwenden, so müssen wir diesen an das oben erzeugte Profil Binden und das Profil aktivieren:
cgGLEnableProfile(FProfile);
cgGLBindProgram(FProgram);
Sind wir mit dem Zeichnen fertig, so müssen wir den Shader wieder entbinden und das Profil deaktivieren:
cgGLDisableProfile(FProfile);
cgGLUnbindProgram(FProfile);
Finalisierung
Sind wir mit der Verwendung unseres Shaderobjektes fertig, so müssen wir es zerstören:
if FProgram <> nil then
cgDestroyProgram(FProgram);
Am Ende unserer Anwendung sollte auch das Cg Shadersystem freigegeben werden:
if FContext <> nil then
cgDestroyContext(FContext);
Links
http://de.wikipedia.org/wiki/C_for_graphics
http://developer.nvidia.com/page/cg_main.html
http://http.developer.nvidia.com/CgTutorial/cg_tutorial_chapter01.html