2009-05-06 19 views
14

Me preguntaba si la calidad de los mipmaps de texturas sería mejor si usara mi propio algoritmo para pregenerarlos, en lugar de uno automático incorporado. Probablemente usaría un algoritmo lento pero bonito, como el remuestreo de Lanczos.¿Tiene sentido utilizar un algoritmo propio de creación de mipmap para texturas OpenGL?

¿Tiene sentido? ¿Recibiré alguna ganancia de calidad en tarjetas gráficas modernas?

+0

Unity propone ya sea 'box' o el filtro' Kaiser' para generar la cadena de mipmap. es definitivamente una pregunta legítima. –

+0

Creo que estás mezclando dos cosas juntas. La interpolación es cuando necesita más datos de los que tiene. Los Mipmaps son para el caso, cuando necesita menos datos de los que tiene. Lanczos es el algoritmo de interpolación, no tiene nada que ver con mipmaps. –

Respuesta

2

¿Qué te motiva a probar? ¿Los mipmaps que tienes actualmente están siendo mal generados? (es decir, ¿has mirado?). Ten en cuenta que a menudo los resultados seguirán siendo (tri) linealmente interpolados de todos modos, por lo que, entre esos movimientos, a menudo hay una disminución abrupta de los retornos para mejorar el remuestreo.

+0

Bueno, el algoritmo actual no puede ser muy lento, y por lo tanto no puede ser tan bueno. El costo de pregenerar y almacenar los mipmaps es bajo, pero no sé si vale la pena si los resultados no serán tan notables. – GhassanPL

+0

No estoy seguro de cómo lo está haciendo ahora, pero en estos días puede hacer que la GPU los genere, lo que puede ser rápido y bastante bueno. Sin embargo, lo más importante es que estás mirando estos a la resolución incorrecta, o más bien, interpolando linealmente entre ellos. Por lo tanto, las versiones remuestreadas a mano bellamente diseñadas generalmente no se ven ... por lo tanto, los rendimientos decrecientes. ¿Estás viendo artefactos, o es puramente académico? – simon

+0

depende de su presupuesto de negocios. cosa de tiempo libre? financiado por inversionistas? su salario, etc. ... si toma una semana trabajar en eso, le costará a la compañía unos 1000 $ o más, ¿realmente vale la pena? –

10

Existen buenas razones para generar sus propios mipmaps. Sin embargo, la calidad de la disminución de muestreo no es una de ellas.

Los programadores de juegos y gráficos han experimentado con todo tipo de algoritmos de reducción de muestreo en el pasado. Al final resultó que el método muy simple "promedio de cuatro píxeles" da los mejores resultados. Además, los métodos más avanzados son en teoría matemáticos más correctos, y tienden a sacar mucha nitidez de los mipmaps. Esto le da un aspecto plano (Pruébalo).

Por alguna razón (para mí no comprensible), el método de promedio simple parece tener la mejor compensación entre antialiasing y mantener los mipmaps nítidos.

Sin embargo, es posible que desee calcular sus mipmaps con corrección gamma. OpenGL no hace esto por sí mismo. Esto puede hacer una diferencia visual real, especialmente para texturas más oscuras.

Hacerlo es simple. En lugar de un promedio de cuatro valores juntos de esta manera:

float average (float a, float b, float c, float d) 
{ 
    return (a+b+c+d)/4 
} 

hacer esto:

float GammaCorrectedAverage (float a, float b, float c, float d) 
{ 
    // assume a gamma of 2.0 In this case we can just square 
    // the components. 
    return sqrt ((a*a+b*b+c*c+d*d)/4) 
} 

Este código asume sus componentes de color se normalizan para estar en el rango de 0 a 1.

+12

En realidad, el "promedio de cuatro píxeles" puede no ser la mejor manera de crear mipmaps. http://www.number-none.com/product/Mipmapping,%20Part%201/index.html –

2

Depende en el tipo de activos que muestra. El filtro Lanczos se acerca más al filtro ideal de paso bajo y los resultados son notables si compara los mapas de mip uno al lado del otro. La mayoría de las personas confunden el aliasing con la nitidez (una vez más depende de si sus activos tienden a contener altas frecuencias). Definitivamente he visto casos en los que el filtro de caja no era una buena opción. Pero dado que el mapa de mip se interpola linealmente de todos modos, la ganancia puede no ser tan notable. Hay otra cosa que mencionar, la mayoría de las personas usa el filtro de caja y pasa la salida como una entrada en la próxima etapa, de esta manera se pierde tanto la precisión como la energía visual (aunque gamma ayudará a este). Si puede encontrar un código que use filtros arbitrarios (tenga en cuenta que la mayoría de ellos son separables en dos pasadas), normalmente escalará el kernel de filtro y producirá niveles de mapa de mip a partir de la textura base, lo cual es una buena idea.

+0

buena idea para mantener la textura de alta resolución como fuente de todos los mipmaps. solo para agregar una cosa: lanczos y cie sí agregan timbre con núcleos más grandes. cuidado de ser tomado aquí. –

1

Como una adición a esta pregunta, he encontrado que algunos mipmapping completamente diferentes (en lugar de aquellos simplemente tratando de lograr la mejor calidad de reducción de escala, como el algoritmo de filtrado Lanczos) tienen buenos efectos sobre ciertas texturas.

Por ejemplo, en algunas texturas que se supone que representan información de alta frecuencia, he intentado utilizar un algoritmo que simplemente toma un píxel aleatorio de las cuatro que se están considerando para cada iteración. Los resultados dependen mucho de la textura y de lo que se supone que debe transmitir, pero he descubierto que tiene un gran efecto en algunos; no menos importante para las texturas de suelo.

Otro que he probado es tomar la mayor desviación de los cuatro píxeles para preservar los contrastes. Tiene incluso menos usos, pero existen.

Como tal, he implementado la opción para elegir el algoritmo de mipmapping por textura.

EDIT: Pensé que podría proporcionar algunos ejemplos de las diferencias en la práctica. He aquí un trozo de textura de la hierba en el suelo, la imagen de la izquierda estar con mipmapping promedio estándar, y el extremo derecho de estar con mipmapping aleatorio:

Average mipmapping, trilinear filtering Random mipmapping, trilinear filtering

espero que el espectador puede apreciar la cantidad de "aparente detalle" se pierde en el mapa multipunto promediado, y cuánto más plano busca este tipo de textura.

También para referencia, aquí son las mismas muestras con 4 × filtrado anisotrópico activada (siendo lo anterior tri-lineal):

Average mipmapping, 4× anisotropic filtering Random mipmapping, 4× anisotropic filtering

filtrado anisotrópico hace la diferencia menos pronunciada, pero es aún allí.

+0

buenas ideas. el 'uno al azar' es como un' más cercano' pero trata de romper el aliasing con aleatoriedad. 'más cercano' siempre da resultados más nítidos de hecho. –

Cuestiones relacionadas