Computação Gráfica: Aula5:
Rendering e Rasterização
http://www.fei.edu.br/~psergio
[email protected]
Conteúdo:
Rendering
Fases do Processo de Realismo Visual
Realismo por Passadas
Acabamentos não-fotográficos
Rasterização
Algoritmo de Bresenham para traçado de linhas
Rasterização de Polígonos
Preenchimento de polígonos por scanline
Remoção de Linhas e Superfícies Escondidas
Biografia: Computação Gráfica: Teoria e Prática; Eduardo Azeredo e
Aura Conci; Editora Campus; (Volume Antigo!!!)
O que é o Rendering
A computação gráfica trata da síntese de imagens através do computador.
Sintetizar uma imagem não é mostrá-la no computador digitalmente a partir
da captura de algo existente. Isso é tratado no Processamento de Imagens.
Sintetizar uma imagem (uma cena ou um objeto) é criá-la em termos da
definição dos dados dos objetos que a compõe. Isso se faz a partir da
geometria da cena, das informações sobre os materiais de que são feitos os
objetos (suas cores e suas texturas), das condições de iluminação ambiente; e
da posição de observação da cena. Nesse processo de criação sintética, é
denominado rendering a fase de Introdução nas cenas, do realismo
fotográfico.
Basicamente, podemos descrevê-la por “realismo visual”. Podemos interpretar
o processo de rendering como o de converter dados em uma imagem realística
ou simplesmente sintetizar um objeto ou cena até ter-se deles uma aparência
de algo real e não de formas inteiramente criadas no computador.
Fases do Processo de Realismo Visual
•
•
•
•
•
•
•
Construção do modelo
Transformações lineares
Eliminação de polígonos ou faces escondidas
Clipping
Rasterização
Culling
Coloração, Textura e Iluminação
Realismo por passadas
• Pelo já comentado, deve ter ficado claro que a construção de uma cena
realística é um processo incremental. Isso ocorre tanto no nível
conceitual discutido anteriormente, quanto no nível das técnicas e
softwares disponíveis para a realização das diversas fases do processo.
Essa forma de criação de cenas realísticas é denominada de realismo
por passadas.
• Assim, a renderização por passadas é a forma utilizada pela grande
maioria dos sistemas para geração de cenas realísticas. Esse processo
permite que os atributos de uma cena sejam renderizados
separadamente da sua geração ou modelagem e, em muitos casos que,
diversas técnicas e softwares participem do processo de inclusão do
grau de realismo desejado à cena.
Realismo por passadas
• Vantagens do realismo por passadas:
a) economia de memória
b) facilidade de introdução de modificações
c) maior utilização das imagens estáticas
d) pode eliminar o anti-alizing
e) integração
f) reciclagem
g) deph of field (simulação de foco)
h) glows (incandescência)
Realismo por passadas
• Tipos de passadas:
a)
b)
c)
d)
e)
f)
Cores
Iluminação
Reflexões
Sombras
Efeitos Especiais
Profundidade
Rasterização
É o processo de conversão da representação vetorial
para a matricial. Ela permite realizar a conversão de
um desenho tridimensional qualquer em uma
representação inteira possível de ser armazenada na
memória (de vídeo ou impressão) de um dispositivo
raster.
Rasterização
Rasterização de Retas
Algoritmo de Bresenham para Traçado de Linhas
x = x1
y = y1
Dx = x2 – x1
Dy = y2 – y1
m = Dy/Dx
e = m – 1/2
for i = 1 to Dx do
desenhaPonto(x,y)
while e >= 0 do
y=y+1
e=e–1
end while
x=x+1
e=e+m
end for
Rasterização de Polígonos
Algoritmo DDA para rasterização de Poligonos
Se abs(x2 – x1) >= abs(y2 – y1) então
Tamanho = abs(x2 – x1)
else
Tamanho = abs(y2 – y1)
end if
{seleciona o maior dos valores entre Dx e Dy como unidade rasterização}
Dx = (x2 – x1) / Tamanho
Dy = (y2 – y1) / Tamanho
i=1
Enquanto i <= Tamanho faça
DesenhaPonto( x, y) {Arredonda x e y: valor arredondado de x e y}
x = x + Dx
y = y + Dy
i=i+1
Fim Enquanto
Preenchimento de Poligono por ScanLine
Exceto nas bordas, pixels adjacentes em um polígono possuem as mesmas
características. Essa propriedade é chamada coerência espacial. Assim, os
pixels de uma dada linha (scan line) variam somente nas bordas do polígono.
O processo de determinar quais pixels serão desenhados no preenchimento é
chamado conversão de varredura (scan conversion), e mostrado na Figura
7.6.B. A scan line 4, por exemplo, pode ser dividida nas regiões x < 1 (fora do
polígono), 1 <= x <= 4 (dentro do polígono), 4<x<6 (fora do polígono),
6 <= x 8 (dentro do polígono) e x > 8 (fora do polígono).
Preenchimento de Poligono por ScanLine
Peseudo-código?
Deixo como exercício pra cair na prova!
Remoção de Linhas e Superfícies Escondidas
Remoção de Linhas e Superfícies Escondidas
Remoção de Linhas e Superfícies Escondidas
É importante uma forma de identificação de linhas, arestas ou superfícies visíveis
e não visíveis, principalmente para que seja possível decidir se a mesma deverá
ser traçada ou não, visando principalmente conservar a fidelidade, resolução e
agilidade da representação. Em computação gráfica, esses conceitos são muito
importantes, principalmente porque para o computador não faz diferença se as
arestas ou superfícies são visíveis ou não.
Os diferentes algoritmos deverão realizar as seguintes tarefas:
•Ler as coordenadas tridimensionais do objeto, e armazená-las em forma de matriz.
•Localizar no espaço 3D a posição do observador, através da qual definirá os parâmetros
de visibilidade.
•Calcular o vetor normal 3D de cada face do objeto.
•Calcular o vetor da linha de visibilidade para cada face do objeto. Esse vetor é definido
pela ligação de algum ponto da face ao observador.
Remoção de Linhas e Superfícies Escondidas
•Realizar o teste de visibilidade. Isso é feito verificando a magnitude do ângulo
formado pela normal à face em consideração e a linha de visibilidade. Esse é o
ângulo identificado com a letra grega beta ß. Se o valor absoluto do ângulo ß
estiver entre 90° e 180°, a superfície estará invisível. A superfície estará visível se
esse ângulo estiver entre –90° e 90°. O teste de visibilidade é feito através do ângulo
em um dos lados de um cubo. O teste de visibilidade é o ponto central do algoritmo
de culling.
Remoção de Linhas e Superfícies Escondidas
•Definir os vértices (ou cantos) das faces do objeto e armazená-los de forma
matricial (raster).
•Verificar os vértices (ou cantos) visíveis, com seus respectivos posicionamentos.
•Traçar as arestas das faces visíveis, que revelarão o objeto como enxergado de um
determinado ponto de vista. Se desejado, é possível traçar também as linhas não-visíveis
(tracejadas ou não) naquele ponto de vista.
Hidden Surface Removal (HSR): Algoritmos de
remoção de superfícies escondidas
•Algoritmo de Visibilidade por Prioridade ou Algoritmo do Pintor;
•Algoritmo de Eliminação de Faces Ocultas pelo Cálculo da Normal;
•Algoritmo Z-Buffer.
Algoritmo de Visibilidade por Prioridade ou Algoritmo do Pintor
Usando uma linha simplificada de raciocínio como: se um objeto “A” bloqueia
a visão de um objeto “B” e ambos os objetos encontram-se na mesma linha de
visão do observador, então o objeto “B” está mais distante do observador que o
objeto “A”, é possível criar um algoritmo que calcule a distância dos objetos ao
observador, e que dê prioridade à visualização dos objetos mais próximos ao
observador.
•Calcula-se a distância ao observador de todas as faces poligonais da cena (que
chamaremos de D);
•Ordenam-se todos os polígonos pelo valor da sua distância ao observador,D;
•Resolvem-se as ambigüidades nos casos em que as distâncias ao observador
(D) de dois polígonos forem iguais (verificando se ocupam as mesmas posições
rasterizadas ou não);
•Desenham-se primeiro os polígonos que tiverem mais distantes do observador
(ou seja, os que tiverem maior valor de D).
Algoritmo de Visibilidade por Prioridade ou Algoritmo do Pintor
Eliminação de Faces Ocultas pelo Cálculo da Normal
• Ler as coordenadas do objeto no espaço tridimensional, considerando um
ponto de referência e armazená-las em forma de matriz;
• Localizar no espaço a posição do observador, através da qual serão definidos os
parâmetros de visibilidade;
• Calcular o vetor normal de cada face do objeto;
• Calcular o vetor da linha de visibilidade para cada face do objeto;
• Realizar o teste de visibilidade calculando o produto escalar entre os dois vetores:
Se n . l > 0, a face estará visível
Se n . l < 0, a face estará invisível
• Definir os cantos das faces do objeto e armazená-los em forma matricial;
• Verificar os cantos visíveis, com seus respectivos posicionamentos;
• Traçar as arestas das faces visíveis, que revelarão o objeto como observado de
um determinado ponto de vista. Se desejável, é possível traçar também as linhas
não-visíveis naquele ponto de vista.
Algoritmo Z-Buffer
O algoritmo z-buffer, desenvolvido inicialmente por Catmull [Catmull, 74], é um
dos algoritmos de determinação de visibilidade de superfícies mais simples de se
implementar, tanto em software quanto em hardware, e hoje é o mais popular dentre
os algoritmos de HSR. Porém, apresenta alto custo de memória e processamento.
Requer a alocação de até dois buffers, ou matrizes, em memória, com dimensões
idênticas à tela de apresentação, normalmente denominados buffers de Imagem e de
Profundidade.
• Criar e inicializar com a cor de fundo um array bidimensional, que conterá a
informação de cada pixel da tela;
• Inicializar o array com o valor da máxima profundidade;
• Achar a coordenada z para cada ponto do polígono;
• Testar a profundidade z de cada ponto da superfície para determinar a mais
próxima do observador;
• Atualizar o valor nos arrays se z estiver mais próximo do observador.
Algoritmo Z-Buffer
Para cada polígono P da cena
Para cada pixel (x, y) de um polígono P
computar z_depth na posição x, y
se z_depth < z_buffer (x, y) então
defina_pixel (x, y, color)
troque o valor : z_buffer (x, y) = z_depth
Download

Rendering e Rasterização