Filtragem de textura com Mipmaps (Direct3D 9)
Um mipmap é uma sequência de texturas, cada uma delas é uma representação em resolução mais baixa progressivamente da mesma imagem. A altura e a largura de cada imagem, ou nível, no mipmap é uma potência de dois menores que o nível anterior. Mipmaps não precisam ser quadrados.
Uma imagem de mipmap de alta resolução é usada para objetos que estão próximos ao usuário. Imagens de resolução mais baixa são usadas para o objeto que parece mais distante. O mipmapping melhora a qualidade das texturas renderizadas às custas do uso de mais memória.
O Direct3D representa os mipmaps como uma cadeia de superfícies anexadas. A textura de resolução mais alta fica no topo da cadeia e tem o próximo nível do mipmap como um anexo. Por sua vez, esse nível possui um anexo que é o próximo nível no mipmap e assim por diante, até o nível mais baixo de resolução do mipmap.
As ilustrações a seguir mostram um exemplo desses níveis. As texturas de bitmap representam uma placa em um contêiner em um jogo 3D em primeira pessoa. Quando criada como um mipmap, a textura de resolução mais alta é primeira do conjunto. Cada textura subsequente no conjunto de mipmaps é uma potência de 2 menor em altura e largura. Nesse caso, o mipmap de resolução máxima é de 256 pixels por 256 pixels. A próxima textura é de 128x128. A última textura na cadeia é de 64x64.
Essa placa tem uma distância máxima do qual fica visível. Se o usuário começar distante da placa, o jogo exibirá a textura menor da cadeia de mipmaps, que neste caso é a textura de 64x64.
Conforme o ponto de vista do usuário se aproxima da placa, as texturas de maior resolução da cadeia de mipmaps são usadas progressivamente. A resolução na ilustração a seguir é de 128x128.
A textura de resolução mais alta é usada quando o ponto de vista do usuário é a distância mínima permitida de placa, conforme mostrado na ilustração a seguir.
Essa é uma maneira mais eficiente de simular perspectiva para texturas. Em vez de renderizar uma textura em várias resoluções, é mais rápido usar várias texturas em resoluções variadas.
O Direct3D pode avaliar qual textura de um conjunto de mipmaps tem a resolução mais próxima do resultado desejado e pode mapear pixels para seu espaço de texel. Se a resolução da imagem final é entre as resoluções de texturas no conjunto de mipmaps, o Direct3D pode examinar texels nos dois mipmaps e mesclar seus valores de cor.
Para usar mipmaps, seu aplicativo deve criar um conjunto de mipmaps. Os aplicativos aplicam mipmaps selecionando o conjunto de mipmaps como a primeira textura no conjunto de texturas atuais. Para obter mais informações, consulte Mesclagem de textura (Direct3D 9).
Em seguida, seu aplicativo deve definir o método de filtragem que o Direct3D usa para fazer a amostragem de texels. O método mais rápido de filtragem de mipmaps é fazer com que o Direct3D selecione o texel mais próximo. Use o D3DTEXF_POINT valor enumerado para selecioná-lo. O Direct3D poderá produzir melhores resultados de filtragem se o aplicativo usar o valor D3DTEXF_LINEAR enumerado. Isso seleciona o mipmap mais próximo e depois calcula uma média ponderada dos texels ao redor do local na textura para a qual o pixel atual é mapeado.
As texturas de mipmap são usadas em cenas 3D para reduzir o tempo necessário para renderizar uma cena. Eles também melhoram o realismo da cena. No entanto, eles geralmente exigem grandes quantidades de memória.
Criando um conjunto de Mipmaps
O exemplo a seguir mostra como seu aplicativo pode chamar o método IDirect3DDevice9::CreateTexture 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 por 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 que a anterior, até o menor tamanho possível de 1x1. O quarto parâmetro especifica o uso desse 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 tipo enumerado D3DPOOL que indica a classe de memória na qual colocar o recurso criado. A menos que você esteja usando texturas dinâmicas, é recomendável D3DPOOL_MANAGED. O parâmetro final leva o endereço de um ponteiro para uma interface IDirect3DTexture9 .
Observação
Cada superfície em uma cadeia de mipmap tem dimensões que são metade da superfície anterior na cadeia. Se o mipmap de nível superior tiver dimensões de 256x128, as dimensões do mipmap do segundo nível serão de 128 x64, do terceiro nível serão de 64x32 e assim por diante, até 1x1. Você não pode solicitar um número de níveis de mipmap em Níveis que possam fazer com que a largura ou altura de qualquer mipmap da cadeia seja menor que 1. No caso simples de uma superfície de mipmap de nível superior de 4x2, o valor máximo permitido para Níveis é três. As dimensões de nível superior são de 4x2, as dimensões do segundo nível são de 2x1 e as dimensões do terceiro nível são de 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 exibindo um Mipmap
Chame o método IDirect3DDevice9::SetTexture para definir a textura mipmap definida como a primeira textura na lista de texturas atuais. Para obter mais informações, consulte Mesclagem de textura (Direct3D 9).
Depois que o aplicativo selecionar o conjunto de texturas mipmap, ele deverá atribuir valores do tipo enumerado D3DTEXTUREFILTERTYPE ao estado D3DSAMP_MIPFILTER sampler. 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 percorrer manualmente uma cadeia de superfícies mipmap usando o método IDirect3DTexture9::GetSurfaceLevel e especificando o nível de mipmap a ser recuperado. O exemplo a seguir percorre uma cadeia de mipmap das resoluções mais altas para as mais baixas.
IDirect3DSurface9 * pSurfaceLevel;
for (int iLevel = 0; iLevel < pMipMap->GetLevelCount(); iLevel++)
{
pMipMap->GetSurfaceLevel(iLevel, &pSurfaceLevel);
// Process this level
pSurfaceLevel->Release();
}
Os aplicativos precisam percorrer manualmente uma cadeia de mipmap para carregar dados de bitmap em cada superfície da cadeia. Normalmente, esse é o único motivo para percorrer a cadeia. Um aplicativo pode recuperar o número de níveis em um mipmap chamando IDirect3DBaseTexture9::GetLevelCount.
Tópicos relacionados