Texturfilterung mit Mipmaps (Direct3D 9)
Eine Mipmap ist eine Sequenz von Texturen, von denen jede eine progressiv niedrigere Auflösungsdarstellung desselben Bilds ist. Die Höhe und Breite jedes Bilds oder jeder Ebene in der Mipmap ist eine Leistung von zwei kleiner als die vorherige Ebene. Mipmaps müssen nicht quadratisch sein.
Ein hochauflösendes Mipmap-Bild wird für Objekte verwendet, die sich in der Nähe des Benutzers befinden. Bilder mit niedrigerer Auflösung werden verwendet, wenn das Objekt weiter entfernt erscheint. Mipmapping verbessert die Qualität gerenderter Texturen auf Kosten von mehr Arbeitsspeicher.
Direct3D stellt Mipmaps als Kette angefügter Oberflächen dar. Die Textur mit der höchsten Auflösung befindet sich am Anfang der Kette und verfügt über die nächste Ebene der Mipmap als Anlage. Diese Ebene verfügt wiederum über eine Anlage, die die nächste Ebene in der Mipmap ist, und so weiter, bis zur niedrigsten Auflösungsebene der Mipmap.
Die folgenden Abbildungen zeigen ein Beispiel für diese Ebenen. Die Bitmaptexturen stellen ein Zeichen für einen Container in einem 3D-Spiel mit einer ersten Person dar. Wenn sie als Mipmap erstellt wird, steht die Textur mit der höchsten Auflösung an erster Stelle im Satz. Jede der folgenden Texturen im Mipmap-Satz ist in Höhe und Breite um eine Leistung von 2 kleiner. In diesem Fall beträgt die Mipmap mit maximaler Auflösung 256 x 256 Pixel. Die nächste Textur ist 128 x 128. Die letzte Textur in der Kette ist 64 x 64.
Dieses Vorzeichen hat einen maximalen Abstand, von dem es sichtbar ist. Wenn der Benutzer weit vom Vorzeichen entfernt beginnt, zeigt das Spiel die kleinste Textur in der Mipmapkette an, in diesem Fall die 64x64-Textur.

Wenn der Benutzer den Standpunkt näher an das Vorzeichen verschiebt, werden progressiv höher auflösungsbasierte Texturen in der Mipmap-Kette verwendet. Die Auflösung in der folgenden Abbildung ist 128 x 128.

Die Textur mit der höchsten Auflösung wird verwendet, wenn die Sicht des Benutzers den minimal zulässigen Abstand zum Vorzeichen aufzeig, wie in der folgenden Abbildung dargestellt.

