Sonntag, 7. September 2008

entwickler.com Magazine Konferenzen Akademie Entwickler-Forum Jobbörse Bücher
Software & Support Verlag




April 2006
aus Der Entwickler Ausgabe: 05.2002
Schnelle Schatten
Nvidias Cg - C for Graphics
von Sebastian Brück

Für viele Spieleprogrammierer soll in Zukunft das Erstellen von komplizierter, realistischer Grafik um einiges leichter von der Hand gehen: Dank Nvidias neuer Programmiersprache Cg (C for Graphics) werden Shader und visuelle Effekte in Echtzeit sowohl für DirectX- als auch OpenGL-Umgebungen möglich. In diesem Artikel möchten wir auf die Entstehungsgeschichte von Cg eingehen und die Vorteile der von Nvidia als revolutionär bezeichneten Sprache erläutern.


Es war einmal
Wer kann sich noch an die Zeiten erinnern, in denen mehr oder weniger aufwändige 3D-Berechnungen einzig und allein über die CPU, im so genannten Softwaremode, liefen? Wer nicht mit der nötigen Rechenpower ausgestattet war, dem blieb der Genuss von (damals noch recht ansehnlichen, heute wohl eher als lachhaft einzustufenden) Animationen versagt. Ein frischer Wind kam erst mit der Einführung von leistungsfähigen Grafikkarten auf, die es erstmals möglich machten, die CPU zu entlasten, indem bestimmte Grafikberechnungen über den Grafikchip (GPU) liefen. Im Laufe der Jahre steigerte sich die Performance der Grafikkarten immer mehr, was sich zuletzt mit T&L (Transform & Lighting) deutlich bemerkbar machte. Wer die Entwicklung von Grafikkarten einmal etwas genauer betrachtet, dem wird sicher nicht entgangen sein, dass der moderne Grafikchip immer mehr die Grundzüge einer CPU annimmt bzw. sich zu einem Grafikchip-CPU-Mix mausert - mit dem großen Unterschied, dass sich die Grafikkarte weiterhin einzig und allein auf das Berechnen komplizierter Grafik konzentriert, während die eigentliche CPU flexibel bleibt und sich um den anfallenden Rest kümmert.

Moderne Grafikchips
ATIs Radeon 8500 sowie ihre kommenden Nachfolger besitzen die erste Stufe dieses Grafikchip-CPU-Mixes, nämlich programmierbare Shader. Einen guten Schritt weiter geht der kommende P10-Grafikchip von 3DLabs, der sogar vollständig programmierbar sein soll. Doch wo bleibt der Zusammenhang mit Nvidias Cg-Technologie? Nun, Cg darf als Programmiersprache verstanden werden, um solche Shader-Programmierungen vereinfacht umzusetzen. Mussten in der Vergangenheit solche Programmierarbeiten noch umständlich in Assembler (Maschinencode) realisiert werden, geht es heutzutage mit C/C++, oder aber auch künftig mit Cg, wesentlich einfacher. Der Entwickler spart sich damit eine Menge Arbeit und kann schon mit wenigen Befehlen zu beeindruckenden Ergebnissen kommen. Die Assembly-Sprache eignet sich hervorragend für die Programmierung von kleinen, kurzen Programmen, aber in Zeiten, in denen sich GPUs mehr und mehr programmieren lassen, leistungsfähiger werden und längere, flexiblere Programme unterstützen, wird der Einsatz von Assembler zur Qual. Deutlich wird dies durch ein kurzes Beispiel, in dem Assembly-Code mit Nvidias Cg verglichen wird (siehe Listing 1).


Abb. 1: Einfacher Phong Shader

Listing 1
Assembly Code für den Phong Shader in Abb. 1:

...
RSQR R0.x, R0.x;
MULR R0.xyz, R0.xxxx, R4.xyzz;
MOVR R5.xyz, -R0.xyzz;
MOVR R3.xyz, -R3.xyzz;
DP3R R3.x, R0.xyzz, R3.xyzz;
SLTR R4.x, R3.x, {0.000000}.x;
ADDR R3.x, {1.000000}.x, -R4.x;
MULR R3.xyz, R3.xxxx, R5.xyzz;
MULR R0.xyz, R0.xyzz, R4.xxxx;
ADDR R0.xyz, R0.xyzz, R3.xyzz;
DP3R R1.x, R0.xyzz, R1.xyzz;
MAXR R1.x, {0.000000}.x, R1.x;
LG2R R1.x, R1.x;
MULR R1.x, {10.000000}.x, R1.x;
EX2R R1.x, R1.x;
MOVR R1.xyz, R1.xxxx;
MULR R1.xyz, {0.900000, 0.800000, 1.000000}.xyzz, R1.xyzz;
DP3R R0.x, R0.xyzz, R2.xyzz;
MAXR R0.x, {0.000000}.x, R0.x;
MOVR R0.xyz, R0.xxxx;
ADDR R0.xyz, {0.100000, 0.100000, 0.100000}.xyzz, R0.xyzz;
MULR R0.xyz, {1.000000, 0.800000, 0.800000}.xyzz, R0.xyzz;
ADDR R1.xyz, R0.xyzz, R1.xyzz;
...

