11.03.2014 Aufrufe

Vorlesungsskript Computergraphik II - IWR

Vorlesungsskript Computergraphik II - IWR

Vorlesungsskript Computergraphik II - IWR

MEHR ANZEIGEN
WENIGER ANZEIGEN

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

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!