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?
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.
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.
fonte