Visibilidade em Computação Gráfica


Sumário



Breve Evolução Histórica

Desde o surgimento da computação gráfica, o problema de visibilidade é um fator crucial na síntese de imagens. A visibilidade é um fenômeno que está diretamente ligado a interação das fontes de luz da cena com o meio ambiente que se deseja visualizar.

Os primeiros algoritmos que surgiram com esta finalidade, em meados dos anos 60, procuraram determinar as linhas e superfícies que seriam visíveis em uma cena 2D e 3D. Este problema foi categorizado como determinação de linhas ou superfícies visíveis (visible line/ visible surface) ou remoção de linhas ou superfícies escondidas (hidden line/ suface removal).

Em 1974, Sutherland et al. apresentou como os algoritmos de visibilidade poderiam tomar vantagens do conceito chamado de coerência (Foley 1996), a qual entende-se como sendo o grau de similaridade entre uma parte de um ambiente e sua projeção, aumentando, assim, a eficiência destas técnicas.

Até este período, grande parte dos algoritmos haviam sido desenvolvidos para dispositivos vetorias. Entretanto, nesta mesma época, houve um crescimento na disponibilidade de dispositivos raster, fazendo com que estes fossem substituidos pelo algoritmo de Z-Buffer (Catmull, A subdivision algorithm for computer display of curved surfaces. 1974).

A partir de então, o algoritmo Z-Buffer passou a ser a principal forma para determinar a visibilidade em computação gráfica, devido a facilidade de incorporação deste com outras técnicas de visibilidade como Binary Space-Partitioning Tree (BSP) e Scanline.

Atualmente, além do Z-Buffer, algorimos que determinam a visibilidade de um objeto a partir de um raio, Ray-tracing, também estão sendo utilizados. O primeiro trabalho nesta área, desenvolvido por Appel em 1968, utilizava raios imaginários que saem da câmera sintética para os objetos da cena 3D para determinar as superficies visíveis na mesma (Foley 1996).

Assim, os algoritmos de determinação de superfícies visíveis podem ser classificados, de acordo com suas abordagens do problema, em duas classes distintas, como pode ser visto a seguir.

Classificação dos algoritmos de visibilidade

De acordo com Foley (Foley 1996), os algoritmos de visibilidade podem ser classificados em dois grandes grupos: visibilidade orientada a imagem ou precisão de imagem e visibilidade orientada ao objeto ou precisão do objeto.

No primeiro caso, quer-se determinar quais os n objetos são visiveis em cada pixel da imagem final. O Custo computacional para este caso é de np, sendo n o número de objetos na cena e p o numero de pixels da imagem, pois, para cada pixel, deve-se verificar qual entre todos os objetos está mais próximo do observador ao longo do raio projector. Exemplo da utilização desta abordagem são os algoritmo Z-Buffer e o Ray-tracing. O pseudocódigo para esta abordagem pode ser visto a seguir.

Enquanto que no segundo caso, é feita uma comparação entre cada objeto da cena, eliminando todo ou parte do mesmo que não esteja visível. Neste caso, tem-se um custo computacional de n2. Um exemplo desta abordagem é o algoritmo do Pintor. A seguir, pode-se ver o pseudo-código desta abordagem.