Kubische Umgebungszuordnung (Direct3D 9)

Kubische Umgebungskarten – manchmal auch als Würfelkarten bezeichnet – sind Texturen, die Bilddaten enthalten, die die Szene um ein Objekt herum darstellen, als ob das Objekt in der Mitte eines Würfels wäre. Jede Vorderseite der kubischen Umgebungskarte deckt ein Sichtfeld von 90 Grad im horizontalen und vertikalen Bereich ab, und es gibt sechs Gesichter pro Würfelkarte. Die Ausrichtung der Gesichter ist in der folgenden Abbildung dargestellt.

Abbildung eines Würfels mit zentralen Koordinatenachsen senkrecht zu Würfelflächen

Jede Fläche des Würfels ist senkrecht zur x/y-, y/z- oder x/z-Ebene im Weltraum ausgerichtet. Die folgende Abbildung zeigt, wie jede Ebene einem Gesicht entspricht.

Abbildung von Würfelflächen mit Koordinatenprojektionen von Ebenen

Kubische Umgebungskarten werden als eine Reihe von Texturobjekten implementiert. Anwendungen können statische Bilder für kubische Umgebungszuordnungen verwenden, oder sie können in die Gesichter der Cubezuordnung gerendert werden, um dynamische Umgebungszuordnungen durchzuführen. Diese Technik erfordert, dass es sich bei den Cube-Map-Oberflächen um gültige Renderzieloberflächen handelt, die mit dem D3DUSAGE_RENDERTARGET-Flag erstellt wurden.

Die Gesichter einer Würfelkarte müssen keine extrem detaillierten Renderings der umgebenden Szene enthalten. In den meisten Fällen werden Umgebungskarten auf gekrümmte Oberflächen angewendet. Angesichts der von den meisten Anwendungen verwendeten Krümmung macht die resultierende reflektierende Verzerrung extreme Details in der Umgebungskarte verschwenderisch in Bezug auf Arbeitsspeicher und Renderingmehraufwand.

Mipmapped Kubische Umgebungskarten

Cubezuordnungen können mipmappeniert werden. Um eine mipmapped-Cubezuordnung zu erstellen, legen Sie den Levels-Parameter der CreateCubeTexture-Methode auf die gewünschte Anzahl von Ebenen fest. Sie können sich die Topographie dieser Flächen wie im folgenden Diagramm vorstellen.

Diagramm einer mipmappen-Würfelkarte mit n mip-Ebenen

Anwendungen, die mipmappenfähige kubische Umgebungskarten erstellen, können auf jedes Gesicht zugreifen, indem sie die GetCubeMapSurface-Methode aufrufen. Legen Sie zunächst den entsprechenden Wert aus dem D3DCUBEMAP_FACES aufgezählten Typ fest, wie unter Erstellen kubischer Umgebungskartenoberflächen (Direct3D 9) beschrieben. Wählen Sie als Nächstes die abzurufende Ebene aus, indem Sie den Parameter GetCubeMapSurface auf die gewünschte Mipmap-Ebene festlegen. Denken Sie daran, dass 0 dem Bild der obersten Ebene entspricht.

Texturkoordinaten für kubische Umgebungskarten

Texturkoordinaten, die eine kubische Umgebungskarte indizieren, sind keine einfachen U-, V-Formatkoordinaten, wie sie beim Anwenden von Standardtexturen verwendet werden. Tatsächlich verwenden kubische Umgebungskarten überhaupt keine Texturkoordinaten. Anstelle einer Reihe von Texturkoordinaten erfordern kubische Umgebungskarten einen 3D-Vektor. Sie müssen darauf achten, ein korrektes Vertexformat anzugeben. Sie müssen dem System nicht nur mitteilen, wie viele Sätze von Texturkoordinaten Ihre Anwendung verwendet, sie müssen auch Informationen darüber bereitstellen, wie viele Elemente in den einzelnen Sätzen enthalten sind. Direct3D bietet die D3DFVF_TEXCOORDSIZEN Satz von Makros für diesen Zweck. Diese Makros akzeptieren einen einzelnen Parameter, der den Index des Texturkoordinatensatzes identifiziert, für den die Größe beschrieben wird. Im Fall eines 3D-Vektors schließen Sie das bitmuster ein, das vom makro D3DFVF_TEXCOORDSIZE3 erstellt wurde. Im folgenden Codebeispiel wird gezeigt, wie dieses Makro verwendet wird.

