Cáteda CC52B Alfredo Cofré acofre@dcc.uchile.cl ANTIALIASING Cáteda CC52B Alfredo Cofré acofre@dcc.uchile.cl
¿Anti qué? Sin antialiasing…
Ah, eso…. CON antialiasing…
Aliasing es… La aparición de distorsiones y colgajos en curvas y líneas diagonales debido a resolución limitada de rendereo y display
Antialiasing es… Técnicas de eliminación de aliases Implementadas por software y/o hardware Permiten obtener bordes suaves con resoluciones limitadas
Técnica: Oversampling ¿Cómo saber si un píxel está dentro o fuera de un triángulo? Si el centro del píxel está dentro del triángulo, pintamos el píxel ALIASES!!!
Técnica: Oversampling Oversampling: Ejes X e Y se escalan en un factor entero. Se renderea el cuadro modificado Se filtra a la resolución original
Técnica: Oversampling Detalles: Cubrir píxeles enteros cada vez que sea posible Evitar cubrir fracciones de píxeles Evitar sobresamplear usando factores no enteros
Técnica: Supersampling Oversampling es un caso particular de Supersampling Idea: Reposicionar subpíxeles de modo de obtener una “resolución de borde equivalente” Ventaja: Supersampling es más eficiente y entrega bordes de mejor calidad Desventajas: Necesita hardware especializado Necesita un pipeline por subpíxel
Técnica: Multisampling Multisampling: Hacemos supersampling de una textura a la vez por píxel, pero seguimos generamos subpíxeles Idea: Sólo los bordes se generan en alta resolución Necesita sólo un pipeline por píxel
Técnica: Ponderación por área Determinamos cuál es el área del píxel que queda dentro de triángulo d Pintamos el píxel con la textura del polígono multiplicada por el área d Determinamos d usando el algoritmo de dibujo de líneas de Bresenham
Bresenham: defs. y precisiones y = f(x) = mx, 0<m<1 d = (mx - y) + (1 - m) 0 ≤ d ≤ 1 Coordenadas de Ti: (xi-1+1,yi-1+0.5) Coordenadas de Si: (xi-1+1,yi-1)
Estructura del algoritmo x = 0; y = 0; a = 1 - m; d = 0.5; WRITE_PIXEL( x , y , d ); while ( x != x_end){ if ( d < a ) d = d + m; // Nos movemos horizontalmente else{ d = d + a; // Nos movemos en diagonal y = y + 1; } x++; WRITE_PIXEL( x , y , d )
Ejemplo: Línea y = (5/7) x Desde (0,0) hasta (7,5)
Ventaja: Desventaja: Rápido y eficiente Sólo puede haber un borde por píxel No se pueden representar polígonos muy delgados
pero la mano es más rápida que el ojo….. Si se usan suficientes niveles de intensidad para representar polígonos delgados, el ojo interpola subpíxeles!!! En estos casos, es mejor usar multisampling
Aplicaciones
Intensidad de líneas Una línea horizontal se ve más intensa que una línea diagonal
Intensidad de líneas Debemos ajustar la intensidad de la línea horizontal Nos limitamos a líneas con pendiente entre 0 y 1 Multiplicamos la intensidad del píxel a pintar por 1/cos(α)
Intensidad de líneas
Suavizando caracteres Necesitamos suavizar los bordes de las fuentes M
Suavizando caracteres Recalculamos la intensidad de los píxeles, usando técnicas de antialiasing Establecemos una escala de intensidades. Por ejemplo, entre 0 y 3 El píxel está cubierto en un 0% => intensidad 0 El píxel está cubierto en un 100% => intensidad 3
Suavizando caracteres