Filtrado de textura bilineal (Direct3D 9)

Las texturas siempre se direccionan linealmente desde (0,0, 0,0) en la esquina superior izquierda a (1,0, 1,0) en la esquina inferior derecha, como se muestra en la ilustración siguiente.

ilustración de textura 4x4 con bloques sólidos de color

Normalmente, las texturas se representan como si estuvieran compuestas de bloques sólidos de color, pero en realidad es más correcto pensar en texturas de la misma manera que debería pensar en la presentación ráster: cada elemento de textura se define en el centro exacto de una celda de cuadrícula, como se muestra en la ilustración siguiente.

Ilustración de textura 4x4 con elementos de textura definidos en el centro de las celdas de cuadrícula

Si le pides al muestreador de texturas el color de esta textura en coordenadas UV (0,375, 0,375) obtendrás rojo sólido (255, 0, 0). Eso tiene sentido perfecto porque el centro exacto de la celda de textura roja está en UV (0,375, 0,375). ¿Qué ocurre si pide al muestreador el color de la textura en UV (0,25, 0,25)? Eso no es tan fácil, porque el punto en uv (0,25, 0,25) se encuentra en la esquina exacta de 4 elementos de textura.

El esquema más sencillo es simplemente hacer que el muestreador devuelva el color del elemento de textura más cercano; Esto se denomina Filtrado de puntos (consulte Muestreo de punto más cercano (Direct3D 9)) y normalmente no es deseable debido a resultados específicos o bloqueados. El muestreo de puntos de nuestra textura en UV (0,25, 0,25) muestra otro problema sutil con el filtrado de punto más cercano: hay cuatro elementos de textura equidistantes desde el punto de muestreo, por lo que no hay ningún elemento de textura más cercano. Uno de esos cuatro elementos de textura se elegirá como color devuelto, pero la selección depende de cómo se redondee la coordenada, que puede introducir artefactos de desmontaje (consulte el artículo Nearest-Point Muestreo en el SDK).

Un esquema de filtrado ligeramente más preciso y más común es calcular el promedio ponderado de los 4 elementos de textura más cercanos al punto de muestreo; Esto se denomina filtrado bilineal y el costo de cálculo adicional suele ser insignificante porque esta rutina se implementa en hardware gráfico moderno. Estos son los colores que obtenemos en algunos puntos de ejemplo diferentes mediante el filtrado bilineal:

UV: (0.5, 0.5)

Este punto está en el borde exacto entre los elementos de textura rojo, verde, azul y blanco. El color que devuelve el sampler es gris:

  0.25 * (255, 0, 0)
  0.25 * (0, 255, 0) 
  0.25 * (0, 0, 255) 
## + 0.25 * (255, 255, 255) 
------------------------
= (128, 128, 128)
UV: (0.5, 0.375)

Este punto está en el punto medio del borde entre los elementos de textura rojo y verde. El color que devuelve el muestreador es amarillo-gris (tenga en cuenta que las contribuciones de los elementos de textura azul y blanco se escalan a 0):

  0.5 * (255, 0, 0)
  0.5 * (0, 255, 0) 
  0.0 * (0, 0, 255) 
## + 0.0 * (255, 255, 255) 
------------------------
= (128, 128, 0)
UV: (0.375, 0.375)

Esta es la dirección del elemento de textura rojo, que es el color devuelto (todos los demás elementos de textura del cálculo de filtrado se ponderan en 0):

  1.0 * (255, 0, 0)
  0.0 * (0, 255, 0) 
  0.0 * (0, 0, 255) 
## + 0.0 * (255, 255, 255) 
------------------------
= (255, 0, 0)

Compare estos cálculos con la ilustración siguiente, que muestra lo que sucede si el cálculo de filtrado bilineal se realiza en cada dirección de textura en la textura 4x4.

Ilustración de la textura 4x4 con filtrado bilineal realizado en cada dirección de textura

Filtrado de texturas