Cg Shader für denselben Phong Shader:

...
COLOR cSpec = pow(max(0, dot(Nf, H)), phongExp).xxx;
COLOR cPlastic = Cd * (cAmbi + cDiff) + Cs * cSpec;

Selbst für den Laien wird sofort erkennbar, dass das Programmieren mit Cg eine ernorme Zeitersparnis mit sich bringen wird. So ist es nicht nur möglich, eine große Anzahl Shader innerhalb derselben Zeit zu entwickeln, auch können einmal entwickelte Effekte für mehrere APIs und Plattformen (wir sprechen nicht nur von PCs, sondern auch von Konsolen!!!) kompiliert werden. Eine Tatsache, welche den Spieleprogrammierern künftig den Zugang zum gesamten Spieleentwicklermarkt gewährt.

Es ist ganz einfach nicht möglich, eine moderne Applikation, ein Spiel oder ein Betriebssystem ohne etwas wie C zu schreiben. Und Cg wird einen ähnlichen Einfluss im Grafikbereich haben." Gabe Newell, Managing Director Valve Entertainment

Wissenswertes über Cg
Die Idee zu Nvidias Cg-Programmiersprache stammt eigentlich aus der Filmbranche: Namhafte Studios wie Pixar und Dreamworks arbeiten mit einer Sprache namens RenderMan, welche unter Einsatz von leistungsfähigen Rechnern komplette 3D-Szenen mit Geometrie, Texturen und Shadern rendert. Nvidia, inspiriert durch RenderMan, entwarf in Zusammenarbeit mit Microsoft eine ähnliche Programmiersprache, nämlich Cg. Das C deutet hierbei die Verwandtschaft zu High Level-Programmiersprachen wie eben C oder C++ an und hebt auch die Ähnlichkeit in punkto Einfachheit und Programmiergeschwindigkeit hervor. Bei der Cg Language-Spezifikation handelt es sich um eine offene Sprache, d.h. es soll in absehbarer Zeit eine Open Source-Implementierung des Cg Compiler Frontends bereitstehen. Da Cg nicht nur das kommende DirectX 9 von Microsoft, sondern auch OpenGL unterstützt, wird Nvidias neue Programmiersprache in Zukunft dazu beitragen, den Computerspiele-Markt auch Nutzern von Betriebssystemen wie Linux und Mac OS weiter zu öffnen, und eine Konvertierung erfolgreicher Videospiele-Bestseller zu ermöglichen. Allen Kritikern sei an dieser Stelle noch einmal deutlich gesagt: Cg wird weder OpenGL noch DirectX ersetzen, sondern lediglich als Layer über OpenGL und über den DirectX Vertex- und Pixel Shader-APIs operieren. Neben der eigentlichen Sprache Cg hat Nvidia ein spezielles Toolkit zusammengestellt, welches aus Cg Compiler, Cg Browser, Cg Standard Library und einer Reihe von fertigen Cg Shadern besteht. Bei dem Cg Compiler handelt es sich im eine Anwendung, welche Cg-Befehle als Input akzeptiert und diese als Assembly-Sprache ausgibt, um von modernen, programmierbaren GPUs verarbeitet zu werden. Zur Zeit befindet sich Cg noch im Beta-Status - Nvidia hat jedoch eine optimierte Endversion für kommenden Herbst angekündigt. Wie auch bei Treibern für Grafikkarten plant Nvidia regelmäßige Updates für den Cg-Compiler, um die höchstmögliche Performance zu erreichen und sich der jeweils aktuellen Generation von Grafikhardware anpassen zu können.

Links
Nvidia does Cg - http://www.anandtech.com/video/


    Hat Ihnen dieser Artikel gefallen? Dann abonnieren Sie das Entwickler Magazin direkt über unser Online-Formular.



zur vorherigen Seite
zurück
an den Anfang der Seite
nach oben
Diesen Artikel drucken
drucken
Diesen Artikel weiterempfehlen
empfehlen
Software & Support Verlag GmbH