// Create a flexible vertex format descriptor for a vertex that contains
//   a position, normal, and one set of 3D texture coordinates.

DWORD dwFVF = D3DFVF_XYZ | D3DFVF_NORMAL | D3DFVF_TEX1 | D3DFVF_TEXCOORDSIZE3(0); 

In einigen Fällen, z. B. bei der diffusen Lichtzuordnung, verwenden Sie den Kamera-Raum-Vertex normal für den Vektor. In anderen Fällen, z. B. bei der Zuordnung einer spiegelförmigen Umgebung, verwenden Sie einen Reflektionsvektor. Da transformierte Scheitelpunktnormale weitgehend verstanden werden, konzentrieren sich die Informationen hier auf die Berechnung eines Reflektionsvektors.

Die Berechnung eines Reflektionsvektors für sich selbst erfordert das Verständnis der Position jedes Scheitelpunkts und eines Vektors vom Standpunkt zum Scheitelpunkt. Direct3D kann die Reflektionsvektoren für Ihre Geometrie automatisch berechnen. Die Verwendung dieses Features spart Arbeitsspeicher, da Sie keine Texturkoordinaten für die Umgebungszuordnung einschließen müssen. Außerdem wird die Bandbreite reduziert, und im Fall eines T&L HAL-Geräts kann es erheblich schneller sein als die Berechnungen, die Ihre Anwendung selbst durchführen kann. Um dieses Feature zu verwenden, legen Sie in der Texturstufe, die die kubische Umgebungskarte enthält, den zustand der D3DTSS_TEXCOORDINDEX Texturphase auf eine Kombination aus dem D3DTSS_TCI_CAMERASPACEREFLECTIONVECTOR Member von D3DTEXTURESTAGESTATETYPE und dem Index eines Texturkoordinatensatzes fest. In einigen Situationen, z. B. diffuse Lichtzuordnung, können Sie den D3DTSS_TCI_CAMERASPACENORMAL Member von D3DTEXTURESTAGESTATETYPE verwenden, wodurch das System den transformierten Kameraraum und den Vertex normal als Adressierungsvektor für die Textur verwendet. Der Index wird nur vom System verwendet, um den Umbruchmodus für die Textur zu bestimmen.

Das folgende Codebeispiel zeigt, wie dieser Wert verwendet wird.

// The m_d3dDevice variable is a valid pointer
// to an IDirect3DDevice9 interface.

// Automatically generate texture coordinates for stage 2.
// This assumes that stage 2 is assigned a cube map.
// Use the wrap mode from the texture coordinate set at index 1.

m_d3dDevice->SetTextureStageState( 2, D3DTSS_TEXCOORDINDEX,
                                   D3DTSS_TCI_CAMERASPACEREFLECTIONVECTOR | 1); 

Wenn Sie die automatische Texturkoordinatengenerierung aktivieren, verwendet das System eine von zwei Formeln, um den Reflektionsvektor für jeden Scheitelpunkt zu berechnen. Wenn der D3DRS_LOCALVIEWER Renderzustand auf TRUE festgelegt ist, wird die folgende Formel verwendet.

Formel des Reflektionsvektors (r = 2(exn)n-e)

In der obigen Formel ist R der berechnete Reflektionsvektor, E ist der normalisierte Position-zu-Auge-Vektor und N der Kameraraumvertexnormal.

Wenn der D3DRS_LOCALVIEWER Renderzustand auf FALSE festgelegt ist, verwendet das System die folgende Formel.

Formel des Reflektionsvektors (r = 2nzn-i)

Die R- und N-Elemente in dieser Formel sind mit der vorherigen Formel identisch. Das NZ-Element ist der Weltraum z des Scheitelpunktnormal, und I ist der Vektor (0,0,1) eines unendlich entfernten Standpunkts. Das System verwendet den Reflektionsvektor aus beiden Formeln, um die entsprechende Würfelzuordnung auszuwählen und zu adressieren.

Hinweis

In den meisten Fällen sollten Anwendungen die automatische Normalisierung von Vertexnormalen aktivieren. Legen Sie dazu D3DRS_NORMALIZENORMALS auf TRUE fest. Wenn Sie diesen Renderzustand nicht aktivieren, unterscheidet sich die Darstellung der Umgebungszuordnung drastisch von Den Erwartungen.

 

Weitere Informationen finden Sie im folgenden Thema.

Umgebungszuordnung