OpenGL. Uma Abordagem Prática e Objetiva. Marcelo Cohen Isabel Harb Manssour. Novatec Editora - PDF
Download "OpenGL. Uma Abordagem Prática e Objetiva. Marcelo Cohen Isabel Harb Manssour. Novatec Editora"
Esther Pinhal Estrela
1 OpenGL Uma Abordagem Prática e Objetiva Marcelo Cohen Isabel Harb Manssour Novatec Editora
2 Capítulo 1 Introdução A Computação Gráfica é uma área da Ciência da Computação que se dedica ao estudo e ao desenvolvimento de técnicas e algoritmos para a geração, manipulação e análise de imagens pelo computador. Atualmente, a Computação Gráfica está presente em quase todas as áreas do conhecimento humano, desde o projeto de um novo modelo de automóvel até o desenvolvimento de ferramentas de entretenimento, entre as quais estão os jogos eletrônicos. Analisando-se o histórico da Computação Gráfica é possível afirmar que a sua evolução, bem como o surgimento de novas áreas de aplicação, decorreram da evolução do próprio hardware. O trabalho com imagens foi viabilizado somente após a criação de dispositivos periféricos gráficos de entrada e saída. Antes, toda informação era representada por meio de caracteres alfanuméricos. Além disso, devido aos numerosos cálculos matemáticos, as aplicações gráficas em geral demandam uma grande quantidade de computação. Portanto, foi a melhora dos equipamentos em termos de memória e velocidade que tornou possível o desenvolvimento e a execução de técnicas mais elaboradas de Computação Gráfica para a geração de imagens com alto grau de realismo. Atualmente, além da disponibilidade de utilização de dispositivos para interação em três dimensões, está se popularizando a utilização de placas aceleradoras gráficas. Como elas possuem uma grande quantidade de memória e capacidade de computação além de implementação em hardware de conhecidos algoritmos de Computação Gráfica, o microprocessador do computador pessoal fica liberado da maior parte do processamento gráfico. O surgimento dessas placas possibilitando a geração de imagens e a interação com os programas em tempo real acrescida do tratamento de dados espaciais representaram um importante ponto de partida para o desenvolvimento de diversas outras aplicações. 17
3 18 OpenGL Uma Abordagem Prática e Objetiva Para aproveitar toda a capacidade do hardware disponível e facilitar o desenvolvimento de aplicações gráficas, novos programas são constantemente desenvolvidos. Para os programadores, o mais usual é utilizar uma biblioteca ou um pacote gráfico, que consiste em um conjunto de rotinas gráficas básicas. Assim, é possível elaborar rapidamente programas sem a necessidade de se preocupar com detalhes particulares dos dispositivos ou com a implementação de algoritmos básicos, como, por exemplo, o desenho de um segmento de reta. OpenGL (Open Graphics Library), definida também como uma interface para hardware gráfico, é uma biblioteca de rotinas gráficas e de modelagem, bidimensional (2D) e tridimensional (3D), extremamente portável e rápida. Ela permite desenvolver aplicações interativas e gerar imagens de cenas 3D com um alto grau de realismo. Entretanto, a sua maior vantagem é a velocidade, uma vez que incorpora vários algoritmos otimizados, incluindo o desenho de primitivas gráficas, o mapeamento de textura e outros efeitos especiais. A especificação OpenGL é gerenciada por um consórcio independente formado em 1992, o ARB (Architecture Review Board). O grupo, constituído por muitas empresas líderes da área, entre as quais estão a 3Dlabs, Apple Computer, NVIDIA, SGI e SUN, é responsável pela aprovação de novas funcionalidades, versões e extensões de OpenGL. As freqüentes revisões da especificação OpenGL permitem a sua constante evolução e aproveitamento da capacidade do hardware gráfico. Atualmente, a versão 2.0 da especificação está disponível para download em Em resumo, OpenGL é uma poderosa e sofisticada API (Application Programming Interface) para criação de programas gráficos 2D e 3D para diversas plataformas, de potentes estações de trabalho a simples computadores pessoais. Seu funcionamento é semelhante ao de uma biblioteca da linguagem de programação C. Portanto, quando se diz que um programa é baseado em OpenGL ou é uma aplicação OpenGL, significa que foi escrito em alguma linguagem de programação e utiliza uma ou mais bibliotecas OpenGL. As aplicações OpenGL variam de ferramentas CAD a poderosos programas de modelagem. Um exemplo é a sua utilização para criar personagens de animações. Além do desenho de primitivas gráficas, tais como linhas e polígonos, a OpenGL possui funções que permitem adotar técnicas de iluminação, colorização, mapeamento de textura, transparência, a já mencionada animação, entre vários outros efeitos especiais. Atualmente, a OpenGL é reconhecida e aceita como um padrão de API para o desenvolvimento de aplicações gráficas 3D interativas e que geram imagens em tempo real.
4 Capítulo 1 Introdução 19 Quando a OpenGL é utilizada, em vez de descrever detalhadamente uma cena 2D ou 3D, basta especificar o conjunto de passos que devem ser seguidos para se obter o aspecto ou o efeito desejado. Esses passos envolvem chamadas a rotinas desta API que inclui em torno de 250 funções: 200 da própria biblioteca OpenGL e 50 da biblioteca GLU (OpenGL Utility Library), que faz parte da implementação OpenGL. Por ser portável, a OpenGL não possui funções para gerenciamento de janelas, tratamento de eventos ou manipulação de arquivos. Neste caso, são utilizadas as funções específicas de cada plataforma para tal propósito, como, por exemplo, a própria API do ambiente Microsoft Windows. Tampouco existe um formato de arquivo OpenGL para descrição dos modelos e ambientes virtuais. OpenGL oferece apenas um pequeno conjunto de primitivas gráficas, como pontos, linhas e polígonos, para exibição de modelos. Já a biblioteca GLU fornece algumas funções para modelagem. Superfícies quádricas, assim como curvas e superfícies NURBS (Non Uniform Rational B-Splines) são algumas delas [Schreiner, 2004; Wright, 2000]. A palavra pipeline é usada para descrever um processo composto de duas ou mais etapas para a geração de uma imagem. A Figura 1.1, adaptada de [Schreiner, 2004] e [Wright, 2000], mostra uma versão simplificada do pipeline OpenGL. Como uma aplicação faz chamadas a várias funções da API OpenGL, os comandos são armazenados em uma memória específica (buffer de comandos). Depois de ser preenchida com comandos de desenho de primitivas, iluminação e dados de textura, entre outros, ela é esvaziada, ou seja, os comandos e dados são passados para o próximo estágio do pipeline [Wright, 2000]. Chamadas a funções da API OpenGL Armazenamento em memória dos comandos OpenGL Processamento de dados geométricos e imagens Frame Buffer Operações de fragmento Rasterization Figura 1.1 Versão simplificada do pipeline OpenGL. Dados geométricos (por exemplo, vértices) são processados de forma diferente de dados de imagens, tais como pixels. Entretanto, após algumas etapas específicas, ambos passam pelo estágio de rasterization do pipeline, que consiste na conversão para fragmentos. Um fragmento em OpenGL nada mais é do que uma posição na tela, que, além da cor, possui outras informações associadas, tais como profundidade e coordenadas de textura. Cada fragmento contribui para a atualização dos pixels do frame buffer, que corresponde à memória do dispositivo gráfico. Depois disso, várias operações entre as quais oclusão e transparência podem ser executadas, antes da exibição da imagem final no monitor [Schreiner, 2004; Wright, 2000].
5 20 OpenGL Uma Abordagem Prática e Objetiva Este capítulo contém apenas uma introdução à biblioteca gráfica OpenGL. Uma descrição de como utilizá-la pode ser encontrada no Capítulo 2. Todos os exemplos apresentados e os arquivos necessários para trabalhar com OpenGL estão disponíveis no site da Novatec, no seguinte endereço O conteúdo dos demais capítulos é apresentado a seguir: Capítulo 2: descreve como instalar e utilizar as bibliotecas OpenGL; Capítulo 3: apresenta um primeiro programa em OpenGL, a fim de dar uma visão geral ao leitor; Capítulo 4: oferece uma descrição da convenção de nomes adotada para as funções e os tipos de dados; Capítulo 5: descreve a GLUT, biblioteca responsável pelo gerenciamento de janelas e tratamento de eventos, independentemente de plataforma; Capítulo 6: aborda o funcionamento de OpenGL como uma máquina de estados; Capítulo 7: contém conceitos de Computação Gráfica associados a comandos OpenGL para especificação do espaço de trabalho a leitura desse capítulo é fundamental para o entendimento dos exemplos do livro; Capítulo 8: ensina a fazer desenhos 2D utilizando primitivas gráficas, que consistem nos elementos básicos que compõem um desenho: pontos, segmentos de reta e quadriláteros, entre outros; Capítulo 9: descreve como aplicar transformações de escala, rotação e translação sobre as primitivas gráficas, a fim de alterar seu tamanho, orientação e posição, respectivamente; Capítulo 10: mostra como trabalhar com animação em OpenGL; Capítulo 11: ilustra como implementar as operações de zoom (para visualizar um objeto ou conjunto de objetos mais próximo ou mais afastado) e pan (para deslocar a janela de visualização no universo virtual), utilizando tanto o teclado quanto o mouse; Capítulo 12: descreve como trabalhar com imagens em OpenGL; Capítulo 13: explica como fazer desenhos 3D; Capítulo 14: aborda a questão da iluminação em cenas 3D, fundamental para que os objetos tenham a aparência tridimensional;
6 Capítulo 1 Introdução 21 Capítulo 15: mostra como empregar recursos baseados na operação de mistura de cores (blending), em especial transparência e efeitos atmosféricos; Capítulo 16: ensina como utilizar o mapeamento de textura em OpenGL; Capítulo 17: sugere algumas técnicas para otimizar o processo de rendering, tais como display lists e vertex arrays; Capítulo 18: ilustra a utilização dos vários buffers disponíveis em OpenGL, necessários para implementar, por exemplo, sombra e motion blur [Foley, 1990]; Capítulo 19: apresenta uma introdução ao procedimento de selecionar objetos em uma imagem 3D com o uso do mouse; Capítulo 20: mostra a utilização de OpenGL com outras linguagens de programação: C++, Java e Python; Capítulo 21: introduz a programação de shaders, por meio da OpenGL Shading Language; Apêndices: contêm as referências bibliográficas, uma lista de links para sites relacionados com OpenGL; um guia rápido de referência para algumas funções OpenGL, GLU e GLUT, além de uma descrição detalhada de uma biblioteca de estruturas e funções auxiliares que aparece em vários exemplos deste livro.