rasterizacao

Propaganda
Dispositivos de Visualização
e Rasterização
Alex F. V. Machado
[email protected]
Dispositivos de Visualização
• Toda imagem criada através de recursos
computacionais deve ser representada em
algum dispositivo físico que permita a sua
visualização.
• Diversas tecnologias e diferentes tipos de
dispositivos são utilizados para gerar
representações visuais.
Dispositivos de Visualização
É possível classificar os dispositivos de exibição
(traçadores, impressoras e terminais de vídeo) em
duas principais categorias, segundo a forma pela
qual as imagens são geradas:
• Dispositivos vetoriais: traçadores digitais,
osciloscópio e monitor CRT (Cathode Ray Tube).
• Dispositivos matriciais: Impressoras e
Dispositivos de Vídeo de Varredura (Raster
Scanning VDUs)
Dispositivos de Visualização
• Dispositivo gráfico vetorial (osciloscópio)
Dispositivos de Visualização
• Dispositivo gráfico matricial
(Dispositivos de Vídeo de Varredura)
Dispositivos de Visualização
• Dispositivo gráfico matricial
(Dispositivos de Vídeo de Varredura)
Rasterização
Representação Vetorial x
Matricial
• Normalmente, gráficos são
definidos através de
primitivas geométricas
como pontos, segmentos de
retas, polígonos, etc
– Representação vetorial
• Dispositivos gráficos podem
ser pensados como matrizes
de pixels (rasters)
– Representação matricial
• Rasterização é o processo de
conversão entre
representações vetorial e
matricial
Representação Vetorial x
Matricial
Obs.:
•SRU - Sistema de Referência do Universo
•SRT - Sistema de Referência da Tela
•SRC - Sistema de Referência da Câmera (3D)
Considerações Gerais
• Rasterização é um processo de amostragem
– Domínio contínuo  discreto
– Problemas de aliasing são esperados
• Cada primitiva pode gerar um grande número de
pixels
– Rapidez é essencial
• Em geral, rasterização é feita por hardware
• Técnicas de antialiasing podem ser empregadas,
usualmente extraindo um custo em termos de
desempenho
Rasterização de Segmentos de Reta
• Segmento de reta entre P1= (x1, y1) e P2= (x2, y2)
– Já foi recortado com relação ao viewport
• Objetivo é pintar os pixels atravessados pelo segmento de reta
– Na verdade, nem todos, apenas os mais próximos
• Reta de suporte dada por a x + b y + c = 0
• Queremos distinguir os casos
– Linhas ~ horizontais  computar y como função de x
– Linhas ~ verticais  computar x como função de y
Rasterização de Segmentos de Reta
(algoritmo básico)
yi = m xi + b
onde:
m = y/x
b = y1 - m x 1
Rasterização de Segmentos de Reta
(algoritmo básico)
yi = m xi + b
onde:
m = y/x
b = y1 - m x1
void Line1(int x1, int y1, int x2, int y2, int color)
{
float m = (y2-y1)/(x2-x1);
float b = y1 - m*x1;
float y;
int x;
PutPixel(x1,y1,color);
}
for (x=x1+1; x<=x2; x++)
{
y = m*x + b;
PutPixel(x,ROUND(y), color);
}
Rasterização de Segmentos de Reta
(algoritmo básico)
void Line1(int x1, int y1, int x2, int y2, int color)
{
float m = (y2-y1)/(x2-x1);
float b = y1 - m*x1;
float y;
int x;
yi = m xi + b
onde:
m = y/x
b = y1 - m x1
PutPixel(x1,y1,color);
Exemplo
(x2,y2)
}
y=mx+b
b
for (x=x1+1; x<=x2; x++)
{
y = m*x + b;
PutPixel(x,ROUND(y), color);
}
(x1,y1)
(9,4)
y=(1/3)x+1
1
(3,2)
3
(3,2)
(4,2)
2
2
3
Calcula-se m e b
(5,3)
(4,2.33)
1a
iteração
2a
4
iteração
(5,2.66)
3a
5
iteração
Como melhorar o algoritmo?
void Line2(int x1, int y1, int x2, int y2, int color)
{
float m = (y2-y1)/(x2-x1);
float b = y1 - m*x1;
float y;
int x;
PutPixel(x1,y1,color);
}
for (x=x1+1; x<=x2; x++)
{
y = m*x + b;
PutPixel(x,ROUND(y), color);
}
① multiplication
Como tirar a multiplicação?
② addition
③ round operation
Rasterização de Segmentos de Reta
(outros algoritmos)
(Algoritmo de linha incremental)
(Algoritmo de Bresenham)
Rasterização de Segmentos de Reta
(algoritmo de linha incremental)
Se
xi+1 = xi + 1
m
então
yi+1 = yi + y/x
void LineDDA(int x1, int y1, int x2, int y2, int color)
{
float y;
float m = (y2-y1)/(x2-x1);
int x;
PutPixel(x1,y1, color);
y = y1;
}
for (x=x1+1; x<=x2; x++)
{
y = y+m;
PutPixel(x,ROUND(y), color);
}
Rasterização de Segmentos de Reta
(algoritmo de linha incremental)
Se
xi+1 = xi + 1
m
então
yi+1 = yi + y/x
void LineDDA(int x1, int y1, int x2, int y2, int color)
{
float y;
float m = (y2-y1)/(x2-x1);
int x;
PutPixel(x1,y1, color);
y = y1;
}
for (x=x1+1; x<=x2; x++)
{
y = y+m;
PutPixel(x,ROUND(y), color);
}
 Ainda são necessários uma adição de floats e uma round operation.
 É possível fazer um algoritmo apenas com somas de inteiros.
O nome desse algoritmo é: Bresenham’s algorithm.
Entendendo o prolema:
Desenho de linhas
Rasterização de Segmentos de Reta
(Algoritmo de Bresenham)
Rasterização de Segmentos de Reta
(Algoritmo de Bresenham)
Rasterização de Segmentos de Reta
(Algoritmo de Bresenham)
Rasterização de Segmentos de Reta
(Algoritmo de Bresenham)
void BresLine(int x1, int y1, int x2, int y2, int cor)
x = x1; y = y1;
dy = y2-y1; dx = x2-x1;
m = dy/dx;
e = m – 0.5;
for(i=1;i<=dx;i++){
WritePixel(x, y);
IF (e > 0) {
y = y+1;
e = e – 1;
}
e = e+m;
x = x+1;
PutPixel(x,ROUND(y), color);
}
Rasterização de Segmentos de Reta
(Algoritmo de Bresenham)
Outros Octantes
Rasterização de Segmentos de Reta
(Algoritmo de Bresenham)
Vantagens:
Download