Dies ist eine effizientere Möglichkeit, Perspektiven für Texturen zu simulieren. Anstatt eine einzelne Textur mit vielen Auflösungen zu rendern, ist es schneller, mehrere Texturen mit unterschiedlichen Auflösungen zu verwenden.
Direct3D kann bewerten, welche Textur in einem Mipmap-Satz der gewünschten Ausgabe am nächsten liegt, und Pixel in seinem Texelraum zuordnen. Wenn die Auflösung des endgültigen Bilds zwischen den Auflösungen der Texturen im Mipmap-Satz liegt, kann Direct3D Texel in beiden Mipmaps untersuchen und ihre Farbwerte miteinander mischen.
Um Mipmaps zu verwenden, muss Ihre Anwendung einen Satz von Mipmaps erstellen. Anwendungen wenden Mipmaps an, indem sie die Mipmap als erste Textur in der Gruppe der aktuellen Texturen auswählen. Weitere Informationen finden Sie unter Texturmischung (Direct3D 9).
Als Nächstes muss Ihre Anwendung die Filtermethode festlegen, die Direct3D verwendet, um Texelstichproben zu erstellen. Die schnellste Methode der Mipmapfilterung besteht in der Auswahl des nächstgelegenen Texels durch Direct3D. Verwenden Sie den aufzählten D3DTEXF _ POINT-Wert, um dies auszuwählen. Direct3D kann bessere Filterergebnisse erzielen, wenn Ihre Anwendung den linearen D3DTEXF-Wert _ verwendet. Dadurch wird das nächste Mipmap-Objekt ausgewählt, und anschließend wird ein gewichteter Durchschnitt der Texel berechnet, die die Position in der Textur umgeben, der das aktuelle Pixel zuschnitt.
Mipmaptexturen werden in 3D-Szenen verwendet, um die Zeit zu verringern, die zum Rendern einer Szene erforderlich ist. Sie verbessern auch den Realismus der Szene. Sie erfordern jedoch häufig große Mengen an Arbeitsspeicher.
Erstellen einer Gruppe von Mipmaps
Das folgende Beispiel zeigt, wie Ihre Anwendung die IDirect3DDevice9::CreateTexture-Methode aufrufen kann, um eine Kette von fünf mipmap-Ebenen zu erstellen: 256x256, 128x128, 64x64, 32x32 und 16x16.
// This code example assumes that m_d3dDevice is a
// valid pointer to a IDirect3DDevice9 interface
IDirect3DTexture9 * pMipMap;
m_pD3DDevice->CreateTexture(256, 256, 5, 0, D3DFMT_R8G8B8,
D3DPOOL_MANAGED, &pMipMap);
Die ersten beiden Parameter, die von IDirect3DDevice9::CreateTexture akzeptiert werden, sind die Größe und Breite der Textur der obersten Ebene. Der dritte Parameter gibt die Anzahl der Ebenen in der Textur an. Wenn Sie dies auf 0 (null) festlegen, erstellt Direct3D eine Kette von Oberflächen, von der jede eine Leistung von zwei kleineren als der vorherigen auf die kleinste mögliche Größe von 1x1 hat. Der vierte Parameter gibt die Verwendung für diese Ressource an. in diesem Fall wird 0 angegeben, um anzugeben, dass die Ressource nicht speziell verwendet wird. Der fünfte Parameter gibt das Oberflächenformat für die Textur an. Verwenden Sie einen Wert aus dem aufzählten D3DFORMAT-Typ für diesen Parameter. Der sechste Parameter gibt einen Member des aufzählten D3DPOOL-Typs an, der die Speicherklasse angibt, in die die erstellte Ressource gespeichert werden soll. Sofern Sie keine dynamischen Texturen verwenden, wird D3DPOOL _ MANAGED empfohlen. Der letzte Parameter akzeptiert die Adresse eines Zeigers auf eine IDirect3DTexture9-Schnittstelle.
Hinweis
Jede Oberfläche in einer Mipmapkette verfügt über Dimensionen, die die Hälfte der vorherigen Oberfläche in der Kette haben. Wenn die Mipmap der obersten Ebene dimensionen von 256 x 128 hat, sind die Dimensionen der Mipmap der zweiten Ebene 128 x 64, die dritte Ebene ist 64 x 32 und so weiter, bis zu 1x1. Sie können keine Anzahl von Mipmapebenen in Ebenen anfordern, die dazu führen würden, dass die Breite oder Höhe einer Mipmap in der Kette kleiner als 1 wäre. Im einfachen Fall einer 4x2-Mipmapoberfläche der obersten Ebene beträgt der maximal zulässige Wert für Levels 3. Die Dimensionen der obersten Ebene sind 4x2, die Dimensionen der zweiten Ebene sind 2x1 und die Dimensionen für die dritte Ebene 1x1. Ein Wert, der größer als 3 in Levels ist, führt zu einem Bruchwert in der Höhe der Mipmap der zweiten Ebene und ist daher nicht zu empfehlen.
Auswählen und Anzeigen einer Mipmap
Rufen Sie die IDirect3DDevice9::SetTexture-Methode auf, um den Mipmap-Textursatz als erste Textur in der Liste der aktuellen Texturen fest zu setzen. Weitere Informationen finden Sie unter Texturmischung (Direct3D 9).
Nachdem Ihre Anwendung den Mipmap-Textursatz ausgewählt hat, muss sie Dem D3DSAMP MIPFILTER-Samplerzustand Werte aus dem aufzählten D3DTEXTUREFILTERTYPE-Typ _ zuweisen. Direct3D führt dann automatisch Mipmap-Texturfilterung durch. Das Aktivieren der Mipmap-Texturfilterung wird im folgenden Codebeispiel gezeigt.
m_pD3DDevice->SetTexture(0, pMipMap);
m_pD3DDevice->SetSamplerState(0, D3DSAMP_MIPFILTER, D3DTEXF_POINT);
Ihre Anwendung kann auch manuell eine Kette von Mipmap-Oberflächen durchlaufen, indem sie die IDirect3DTexture9::GetSurfaceLevel-Methode verwendet und die abzurufende Mipmapebene an gibt. Im folgenden Beispiel wird eine Mipmapkette von der höchsten zur niedrigsten Auflösung durchlaufen.
IDirect3DSurface9 * pSurfaceLevel;
for (int iLevel = 0; iLevel < pMipMap->GetLevelCount(); iLevel++)
{
pMipMap->GetSurfaceLevel(iLevel, &pSurfaceLevel);
// Process this level
pSurfaceLevel->Release();
}
Anwendungen müssen manuell eine Mipmapkette durchlaufen, um Bitmapdaten in jede Oberfläche in der Kette zu laden. Dies ist in der Regel der einzige Grund, die Kette zu durchlaufen. Eine Anwendung kann die Anzahl der Ebenen in einer Mipmap abrufen, indem sie IDirect3DBaseTexture9::GetLevelCount aufruft.