260 likes | 322 Views
Computação Gráfica: Aula5: Rendering e Rasterização. http://www.fei.edu.br/~psergio psergio@fei.edu.br. 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
E N D
Computação Gráfica: Aula5: Rendering e Rasterização http://www.fei.edu.br/~psergio psergio@fei.edu.br
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 • Vantagens do realismoporpassadas: • economia de memória • facilidade de introdução de modificações • maiorutilização das imagensestáticas • podeeliminar o anti-alizing • integração • reciclagem • dephof field (simulação de foco) • glows (incandescência)
Realismo por passadas • Tipos de passadas: • Cores • Iluminação • Reflexões • Sombras • EfeitosEspeciais • Profundidade
Rasterização Processo de conversão da representação vetorial para a matricial.
Rasterização de RetasAlgoritmo 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 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).
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
Remoção de Linhas e Superfícies Escondidas • 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