muestreo de Nearest-Point (Direct3D 9)
Las aplicaciones no son necesarias para usar el filtrado de texturas. Direct3D se puede establecer para que calcule la dirección de elemento 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. Esto puede ser una manera rápida y eficaz de procesar texturas si el tamaño de la textura es similar al tamaño de la imagen primitiva en la pantalla. Si no es así, la textura debe ampliarse o reducirse. El resultado puede ser una imagen fragmentada, con alias o borrosa.
La aplicación de C++ puede seleccionar el muestreo de punto más cercano llamando al método IDirect3DDevice9::SetSamplerState . Establezca el valor del primer parámetro en el número de índice entero (0-7) de la textura para la que se selecciona un método de filtrado de texturas. Pase D3DSAMP_MAGFILTER, D3DSAMP_MINFILTER o D3DSAMP_MIPFILTER para el segundo parámetro para establecer el filtro de ampliación, minificación o mipmapping. Pase D3DTEXF_POINT en el tercer parámetro.
Debe usar el muestreo de punto más cercano cuidadosamente, ya que a veces puede causar 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 el elemento de textura muestreado 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 repentinamente 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 al asignar 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 de hardware actualmente 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 del elemento de textura, lo que podría dar lugar a efectos no deseados. En la ilustración siguiente se muestra el aspecto que pueden tener estos artefactos.
Observe que los dos cuadrados de la esquina superior derecha del grupo aparecen diferentes de 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] (de 0,0 a 1,0, ambos incluidos) 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 de la textura. El índice de textura resultante se redondea al entero más cercano. Esta asignación puede introducir imprecisiones 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 D3DTADDRESS_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.
Observe que 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 van desde [ - 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 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 elemento de textura 0.
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 texturas.
Realizar esta asignación de coordenadas de textura de punto flotante a elementos de textura de 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 las 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 presenta 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 notables 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.
Temas relacionados