C for graphics
# C for graphics

C for Graphics (Abkürzung: Cg) war eine von Nvidia begründete High Level Shader Language (nicht zu verwechseln mit High Level Shading Language) zum Schreiben von Vertex-Shader-, Pixel-Shader-, Geometry-Shader- und Tessellation-Shader-Programmen. Die Sprache ist weitestgehend unabhängig von der zugrunde liegenden Grafik-API- (OpenGL und DirectX) und dem Grafikkartenhersteller (Nvidia und ATI).

## Hochsprache

Die Entwicklung einer Shader-Hochsprache wurde dadurch motiviert, dass das Programmieren von Vertex- und Pixel-Shadern in Maschinensprache recht kompliziert und schnell unübersichtlich ist. Weitere Shader-Hochsprachen sind GLSL, GLSL ES, HLSL und RenderMan. Einen anderen Ansatz verfolgt Sh als Metasprache.

## Syntax

Cg ähnelt von der Syntax her der Programmiersprache C. Bestandteile sind u. a. einfache Datentypen, Arrays, Bedingungen und Schleifen. Aufgrund der Zusammenarbeit zwischen NVIDIA und Microsoft ist die Syntax von Cg sehr stark an HLSL angelehnt.

## Datentypen

* int (32bit integer)
* float (32bit floating point)
* half (16bit floating point)
* fixed (12bit fixed point, 1-1-10)
* double
* bool
* sampler (für Texturobjekte)

Es sei darauf hingewiesen, dass auf manchen Grafikkarten alles auf float gerechnet wird.

Hinzu kommen die entsprechenden Vektoren und Matrizen: float2, float3, float4, float4x4.

## Parameter

Ausgabe-Parameter werden mit out gekennzeichnet:

Uniform-Parameter werden außerhalb vom Vertex-Programm gesetzt und ändern sich nicht pro Eckpunkt:

z. B. in einem OpenGL-Programm:

Verwendung dann im Vertex-Programm:

## Zugriff auf OpenGL State

Normalerweise erfolgt der Zugriff über Uniform-Parameter. Diese Parameter müssen im OpenGL-Programm immer neu gesetzt werden. Im Falle eines ARB-Profils ist der Zugriff auf einen OpenGL State möglich, z. B.

## Profile

Ein weiterer Aspekt ist die Möglichkeit zum Kompilieren für verschiedene Profile. Das sind verschiedene Versionen von Vertex- bzw. Fragment-Programmen, von denen automatisch das bestmögliche für die vorhandene Hardware aktiviert wird:

Profil ausgeben lassen:

## Einbindung und Programmierung

Die erstellten Programm-Codes können separat kompiliert und als externe Quelle in ein lauffähiges Hochsprachen-Programm (z. B. C++) eingebunden oder alternativ erst zur Laufzeit übersetzt werden.

Es muss zunächst ein Kontext (Speicher für Programme) erzeugt und dann das Programm kompiliert werden:

Anschließend erfolgen Aktivierung und Auswahl des Programms:

## Vor- und Nachteil

### Vorteil

Da Cg sowohl Platform- als auch Grafikschnittstellen unabhängig ist, muss ein Shader nur einmal in Cg geschrieben werden und kann für nahe zu jedes Render-System verwendet werden. Arbeitet ein Programmierer mit GLSL und HLSL müssen Shader Effekte mehrfach geschrieben werden.

### Nachteil

Während die Cg Shader auf Grafikkarten mit NVIDIA GPU (z. B. der GeForce Serie) weitestgehend optimal laufen, ist die Umsetzung für andere Grafik-Chips, wie denen von AMD (z. B. der Radeon Serie) meist eher schlecht. Darauf haben die anderen Chip-Hersteller – wie eben AMD – jedoch keinen direkten Zugriff, da das Cg Toolkit nur von NVIDIA entwickelt wird.

