Como o mapeamento mip funciona com texturas diferentes de 2?

12

Ouvi dizer que as GPUs recentes suportam texturas que não são de potência 2 e que todos os recursos funcionam. No entanto, não entendo como o mip-mapping funcionaria nesse cenário. Alguém pode explicar?

ap_
fonte

Respostas:

12

A regra é que, para calcular o próximo tamanho do mipmap, você divide por dois e arredonda para o número inteiro mais próximo (a menos que arredonde para 0, nesse caso, é 1). Por exemplo, uma imagem de 57 x 43 teria mipmaps como:

level 0: 57x43
level 1: 28x21
level 2: 14x10
level 3: 7x5
level 4: 3x2
level 5: 1x1

O mapeamento UV, a seleção de LOD e a filtragem funcionam da mesma maneira que para tamanhos de textura com duas potências.

Gerar mips de boa qualidade para uma textura que não seja de dois em dois é um pouco mais complicado, pois você não pode simplesmente medir uma caixa de pixels 2x2 para reduzir a amostra em todos os casos. No entanto, para começar, um filtro de caixa 2x2 não era muito bom, portanto, recomenda-se o uso de um filtro de redução de amostragem melhor, como Mitchell-Netravali, independentemente do tamanho da textura.

Nathan Reed
fonte
1
Existe desacordo entre esta resposta e a resposta de John Calsbeek? A implementação corresponde às duas descrições? Caso contrário, seria útil ter uma referência para um ou outro (ou ambos, se forem duas técnicas diferentes, ambas em uso).
Trichoplax
4

Uma maneira de pensar nisso é que as placas de vídeo geralmente implementam texturas que não são de potência 2, preenchendo-as até que tenham uma potência de 2 em cada direção. Isso faz com que a maioria das coisas "funcione": filtragem de lado a lado e de hardware, por exemplo. A única coisa que precisa mudar é a conversão de coordenadas de textura em coordenadas de imagem.

Se implementado assim, é óbvio como fazer o mipmapping: nada muda. Mesmo se você tiver uma GPU que suporte texturas sem potência de 2 sem preenchimento, os níveis do mipmap terminarão em "preenchimento". por exemplo, uma textura 3x3 teria uma textura 2x2 como lod 1.

John Calsbeek
fonte
Existe desacordo entre esta resposta e a resposta de Nathan Reed? A implementação corresponde às duas descrições? Caso contrário, seria útil ter uma referência para um ou outro (ou ambos, se forem duas técnicas diferentes, ambas em uso).
Trichoplax
1
@trichoplax Acho que a afirmação de Nathan de que "gerar mips de boa qualidade para uma textura que não seja de dois em dois é um pouco mais complicada" faz com que nossas respostas discordem pelo menos um pouco. Só isso provavelmente merece mais elaboração.
John Calsbeek 8/15
1
Acho que o problema aqui é que estamos confundindo a posição lógica dos texels com seu layout "físico" na memória. 1) Pixels são itens discretos, ou seja, você sempre precisa de uma dimensão inteira; portanto, reduzir uma dimensão ímpar significa que precisamos arredondar para cima ou para baixo. Como precisamos arredondar uma vez para obter uma textura Nx1 ou 1xN, faz sentido arredondá-lo sempre. 2) Quando dispostas em endereços físicos, não é incomum preencher a textura para um tamanho "conveniente" "passeado". Isso pode ser feito por 2 razões: a) Pode tornar o HW mais barato eb) se um pedido de P.of.2, Morton for fácil.
Simon F