<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://wiki-de.moshellshocker.dns64.de/index.php?action=history&amp;feed=atom&amp;title=C_for_graphics</id>
	<title>C for graphics - Versionsgeschichte</title>
	<link rel="self" type="application/atom+xml" href="https://wiki-de.moshellshocker.dns64.de/index.php?action=history&amp;feed=atom&amp;title=C_for_graphics"/>
	<link rel="alternate" type="text/html" href="https://wiki-de.moshellshocker.dns64.de/index.php?title=C_for_graphics&amp;action=history"/>
	<updated>2026-06-10T18:17:08Z</updated>
	<subtitle>Versionsgeschichte dieser Seite in Wikipedia (Deutsch) – Lokale Kopie</subtitle>
	<generator>MediaWiki 1.43.8</generator>
	<entry>
		<id>https://wiki-de.moshellshocker.dns64.de/index.php?title=C_for_graphics&amp;diff=341310&amp;oldid=prev</id>
		<title>93.214.142.100 am 16. Mai 2025 um 08:00 Uhr</title>
		<link rel="alternate" type="text/html" href="https://wiki-de.moshellshocker.dns64.de/index.php?title=C_for_graphics&amp;diff=341310&amp;oldid=prev"/>
		<updated>2025-05-16T08:00:07Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Neue Seite&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&amp;#039;&amp;#039;&amp;#039;C for Graphics&amp;#039;&amp;#039;&amp;#039; (Abkürzung: &amp;#039;&amp;#039;Cg&amp;#039;&amp;#039;) ist eine von [[Nvidia]] begründete &amp;#039;&amp;#039;High Level [[Shader]] Language&amp;#039;&amp;#039; (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 zugrundeliegenden Grafik-[[Programmierschnittstelle|API]]- ([[OpenGL]] und [[DirectX]]) und dem Grafikkartenhersteller (Nvidia und [[ATI Technologies|ATI]]).&lt;br /&gt;
