Compartir a través de


Filtrado de texturas con mapas Mip (Direct3D 9)

Un mapa mip es una secuencia de texturas, cada una de las cuales es una representación de resolución progresivamente menor de la misma imagen. El alto y el ancho de cada imagen, o nivel, en el mapa mip es una potencia de dos menores que el nivel anterior. Los mapas mip no tienen que ser cuadrados.

Se usa una imagen mipmap de alta resolución para objetos que están cerca del usuario. Las imágenes de resolución inferior se usan a medida que el objeto aparece más lejos. Mipmapping mejora la calidad de las texturas representadas a costa de usar más memoria.

Direct3D representa mapas mip como una cadena de superficies adjuntas. La textura de resolución más alta está en la cabeza de la cadena y tiene el siguiente nivel del mapa mip como datos adjuntos. A su vez, ese nivel tiene datos adjuntos que son el siguiente nivel del mapa mip, etc., hasta el nivel de resolución más bajo del mapa mip.

En las ilustraciones siguientes se muestra un ejemplo de estos niveles. Las texturas de mapa de bits representan un inicio de sesión en un contenedor en un juego de primera persona 3D. Cuando se crea como un mapa mip, la textura de resolución más alta se realiza primero en el conjunto. Cada textura correcta en el conjunto de mapas mip es menor en alto y ancho por una potencia de 2. En este caso, el mapa mip de resolución máxima es de 256 píxeles por 256 píxeles. A continuación, la textura es 128x128. La última textura de la cadena es 64x64.

Este signo tiene una distancia máxima desde la que está visible. Si el usuario comienza lejos del signo, el juego muestra la textura más pequeña de la cadena mipmap, que en este caso la textura 64x64.

ilustración de una textura de 64 x 64 de un signo de peligro

A medida que el usuario mueve el punto de vista más cerca del signo, se usan texturas progresivamente de mayor resolución en la cadena mipmap. La resolución de la ilustración siguiente es 128x128.

ilustración de una textura de 128 x 128 de un signo de peligro

La textura de resolución más alta se usa cuando el punto de vista del usuario está a la distancia mínima permitida desde el signo, como se muestra en la ilustración siguiente.

ilustración de una textura de 256 x 256 de un signo de peligro

Se trata de una manera más eficaz de simular la perspectiva de las texturas. En lugar de representar una sola textura en muchas resoluciones, es más rápido usar varias texturas en diferentes resoluciones.

Direct3D puede evaluar qué textura de un conjunto de mapas mip es la resolución más cercana a la salida deseada y puede asignar píxeles a su espacio de textura. Si la resolución de la imagen final está entre las resoluciones de las texturas del conjunto de mapas mip, Direct3D puede examinar los elementos de textura en ambos mapas mip y combinar sus valores de color.

Para usar mapas mip, la aplicación debe compilar un conjunto de mapas mip. Las aplicaciones aplican mapas mip seleccionando el mapa mip establecido como la primera textura del conjunto de texturas actuales. Para obtener más información, consulte Combinación de texturas (Direct3D 9).

A continuación, la aplicación debe establecer el método de filtrado que Usa Direct3D para muestrear elementos de textura. El método más rápido de filtrado de mapas mip es hacer que Direct3D seleccione el elemento de textura más cercano. Use el D3DTEXF_POINT valor enumerado para seleccionarlo. Direct3D puede producir mejores resultados de filtrado si la aplicación usa el valor enumerado D3DTEXF_LINEAR. Esto selecciona el mapa mip más cercano y, a continuación, calcula un promedio ponderado de los elementos de textura que rodean la ubicación en la textura a la que se asigna el píxel actual.

Las texturas mipmap se usan en escenas 3D para reducir el tiempo necesario para representar una escena. También mejoran el realismo de la escena. Sin embargo, a menudo requieren grandes cantidades de memoria.

Creación de un conjunto de mapas Mip

En el ejemplo siguiente se muestra cómo la aplicación puede llamar al método IDirect3DDevice9::CreateTexture para crear una cadena de cinco niveles de mapa mip: 256x256, 128x128, 64x64, 32x32 y 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);

Los dos primeros parámetros aceptados por IDirect3DDevice9::CreateTexture son el tamaño y el ancho de la textura de nivel superior. El tercer parámetro especifica el número de niveles de la textura. Si establece esto en cero, Direct3D crea una cadena de superficies, cada una de ellas tiene una potencia de dos más pequeñas que la anterior, hasta el tamaño más pequeño posible de 1x1. El cuarto parámetro especifica el uso de este recurso; en este caso, se especifica 0 para indicar ningún uso específico para el recurso. El quinto parámetro especifica el formato de superficie para la textura. Use un valor del tipo enumerado D3DFORMAT para este parámetro. El sexto parámetro especifica un miembro del tipo enumerado D3DPOOL que indica la clase de memoria en la que colocar el recurso creado. A menos que use texturas dinámicas, se recomienda D3DPOOL_MANAGED. El parámetro final toma la dirección de un puntero a una interfaz IDirect3DTexture9 .

Nota

Cada superficie de una cadena mipmap tiene dimensiones que son una mitad de la superficie anterior de la cadena. Si el mapa mip de nivel superior tiene dimensiones de 256x128, las dimensiones del mapa mip de segundo nivel son de 128 x 64, el tercer nivel es 64x32, etc., hasta 1x1. No se puede solicitar un número de niveles mipmap en Niveles que harían que el ancho o alto de cualquier mapa mip de la cadena sea menor que 1. En el caso sencillo de una superficie mip de nivel superior de 4x2, el valor máximo permitido para Levels es tres. Las dimensiones de nivel superior son 4x2, las dimensiones de segundo nivel son 2x1 y las dimensiones del tercer nivel son 1x1. Un valor mayor que 3 en Niveles da como resultado un valor fraccionado en el alto del mapa mip de segundo nivel y, por tanto, no se permite.

 

Seleccionar y mostrar un mapa Mip

Llame al método IDirect3DDevice9::SetTexture para establecer la textura mipmap establecida como la primera textura de la lista de texturas actuales. Para obtener más información, consulte Combinación de texturas (Direct3D 9).

Después de que la aplicación seleccione el conjunto de texturas mipmap, debe asignar valores del tipo enumerado D3DTEXTUREFILTERTYPE al estado del muestreador de D3DSAMP_MIPFILTER. Direct3D realiza automáticamente el filtrado de texturas mipmap. La habilitación del filtrado de texturas mipmap se muestra en el ejemplo de código siguiente.

m_pD3DDevice->SetTexture(0, pMipMap);
m_pD3DDevice->SetSamplerState(0, D3DSAMP_MIPFILTER, D3DTEXF_POINT);

La aplicación también puede atravesar manualmente una cadena de superficies mipmap mediante el método IDirect3DTexture9::GetSurfaceLevel y especificando el nivel de mapa mip que se va a recuperar. En el ejemplo siguiente se recorre una cadena de mapas mip de mayor a menor resolución.

IDirect3DSurface9 * pSurfaceLevel;
for (int iLevel = 0; iLevel < pMipMap->GetLevelCount(); iLevel++)
{
    pMipMap->GetSurfaceLevel(iLevel, &pSurfaceLevel);
    // Process this level
    pSurfaceLevel->Release();
}

Las aplicaciones deben atravesar manualmente una cadena de mapas mip para cargar datos de mapa de bits en cada superficie de la cadena. Normalmente, esta es la única razón para atravesar la cadena. Una aplicación puede recuperar el número de niveles de un mapa mip llamando a IDirect3DBaseTexture9::GetLevelCount.

Filtrado de texturas