Cg

Aus DGL Wiki
Wechseln zu: Navigation, Suche

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

Siehe auch

Shader, GLSL