Vorlesungsskript Computergraphik II - IWR
Vorlesungsskript Computergraphik II - IWR
Vorlesungsskript Computergraphik II - IWR
Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.
YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.
2.3. C FOR GRAPHICS 33<br />
an das Cg-Programm übergeben wird. Anders als in Renderman darf ein als uniform übergebener<br />
Parameter durchaus auf der GPU verändert werden. In Cg wird nicht zwischen uniform und<br />
einem nur in Renderman bekannten Qualifier varying unterschieden. Ein mit uniform übergebener<br />
Parameter wird als Variable behandelt. Wenn eine Variable nicht initialisiert wurde, kann das in<br />
der Entry function immer noch geschehen und dabei auch mit einer Semantik versehen werden, die<br />
beispielsweise für die Ausgabe dieses Cg-Programms benötigt wird.<br />
Besonderheiten 7: Swizzling Eine syntaktische Besonderheit stellt das Swizzling dar. Damit ist<br />
der Zugriff auf die Komponenten von Vektoren oder Matrizen in beliebiger Reihenfolge möglich.<br />
Zunächst können die Komponenten entsprechender Vektoren float4 position, color; über<br />
die folgende Konvention aufgerufen und zugewiesen werden (wenn kein w angegeben wird, ist implizit<br />
w = 1):<br />
float3 P = position.xyz;<br />
float4 Q = position.xyzw;<br />
float4 C = color.rgba;<br />
Beide Suffix Zeichenketten sind gültig, können aber nicht gemischt werden. Sie bezeichnen in natürlicher<br />
Weise die erste (r oder x), zweite (g oder y), dritte (b oder z) und vierte (a oder w) Komponente.<br />
Weder C noch C++ unterstützen das Swizzling, da keine der Sprachen Vektorrechnung unterstützt.<br />
Beispiel 2.4 Dieses Beispiel zeigt, wie einfach mit der Syntax einzelne Komponenten eines Vektors<br />
überschrieben werden können.<br />
float4 vec1 = float4(4.0, -2.0, 5.0, 3.0); // float4 als Konstruktor<br />
float2 vec2 = vec1.yx; // vec2 = (-2.0, 4.0)<br />
float scalar = vec1.w; // scalar = 3.0<br />
float3 vec3 = scalar.xxx; // vec3 = (3.0, 3.0, 3.0)<br />
vec1.xw = vec2; // vec1 = (-2.0,-2.0, 5.0, 4.0)<br />
Beispiel 2.5 Gleiches gilt für Matrizen mit der Notation *. m.<br />
float4x4 myMatrix;<br />
float myScalar;<br />
float4 myVec4;<br />
myScalar = myMatrix._m32;<br />
myVec4 = myMatrix._m00_m11_m22_m33<br />
myVec4 = myMatrix[0]<br />
// myMatrix[3][2]<br />
// Diagonale<br />
// erste Reihe der Matrix