Relleno de primitivas 2D Antialiasing Héctor Navarro Relleno de círculos • Hacer líneas horizontales entre cada par de puntos • Dibujar primero el relleno y luego el borde Relleno de círculos • Hacer líneas horizontales entre cada par de puntos • Dibujar primero el relleno y luego el borde Relleno de círculos • • • • Unir (x,y) con (-x,y) Unir (x,-y) con (-x,-y) Unir (y,x) con (-y,x) Unir (y,-x) con (-y,-x) Relleno de círculos • Hacer líneas horizontales entre cada par de puntos • Dibujar primero el relleno y luego el borde Relleno de círculos • Hacer líneas horizontales entre cada par de puntos • Dibujar primero el relleno y luego el borde Relleno de círculos • Hacer líneas horizontales entre cada par de puntos • Dibujar primero el relleno y luego el borde Relleno de círculos • Hacer líneas horizontales entre cada par de puntos • Dibujar primero el relleno y luego el borde Relleno de círculos • Hacer líneas horizontales entre cada par de puntos • Dibujar primero el relleno y luego el borde Se dibuja varias veces Relleno de círculos • Hacer líneas horizontales entre cada par de puntos • Dibujar primero el relleno y luego el borde Se dibuja varias veces Relleno de círculos • Hacer líneas horizontales entre cada par de puntos • Dibujar primero el relleno y luego el borde Los puntos están duplicados Relleno de círculos • Hacer líneas horizontales entre cada par de puntos • Dibujar primero el relleno y luego el borde Los puntos están duplicados Relleno de círculos • Para no dibujar varias veces cada línea, lo recomendable es precalcular todos los pares de puntos. • Ordenarlos por la coordenada Y • Usar únicamente el que tenga la mayor coordenada X Relleno de círculos (0,6) (0,-6) (6,0) (6,0) (1,6) (1,-6) (6,1) (6,-1) (2,5) (2,-5) (5,2) (5,-2) (3,5) (3,-5) (5,3) (5,-3) (4,4) (4,-4) (4,4) (4,-4) (0,6) (1,6) (2,5) (3,5) (4,4) (4,4) (5,3) (5,2) (6,1) (6,0) (6,0) (6,-1) (5,-2) (5,-3) (4,-4) (4,-4) (2,-5) (3,-5) (0,-6) (1,-6) (0,6) (1,6) (2,5) (3,5) (4,4) (4,4) (5,3) (5,2) (6,1) (6,0) (6,0) (6,-1) (5,-2) (5,-3) (4,-4) (4,-4) (2,-5) (3,-5) (0,-6) (1,-6) Al final debe quedar un solo punto por cada coordenada Y Relleno de círculos • Finalmente dibujar el borde normalmente Relleno de Triángulos Relleno de Triángulos • Generar todos los puntos de las tres líneas • Ordenarlos por alguna coordenada (Y) • Quedarse finalmente con el primero y último de cada posición en Y Relleno de Triángulos Relleno de Triángulos Relleno de Triángulos Antialiasing Antialiasing Antialiasing Antialiasing Antialiasing • La intensidad de color de cada píxel es proporcional al área de ese píxel ocupada por la primitiva (muestreo no pesado) • La intensidad de color de cada píxel es proporcional a la distancia entre la primitiva y el centro del píxel (muestreo pesado) Antialiasing • En muestreo no pesado dos áreas iguales en distintas posiciones del píxel afectan igual a su intensidad Antialiasing • En muestreo pesado dos áreas iguales en distintas posiciones del píxel afectan de forma distinta a su intensidad Antialiasing • Para hacer muestreo pesado, representaremos los píxels como círculos • Existe una función W(x,y) cuya altura sobre el plano XY indica el peso que tiene el punto x,y. Antialiasing • Para hacer muestreo pesado, representaremos los píxels como círculos • Existe una función W(x,y) que indica el peso que tiene el punto x,y. Antialiasing • La intensidad de cada píxel vendrá dada por la integral de la función W sobre el área cubierta • La función W debe ser simétrica ante la rotación y debe decrecer con la distancia • W debe estar normalizada entre 0 y 1 • Existen diversos algoritmos que usan varios tipos de funciones W Algoritmo de Wu • Consideremos (x, T(f(x))) f(x) = y = mx + b (x, f(x)) T(x) es la función techo P(x) es la función piso (x, P(f(x))) Si queremos dibujar una línea con intensidad I0 el píxel en la posición x tendrá intensidades I(x,P(f(x))) = I0*(T(f(x))-f(x)) I(x,T(f(x))) = I0*(f(x)-P(f(x))) Algoritmo de Wu • Consideremos (x, T(f(x))) Podemos trasladar la recta al origen: f(x) = y = mx (x, f(x)) T(x) es la función techo P(x) es la función piso (x, P(f(x))) Si queremos dibujar una línea con intensidad I0 el píxel en la posición x tendrá intensidades I(x,P(f(x))) = I0*(T(f(x))-f(x)) I(x,T(f(x))) = I0*(f(x)-P(f(x))) Algoritmo de Wu I(x,T(f(x)))) = I0*(mx-P(mx)) = I0 mx – I0 * P(mx) I(x, P(f(x))) = I0*(T(mx)-mx) = I0 * T(mx) – I0 mx = I0 * T(mx) – I(x,T(f(x))) – I0 * P(mx) = I0 – I(x, T(f(x))) Necesitamos determinar para cualquier x dado, las posiciones (x,P(x)), (x,T(x)). Si x es entero estos coinciden Algoritmo incremental, basado en palabras de n bits Algoritmo de Wu • Se utilizan líneas que tienen dos píxeles de grosor Algoritmo de Wu I(x0,y0)=I(x1,y1)=I; D=0; d = floor(m*2^n+0.5); for(;x0<x1;x0++,x1--) { D+=d; if(overflow(D)) { y0++; y1--; } I(x0,y0) = I(x1,y1) = D >>(n-c); I(x0,y0+1)= I(x1,y1-1)=(1<<c)-1-I(x0, y0); } // c es el número de bits por canal de color