&lt;br /&gt;
== Hochsprache ==&lt;br /&gt;
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 [[Lib Sh|Sh]] als [[Metasprache]].&lt;br /&gt;
&lt;br /&gt;
== Syntax ==&lt;br /&gt;
Cg ähnelt von der Syntax her der Programmiersprache [[C (Programmiersprache)|C]]. Bestandteile sind u.&amp;amp;nbsp;a. einfache Datentypen, Arrays, Bedingungen und Schleifen.&lt;br /&gt;
Aufgrund der Zusammenarbeit zwischen NVIDIA und Microsoft ist die Syntax von Cg sehr stark an HLSL angelehnt.&lt;br /&gt;
&lt;br /&gt;
== Datentypen ==&lt;br /&gt;
* int (32 bit integer)&lt;br /&gt;
* float (32 bit floating point)&lt;br /&gt;
* half (16 bit floating point)&lt;br /&gt;
* fixed (12 bit fixed point, 1-1-10)&lt;br /&gt;
* double&lt;br /&gt;
* bool&lt;br /&gt;
* sampler (für Texturobjekte)&lt;br /&gt;
Auf manchen Grafikkarten wird jedoch alles auf float gerechnet.&lt;br /&gt;
&lt;br /&gt;
Hinzu kommen die entsprechenden Vektoren und Matrizen: float2, float3, float4, float4x4.&lt;br /&gt;
&lt;br /&gt;
== Parameter ==&lt;br /&gt;
Ausgabe-Parameter werden mit &amp;#039;&amp;#039;&amp;#039;out&amp;#039;&amp;#039;&amp;#039; gekennzeichnet:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
out float4 pos : POSITION; // Eckpunkt, der vom Vertex-Programm weitergegeben wird&lt;br /&gt;
out float4 color : COLOR; // Farbe, die vom Vertex-Programm weitergegeben wird&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Uniform-Parameter werden außerhalb vom Vertex-Programm gesetzt und ändern sich nicht pro Eckpunkt:&lt;br /&gt;
&lt;br /&gt;
z.&amp;amp;nbsp;B. in einem OpenGL-Programm:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
CGparameter timeParam = cgGetNamedParameter(vertexProgram, &amp;quot;time&amp;quot;);&lt;br /&gt;
CGparameter modelviewParam = cgGetNamedParameter(vertexProgram, &amp;quot;modelview&amp;quot;);&lt;br /&gt;
cgGLSetParameter1f(timeParam, 100);&lt;br /&gt;
cgGLSetStateMatrixParameter(modelviewParam, CG_GL_MODELVIEW_MATRIX, CG_GL_MATRIX_IDENTITY);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Verwendung dann im Vertex-Programm:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
uniform float time;&lt;br /&gt;
uniform float4x4 modelview;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Zugriff auf OpenGL State ==&lt;br /&gt;
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.&amp;amp;nbsp;B.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
glstate.matrix.mvp // Projection * Modelview&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Profile ==&lt;br /&gt;
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:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
CGprofile vertexProfile = cgGLGetLatestProfile(CG_GL_VERTEX);&lt;br /&gt;
cgGLSetOptimalOptions(vertexProfile);&lt;br /&gt;
CGprofile fragmentProfile = cgGLGetLatestProfile(CG_GL_FRAGMENT);&lt;br /&gt;
cgGLSetOptimalOptions(fragmentProfile);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Profil ausgeben lassen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
cgGetProfileString(fragmentProfile)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Einbindung und Programmierung ==&lt;br /&gt;
Die erstellten Programm-Codes können separat kompiliert und als externe Quelle in ein lauffähiges Hochsprachen-Programm (z.&amp;amp;nbsp;B. [[C++]]) eingebunden oder alternativ erst zur Laufzeit übersetzt werden.&lt;br /&gt;
&lt;br /&gt;
Es muss zunächst ein Kontext (Speicher für Programme) erzeugt und dann das Programm kompiliert werden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
CGcontext context = cgCreateContext();&lt;br /&gt;
CGprogram program = cgCreateProgramFromFile(context, CG_SOURCE, filename, profile, &amp;quot;main&amp;quot;, NULL);&lt;br /&gt;
cgGLLoadProgram(program);  // Programm laden&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Anschließend erfolgen Aktivierung und Auswahl des Programms:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
// Profil aktivieren (und Programm aktivieren)&lt;br /&gt;
cgGLEnableProfile(CGProfile profile);&lt;br /&gt;
…&lt;br /&gt;
// Ab hier läuft jeder glVertex() durchs eigene Vertex Program&lt;br /&gt;
…&lt;br /&gt;
// Profil (und Programm deaktivieren)&lt;br /&gt;
cgGLDisableProfile(CGProfile profile)&lt;br /&gt;
…&lt;br /&gt;
// Ab jetzt läuft wieder jeder glVertex() durch die Standard OpenGL&lt;br /&gt;
// Pipeline&lt;br /&gt;
…&lt;br /&gt;
// Aktuelles Vertex/Fragment Program festlegen&lt;br /&gt;
cgGLBindProgram(myVertexProgram);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Vor- und Nachteile ==&lt;br /&gt;
=== Vorteil ===&lt;br /&gt;
Da Cg sowohl Platform- als auch Grafikschnittstellen-unabhängig ist, muss ein Shader nur einmal in Cg geschrieben werden und&lt;br /&gt;
kann für nahezu jedes Render-System verwendet werden.&lt;br /&gt;
Arbeitet ein Programmierer mit GLSL und HLSL, müssen Shader-Effekte mehrfach geschrieben werden.&lt;br /&gt;
&lt;br /&gt;
=== Nachteil ===&lt;br /&gt;
Während die Cg-Shader auf Grafikkarten mit NVIDIA-GPU (z.&amp;amp;nbsp;B. der [[Nvidia Geforce|GeForce]]-Serie) weitestgehend optimal laufen,&lt;br /&gt;
ist die Umsetzung für andere Grafik-Chips, wie denen von AMD (z.&amp;amp;nbsp;B. der [[Radeon]]-Serie) meist eher schlecht.&lt;br /&gt;
Darauf haben die anderen Chip-Hersteller – wie eben AMD – jedoch keinen direkten Zugriff, da das Cg-Toolkit nur von NVIDIA entwickelt wird.&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
* [http://developer.nvidia.com/page/cg_main.html Cg] bei NVIDIA (englisch)&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:C (Programmiersprache)]]&lt;br /&gt;
[[Kategorie:Programmiersprache]]&lt;/div&gt;</summary>
		<author><name>93.214.142.100</name></author>
	</entry>
</feed>