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