¿Cómo funciona el mapeo mip con texturas sin potencia de 2?


12

He oído que las GPU recientes admiten texturas sin potencia de 2 y todas las funciones simplemente funcionan. Sin embargo, no entiendo cómo funcionaría el mapeo mip en tal escenario. Alguien puede explicar?

Respuestas:


13

La regla es que para calcular el siguiente tamaño de mipmap, se divide por dos y se redondea hacia abajo al entero más cercano (a menos que se redondea a 0, en cuyo caso, es 1 en su lugar). Por ejemplo, una imagen de 57x43 tendría mapas MIP como:

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

El mapeo UV, la selección de LOD y el filtrado funcionan de la misma manera que para los tamaños de textura de potencia de dos.

Generar mips de buena calidad para una textura sin potencia de dos es un poco más complicado, ya que no puede simplemente promediar una caja de píxeles de 2x2 para reducir la muestra en todos los casos. Sin embargo, un filtro de caja de 2x2 no era tan bueno para empezar, por lo que se recomienda usar un mejor filtro de disminución de resolución como Mitchell-Netravali, independientemente del tamaño de la textura.


1
¿Hay desacuerdo entre esta respuesta y la respuesta de John Calsbeek? ¿La implementación coincide con ambas descripciones? De lo contrario, sería útil tener una referencia para uno u otro (o ambos si son dos técnicas diferentes ambas en uso).
trichoplax

4

Una forma de pensar en esto es que las tarjetas gráficas a menudo implementan texturas sin potencia de 2 simplemente rellenándolas hasta que tengan una potencia de 2 en cada dirección. Esto hace que la mayoría de las cosas "simplemente funcionen": mosaico y filtrado de hardware, por ejemplo. Lo único que necesita cambiar es la conversión de coordenadas de textura a coordenadas de imagen.

Si se implementa así, es obvio cómo hacer mipmapping: nada cambia. Incluso si tiene una GPU que admite texturas sin potencia de 2 sin relleno, los niveles de mipmap terminarían con "relleno". Por ejemplo, una textura 3x3 tendría una textura 2x2 como lod 1.


¿Hay desacuerdo entre esta respuesta y la respuesta de Nathan Reed? ¿La implementación coincide con ambas descripciones? De lo contrario, sería útil tener una referencia para uno u otro (o ambos si son dos técnicas diferentes ambas en uso).
trichoplax

1
@trichoplax Creo que la afirmación de Nathan de que "generar mips de buena calidad para una textura sin potencia de dos es un poco más complicado" hace que nuestras respuestas estén en desacuerdo al menos ligeramente. Eso solo probablemente merece más elaboración.
John Calsbeek

1
Creo que el problema aquí es que estamos confundiendo la posición lógica de los texels con su diseño "físico" en la memoria. 1) Los píxeles son elementos discretos, es decir, siempre necesita una dimensión entera, por lo que reducir una dimensión impar significa que debemos redondear hacia arriba o hacia abajo. Como tenemos que redondear una vez que llegamos a una textura Nx1 o 1xN, tiene sentido redondear siempre. 2) Cuando se presenta en direcciones físicas, no es raro rellenar la textura a un tamaño de "zancada" "conveniente". Esto se puede hacer por 2 razones: a) Puede hacer que HW sea más barato & b) si un pedido de P. 2, Morton es fácil.
Simon F
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.