Partilhar via


Filtragem de textura com Mipmaps (Direct3D 9)

Um mipmap é uma sequência de texturas, cada uma das quais é uma representação de resolução progressivamente menor da mesma imagem. A altura e largura de cada imagem, ou nível, no mipmap é uma potência de dois menor do que o nível anterior. Mipmaps não precisam ser quadrados.

Uma imagem mipmap de alta resolução é usada para objetos que estão próximos ao usuário. Imagens de baixa resolução são usadas quando o objeto aparece mais longe. Mipmapping melhora a qualidade das texturas renderizadas em detrimento do uso de mais memória.

O Direct3D representa mipmaps como uma cadeia de superfícies anexadas. A textura de maior resolução está na cabeça da cadeia e tem o próximo nível do mipmap como anexo. Por outro lado, esse nível está associado ao nível seguinte do mipmap, e assim por diante, até ao nível de resolução mais baixo do mipmap.

As ilustrações a seguir mostram um exemplo desses níveis. As texturas de bitmap representam um sinal em um contêiner em um jogo em primeira pessoa 3D. Quando criado como um mipmap, a textura de maior resolução é a primeira do conjunto. Cada textura sucessiva no conjunto mipmap é menor em altura e largura por uma potência de 2. Neste caso, o mipmap de resolução máxima é de 256 pixels por 256 pixels. A próxima textura é 128x128. A última textura na cadeia é 64x64.

Este sinal tem uma distância máxima a partir da qual é visível. Se o utilizador começar longe do sinal, o jogo exibe a menor textura na cadeia mipmap, que neste caso é a textura 64x64.

ilustração de uma textura 64x64 de um sinal de perigo

À medida que o utilizador aproxima o ponto de vista do sinal, são usadas texturas progressivamente de maior resolução na cadeia mipmap. A resolução na ilustração a seguir é 128x128.

ilustração de uma textura 128x128 de um sinal de perigo

A textura de resolução mais alta é usada quando o ponto de vista do usuário está à distância mínima permitida do sinal, como mostrado na ilustração a seguir.

ilustração de uma textura 256x256 de um sinal de perigo

Esta é uma maneira mais eficiente de simular a perspetiva para texturas. Em vez de renderizar uma única textura em muitas resoluções, é mais rápido usar várias texturas em resoluções variadas.

O Direct3D pode avaliar qual textura num conjunto de mipmap é a resolução mais próxima do resultado desejado, podendo mapear pixels no seu espaço texel. Se a resolução da imagem final estiver entre as resoluções das texturas no conjunto mipmap, o Direct3D pode examinar os texels em ambos os mipmaps e misturar os seus valores de cor.

Para usar mipmaps, seu aplicativo deve construir um conjunto de mipmaps. Os aplicativos aplicam mipmaps selecionando o conjunto mipmap como a primeira textura no conjunto de texturas atuais. Para mais informações, consulte Fusão de Texturas (Direct3D 9).

Em seguida, seu aplicativo deve definir o método de filtragem que o Direct3D usa para obter amostras de texels. O método mais rápido de filtragem mipmap é fazer com que o Direct3D selecione o texel mais próximo. Utilize o valor enumerado D3DTEXF_POINT para selecionar isto. O Direct3D pode produzir melhores resultados de filtragem se a sua aplicação usar o valor enumerado D3DTEXF_LINEAR. Isso seleciona o mipmap mais próximo e, em seguida, calcula uma média ponderada dos texels ao redor do local na textura para a qual o pixel atual é mapeado.

As texturas Mipmap são usadas em cenas 3D para diminuir o tempo necessário para renderizar uma cena. Eles também melhoram o realismo da cena. No entanto, muitas vezes requerem grandes quantidades de memória.

Criando um conjunto de Mipmaps

O exemplo a seguir mostra como seu aplicativo pode chamar o IDirect3DDevice9::CreateTexture método para criar uma cadeia de cinco níveis de mipmap: 256x256, 128x128, 64x64, 32x32 e 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);

Os dois primeiros parâmetros aceitos pelo IDirect3DDevice9::CreateTexture são o tamanho e a largura da textura de nível superior. O terceiro parâmetro especifica o número de níveis na textura. Se você definir isso como zero, o Direct3D criará uma cadeia de superfícies, cada uma com uma potência de duas menores do que a anterior, até o menor tamanho possível de 1x1. O quarto parâmetro especifica o uso para este recurso; Nesse caso, 0 é especificado para indicar nenhum uso específico para o recurso. O quinto parâmetro especifica o formato de superfície para a textura. Use um valor do tipo enumerado D3DFORMAT para esse parâmetro. O sexto parâmetro especifica um membro do D3DPOOL tipo enumerado indicando a classe de memória na qual colocar o recurso criado. A menos que você esteja usando texturas dinâmicas, D3DPOOL_MANAGED é recomendado. O parâmetro final leva o endereço de um ponteiro para uma interfaceIDirect3DTexture9.

Observação

Cada superfície de uma cadeia mipmap tem dimensões que são metade da superfície anterior da cadeia. Se o mipmap de nível superior tem dimensões de 256x128, as dimensões do mipmap de segundo nível são 128x64, o terceiro nível é 64x32, e assim por diante, até 1x1. Não é possível solicitar um número de níveis de mipmap em Níveis que façam com que a largura ou altura de qualquer mipmap na cadeia seja menor que 1. No caso simples de uma superfície mipmap de nível superior 4x2, o valor máximo permitido para Níveis é três. As dimensões de nível superior são 4x2, as dimensões de segundo nível são 2x1 e as dimensões para o terceiro nível são 1x1. Um valor maior que 3 em Níveis resulta em um valor fracionário na altura do mipmap de segundo nível e, portanto, não é permitido.

 

Selecionando e mostrando um Mipmap

Chame o método IDirect3DDevice9::SetTexture para definir o conjunto de texturas mipmap como a primeira textura na lista de texturas atuais. Para obter mais informações, consulte Mistura de Textura (Direct3D 9).

Depois de o seu aplicativo selecionar o conjunto de textura mipmap, deve atribuir ao estado do amostrador D3DSAMP_MIPFILTER valores do tipo enumerado D3DTEXTUREFILTERTYPE. Em seguida, o Direct3D executa automaticamente a filtragem de textura mipmap. A habilitação da filtragem de textura mipmap é demonstrada no exemplo de código a seguir.

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

Seu aplicativo também pode atravessar manualmente uma cadeia de superfícies mipmap usando o método IDirect3DTexture9::GetSurfaceLevel e especificando o nível mipmap a ser recuperado. O exemplo a seguir percorre uma cadeia mipmap da resolução mais alta para a mais baixa.

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

As aplicações precisam percorrer manualmente uma cadeia de mipmap para carregar os dados de bitmap em cada superfície da cadeia. Esta é tipicamente a única razão para atravessar a cadeia. Um aplicativo pode recuperar o número de níveis em um mipmap chamando IDirect3DBaseTexture9::GetLevelCount.

Filtragem de textura