Freigeben über


Texturfilterung mit Mipmaps (Direct3D 9)

Eine mipmap ist eine Sequenz von Texturen, die jeweils eine schrittweise niedrigere Auflösung desselben Bilds darstellen. 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 der Verwendung von mehr Arbeitsspeicher.

Direct3D stellt mipmaps als Kette von angefügten Oberflächen dar. Die Textur mit der höchsten Auflösung befindet sich am Kopf der Kette und weist die nächste Ebene der mipmap als Anlage auf. Diese Ebene verfügt wiederum über eine Anlage, die die nächste Ebene in der mipmap ist, usw. bis zur niedrigsten Auflösungsebene der mipmap.

Die folgenden Abbildungen zeigen ein Beispiel für diese Ebenen. Die Bitmaptexturen stellen ein Zeichen in einem Container in einem 3D-First-Person-Spiel dar. Bei der Erstellung als mipmap befindet sich die Textur mit der höchsten Auflösung zuerst im Satz. Jede folgende Textur im mipmap-Satz ist in Höhe und Breite um eine Leistung von 2 kleiner. In diesem Fall beträgt die mipmap mit der maximalen Auflösung 256 Pixel x 256 Pixel. Die nächste Textur ist 128 x 128. Die letzte Textur in der Kette ist 64x64.

Dieses Zeichen hat eine maximale Entfernung, von der es sichtbar ist. Wenn der Benutzer weit vom Zeichen entfernt beginnt, zeigt das Spiel die kleinste Textur in der Mipmap-Kette an, die in diesem Fall die 64x64-Textur.

Abbildung einer 64x64-Textur eines Gefahrenzeichens

Wenn der Benutzer den Standpunkt näher an das Zeichen verschiebt, werden zunehmend höher aufgelöste Texturen in der Mipmap-Kette verwendet. Die Auflösung in der folgenden Abbildung ist 128 x 128.

Abbildung einer 128x128-Textur eines Gefahrenzeichens

Die Textur mit der höchsten Auflösung wird verwendet, wenn sich der Standpunkt des Benutzers in der minimal zulässigen Entfernung vom Zeichen befindet, wie in der folgenden Abbildung gezeigt.

Abbildung einer 256x256-Textur eines Gefahrenzeichens

Dies ist eine effizientere Möglichkeit, die Perspektive 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 beurteilen, welche Textur in einem Mipmap-Satz der gewünschten Ausgabe am nächsten ist, und pixelweise dem Texelraum zuordnen kann. 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 deren Farbwerte miteinander mischen.

Um mipmaps zu verwenden, muss Ihre Anwendung eine Reihe von mipmaps erstellen. Anwendungen wenden Mipmaps an, indem sie die mipmap-Gruppe als erste Textur im Satz der aktuellen Texturen auswählen. Weitere Informationen finden Sie unter Texture Blending (Direct3D 9).

Als Nächstes muss Ihre Anwendung die Filtermethode festlegen, die Direct3D zum Beispiel für Texels verwendet. Die schnellste Methode der Mipmap-Filterung besteht darin, direct3D den nächstgelegenen Texel auszuwählen. Verwenden Sie den D3DTEXF_POINT aufgezählten Wert, um dies auszuwählen. Direct3D kann bessere Filterergebnisse erzielen, wenn Ihre Anwendung den D3DTEXF_LINEAR aufgezählten Wert verwendet. Dadurch wird die nächstgelegene mipmap ausgewählt und dann ein gewichteter Mittelwert der Texels berechnet, die die Position in der Textur umgeben, der das aktuelle Pixel zugeordnet ist.

Mipmap-Texturen werden in 3D-Szenen verwendet, um die zum Rendern einer Szene erforderliche Zeit zu verkürzen. Sie verbessern auch den Realismus der Szene. Sie benötigen 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 diesen Wert auf 0 festlegen, erstellt Direct3D eine Kette von Oberflächen, von denen jede eine Leistung von zwei kleiner als die vorherige ist, bis auf die kleinstmögliche Größe von 1x1. Der vierte Parameter gibt die Verwendung für diese Ressource an. in diesem Fall wird 0 angegeben, um keine bestimmte Verwendung für die Ressource anzugeben. Der fünfte Parameter gibt das Oberflächenformat für die Textur an. Verwenden Sie einen Wert aus dem aufgezählten D3DFORMAT-Typ für diesen Parameter. Der sechste Parameter gibt ein Element des aufgezählten D3DPOOL-Typs an, der die Speicherklasse angibt, in der die erstellte Ressource platziert werden soll. Sofern Sie keine dynamischen Texturen verwenden, wird D3DPOOL_MANAGED empfohlen. Der letzte Parameter übernimmt die Adresse eines Zeigers auf eine IDirect3DTexture9-Schnittstelle .

Hinweis

Jede Oberfläche in einer mipmap-Kette weist Dimensionen auf, die halb so hoch sind wie die vorherige Oberfläche in der Kette. Wenn die Mipmap der obersten Ebene die Dimensionen 256x128 aufweist, sind die Dimensionen der Mipmap der zweiten Ebene 128x64, die dritte Ebene 64x32 usw. bis hin zu 1x1. Sie können keine Anzahl von mipmap-Ebenen in Ebenen anfordern, die dazu führen würden, dass entweder die Breite oder Höhe einer mipmap in der Kette kleiner als 1 ist. Im einfachen Fall einer Mipmap-Oberfläche der obersten Ebene mit 4x2 ist der maximal zulässige Wert für Ebenen drei. Die Dimensionen der obersten Ebene sind 4x2, die Dimensionen der zweiten Ebene 2x1 und die Dimensionen für die dritte Ebene sind 1x1. Ein Wert größer als 3 in Ebenen führt zu einem Bruchwert in der Höhe der Mipmap der zweiten Ebene und ist daher nicht zulässig.

 

Auswählen und Anzeigen einer Mipmap

Rufen Sie die IDirect3DDevice9::SetTexture-Methode auf, um die mipmap-Textur als erste Textur in der Liste der aktuellen Texturen festzulegen. Weitere Informationen finden Sie unter Texture Blending (Direct3D 9).

Nachdem Ihre Anwendung den mipmap-Textursatz ausgewählt hat, muss sie Werte aus dem aufgezählten D3DTEXTUREFILTERTYPE-Typ dem D3DSAMP_MIPFILTER Samplerzustand zuweisen. Direct3D führt dann automatisch die Mipmap-Texturfilterung aus. Das Aktivieren der Mipmap-Texturfilterung wird im folgenden Codebeispiel veranschaulicht.

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 Mipmap-Ebene angibt. Im folgenden Beispiel wird eine Mipmap-Kette von der höchsten bis 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 eine Mipmap-Kette manuell 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.

Texturfilterung