Mi pregunta es específicamente con respecto al Metal, ya que no sé si la respuesta cambiaría para otra API.
Lo que creo que entiendo hasta ahora es esto:
Una textura mipmappeada tiene "niveles de detalle" calculados previamente, donde se crean niveles más bajos de detalle reduciendo el muestreo de la textura original de alguna manera significativa.
Se hace referencia a los niveles de Mipmap en un nivel de detalle descendente, donde el nivel
0
es la textura original y los niveles superiores son reducciones de potencia de dos.La mayoría de las GPU implementan el filtrado trilineal, que selecciona dos niveles de mipmap vecinos para cada muestra, muestras de cada nivel utilizando filtrado bilineal y luego combina linealmente esas muestras.
Lo que no entiendo es cómo se seleccionan estos niveles de mipmap. En la documentación de la biblioteca estándar de Metal, veo que se pueden tomar muestras, con o sin especificar una instancia de un lod_options
tipo. Supongo que este argumento cambia la forma en que se seleccionan los niveles de mipmap, y aparentemente hay tres tipos de lod_options
texturas 2D:
bias(float value)
level(float lod)
gradient2d(float2 dPdx, float2 dPdy)
Desafortunadamente, la documentación no se molesta en explicar qué hace cualquiera de estas opciones. Puedo adivinar que bias()
sesga algún nivel de detalle elegido automáticamente, pero entonces, ¿qué significa el sesgo value
? ¿En qué escala opera? Del mismo modo, ¿cómo es el lod
de level()
traducirse en niveles discretos mipmap? Y, operando bajo el supuesto de que gradient2d()
usa el gradiente de la coordenada de textura, ¿cómo usa ese gradiente para seleccionar el nivel de mipmap?
Más importante aún, si omito el lod_options
, ¿cómo se seleccionan los niveles de mipmap? ¿Esto difiere según el tipo de función que se ejecuta?
Y, si la operación predeterminada de la sample()
función especificada sin opciones de alojamiento es hacer algo como gradient2D()
(al menos en un sombreador de fragmentos), ¿utiliza derivados simples del espacio de pantalla o funciona directamente con rasterizador y coordenadas de textura interpoladas? calcular un gradiente preciso?
Y finalmente, ¿qué tan consistente es este comportamiento de un dispositivo a otro? Un artículo antiguo (antiguo como en DirectX 9) que leí se refería a la selección compleja de mipmap específica del dispositivo, pero no sé si la selección de mipmap está mejor definida en arquitecturas más nuevas.