Atividade 1 - Rasterização

UFPB/PPGI

Trabalho Individual I da disciplina Computação Gráfica da Universidade Federal da Paraíba - Período 2014.1, ministrada pelo Prof. Christian Azambuja Pagot.
Publicado em 
Rasterização
Este post é dedicado ao primeiro Trabalho da Disciplina do UFPB/ PPGI Computação Gráfica, 2014.1:
O que é Rasterização?
Já sabe-se que as informações de cada pixel na tela estão armazenadas na memória e quanto de espaço elas ocupam, mas resta saber como, exatamente, tais informações estão dispostas na memória, como o monitor interpreta tais informações e como desenhar os pixels na tela. Ao processo de desenhar pixels na tela dá-se o nome de Rasterização. Uma definição mais formal seria algo como uma “aproximação de primitivas matemáticas, descrita em termos de vértices em um plano Cartesiano, por conjuntos de pixels de intensidade apropriada de cinza ou de cor (Foley et. al, 1990). Rasterização é um processo de amostragem. Cada primitiva pode gerar um grande número de pixels.
O que pode ser tirado dessa definição? Pode-se entender um Display de Pontos como sendo uma tabela de w colunas por h linhas. Ou seja, a quantidade de pixel na tela se dá pela pela multiplicação da largura (w) pela altura (h) de uma tela. Já a memória de vídeo segue um modelo parecido como o armazenamento de dados em um array. Para ilustrar o que estou querendo dizer, pense que você tem uma tela de dimensão 800×600 pixels. Isso quer dizer que cada linha tem 800 pixels de largura. Da posição 0 à 799 corresponderá à primeira linha da tela, mas a posição 800 da memória corresponderá ao primeiro pixel da segunda linha da tela. Então um dos primeiros problemas a serem resolvidos quando se deseja escrever um pixel na tela é justamente “como traduzir essas informações para que o pixel apareça na posição correta”. Também foi visto que, para cada pixel temos 4 informações de cor (RGBA), ou seja, precisa-se de 4 posições nesse “array” que representa o Color Buffer para armazenar tais dados de um pixel (Heran;Baker, 1997).
Inicialmente foram definidas as seguintes estruturas para representar as primitivas: ponto , Linha, triangulo e Cor, sendo que esta ultima representa a cor de um ponto de acordo com o sistema de cores RGB. O seguinte trecho de código exibe as propriedades que compõe cada estrutura definida:

Esses tipos estruturados serão utilizados como parâmetros para as funções listadas abaixo:
void PutPixel( int x, int y, Cor cor ); 
void DrawLine( int x1, int y1, int x2, int y2, Cor cor1, Cor cor2 ) ; 
void DrawTriangle( int x1, int y1, int x2, int y2, int x3, int y3, Cor cor1, Cor cor2, Cor cor3 ) ;
Função putPixel
A função putPixel implementa a funcionalidade de escrever um pixel na memoria de vídeo a partir de um ponto que representa a posição do pixel na tela e sua cor (rgba). No arquivo definitions.h temos a definição da variável Fbptr, que consistem em um ponteiro para o inicio da memoria de vídeo. Cada pixel que pode ser representado na tela é armazenado na memoria de vídeo utilizando 4 bytes, onde cada byte guarda o valor de um componente rgba. A memoria de vídeo é vista como um vetor linear de tamanho igual a 4 vezes a largura da tela pela altura da mesma, logo a função putPixel acesa uma componente rgba de um pixel da seguinte maneira:







A função putPixel valida as posições afim de evitar que sejam acessados posições invalidas na memoria.

Pintando um pixel de posição (0,0) de vermelho.








Função drawLine
 A função drawLine desenha uma linha na tela, recebendo como parâmetros a posição inicial, a posição final e a cor que reta deverá assumir na tela. O algoritmo implementado nessa função baseia-se na formula de Bresenham vista em aula. Foi utilizado a função putPixel para desenhar a reta na tela.
A formula de Bresenham utiliza uma variável de decisão D que dado um ponto (xc,yc) escolhe entre dois outros pontos possíveis, qual deles será utilizado para desenhar uma reta. O ponto escolhido depende do sinal de D. A função drawLine generaliza o algoritmo de Bresenham visto em aula para que o mesmo desenhe retas com diferentes inclinações, assim como retas verticais e horizontais segundo os octantes e conforme comentario do codigo abaixo.
 











drawTriangle
A função drawTriangle desenha uma triângulo na tela, recebendo como parâmetros uma estrutura do tipo triângulo contendo três pontos e a cor que o triângulo deverá assumir na tela. O código abaixo mostra como a função drawTriangle foi implementada.

Como pode ser observado no trecho de código, a função drawTriangle chama a função drawLine para desenhar os segmentos de reta que formam o triângulo. Foram usados vários pontos diferentes para testar o algoritmo, que é capaz de formar diferentes triângulos, desde que os pontos não sejam colineares ( todos os pontos tenham a mesma coordenada x ou y). O resultado segue abaixo na figura.
















O código fonte do trabalho encontrasse no endereço: https://www.dropbox.com/s/nclori7put6y1oe/MyProject-Ex1.3.zip
Referências  
Hearn, D.; Baker, M.P. Computer Graphics: C Version. Second edition. Prentice Hall, 1997.
Foley, J. D., et al. Computer Graphics: Principles and Practice. New York: Addison Wesley, 1990.
Azevedo, E.; Conci, A. Computação Gráfica: Teoria e prática. Editora Campus, 2003.
http://www.visual.pro.br/cg1/pdf/rasterizacao.pdf

Comentários