Relleno de primitivas 2D Antialiasing

Anuncio
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
Descargar