Compartir a través de


Muestreo de punto más cercano

Las aplicaciones no son necesarias para usar el filtrado de texturas. Direct3D se puede establecer para que calcule la dirección de textura, que a menudo no se evalúa como enteros y copia el color del elemento de textura con la dirección de entero más cercana. Este proceso se denomina muestreo de punto más cercano. El muestreo de punto más cercano puede ser como si el tamaño de la textura es similar al tamaño de la imagen del primitivo en la pantalla. Si no es así, la textura debe ampliarse o reducirse. El resultado de los tamaños de textura que no coinciden con el tamaño de imagen primitivo puede ser una imagen fragmentada, con alias o borrosa.

Use el muestreo de punto más cercano cuidadosamente, ya que a veces puede provocar artefactos gráficos cuando la textura se muestrea en el límite entre dos elementos de textura. Este límite es la posición a lo largo de la textura (u o v) en la que la textura muestreada pasa de un elemento de textura a otro. Cuando se usa el muestreo de puntos, el sistema elige un elemento de textura de ejemplo u otro, y el resultado puede cambiar abruptamente de un elemento de textura a otro a medida que se cruza el límite. Este efecto puede aparecer como artefactos gráficos no deseados en la textura mostrada. Cuando se usa el filtrado lineal, el elemento de textura resultante se calcula a partir de elementos de textura adyacentes y combina suavemente entre ellos a medida que el índice de textura se mueve a través del límite.

Este efecto se puede ver cuando se asigna una textura muy pequeña a un polígono muy grande: una operación a menudo denominada ampliación. Por ejemplo, cuando se usa una textura similar a un tablero de verificación, el muestreo de punto más cercano da como resultado un tablero de verificación más grande que muestra bordes distintos. Por el contrario, el filtrado de texturas lineales da como resultado una imagen en la que los colores del tablero de verificación varían sin problemas en el polígono.

En la mayoría de los casos, las aplicaciones reciben los mejores resultados evitando el ejemplo de punto más cercano siempre que sea posible. La mayoría del hardware actual está optimizado para el filtrado lineal, por lo que la aplicación no debe sufrir un rendimiento degradado. Si el efecto que desea requiere absolutamente el uso del muestreo de punto más cercano , como cuando se usan texturas para mostrar caracteres de texto legibles, la aplicación debe tener mucho cuidado para evitar el muestreo en los límites de textura, lo que podría dar lugar a efectos no deseados. En la ilustración siguiente se muestra el aspecto de estos artefactos.

Ilustración de un cuadro de seis secciones con líneas horizontales no continuas en los dos cuadrados superior derecho

Los dos cuadrados de la esquina superior derecha del grupo aparecen diferentes a sus vecinos, con desplazamientos diagonales que se ejecutan a través de ellos. Para evitar artefactos gráficos como estos, debe estar familiarizado con las reglas de muestreo de texturas de Direct3D para el filtrado de puntos más cercano. Direct3D asigna una coordenada de textura de punto flotante que va desde [0,0, 1,0] (0,0 a 1,0, inclusive) a un valor de espacio de textura entero que va desde [ - 0,5, n - 0,5], donde n es el número de elementos de textura en una dimensión determinada en la textura. El índice de textura resultante se redondea al entero más cercano. Esta asignación puede introducir inexactitudes de muestreo en los límites de elementos de textura.

Para obtener un ejemplo sencillo, imagine una aplicación que representa polígonos con el modo de direccionamiento de textura wrap. Con la asignación empleada por Direct3D, el índice de textura u se asigna como se muestra en el diagrama siguiente para una textura con un ancho de 4 elementos de textura.

diagrama de coordenadas de textura 0.0 y 1.0 en el límite entre elementos de textura

Las coordenadas de textura, 0.0 y 1.0 para esta ilustración, están exactamente en el límite entre los elementos de textura. Con el método por el que Direct3D asigna valores, las coordenadas de textura oscilan entre [ - 0,5, 4 - 0,5], donde 4 es el ancho de la textura. En este caso, el elemento de textura muestreado es el 0 de textura para un índice de textura de 1,0. Sin embargo, si la coordenada de textura era ligeramente inferior a 1,0, el elemento de textura muestreado sería el elemento de textura n en lugar del 0 de textura.

La implicación de esto es que la ampliación de una textura pequeña mediante coordenadas de textura de exactamente 0,0 y 1,0 con filtrado de punto más cercano en un triángulo alineado en el espacio de pantalla da como resultado píxeles para los que el mapa de textura se muestrea en el límite entre los elementos de textura. Cualquier inexactitud en el cálculo de coordenadas de textura, sin embargo pequeña, da como resultado artefactos a lo largo de las áreas de la imagen representada que corresponden a los bordes de textura del mapa de textura.

Realizar esta asignación de coordenadas de textura de punto flotante a elementos de textura enteros con precisión perfecta es difícil, lento computacionalmente y, por lo general, no es necesario. La mayoría de las implementaciones de hardware usan un enfoque iterativo para calcular coordenadas de textura en cada ubicación de píxel dentro de un triángulo. Los enfoques iterativos tienden a ocultar estas imprecisiones porque los errores se acumulan uniformemente durante la iteración.

El rasterizador de referencia de Direct3D usa un enfoque de evaluación directa para calcular índices de textura en cada ubicación de píxeles. La evaluación directa difiere del enfoque iterativo en que cualquier inexactitud en la operación muestra una distribución de errores más aleatoria. El resultado de esto es que los errores de muestreo que se producen en los límites pueden ser más perceptibles porque el rasterizador de referencia no realiza esta operación con precisión perfecta.

El mejor enfoque es usar el filtrado de punto más cercano solo cuando sea necesario. Cuando se debe usar, se recomienda desplazar ligeramente las coordenadas de textura desde las posiciones de límite para evitar artefactos.

Filtrado de texturas