PETROLINA
2008
AUTARQUIA EDUCACIONAL DO VALE DO SÃO FRANCISCO - AEVSF
FACULDADE DE CIÊNCIAS SOCIAIS E APLICADA DE PETROLINA - FACAPE
CENTRO DE ENGENHARIAS E CIÊNCIAS TECNOLÓGICAS
PETROLINA
2008
Sumário
1. Introdução 4
2. Histórico 5
2.1. Tema 8
3. Plataforma de Desenvolvimento 9
4. Introdução ao OpenGL e GLUT 10
4.1. OpenGL como maquina de estados 11
4.2. O Pipeline do OpenGL 12
4.2.1. Listas de Exposição 12
4.2.2. Avaliadores 12
4.2.3. Operações por vértices 13
4.2.4. Montagem de primitivas 13
4.2.5. Operações de pixels 13
4.2.6. Montagem de texturas 13
4.2.7. Rasterização 14
4.2.8. Operações fragmentadas 14
4.3. Funções Gráficas do OpenGL 15
4.4. GLUT 17
4.4.1. Instalando o GLUT no DEV-C++ 17
4.4.2. Configurando o GLUT no DEV-C++ 18
5. FMOD 19
5.1. O que é FMOD 19
5.2. Alternativas 19
5.3. Quanto custa 19
5.4. Disponível 19
5.5. Instalando o FMOD no DEV-C++ 20
5.6. Configurando o FMOD no DEV-C++ 20
6. Plataforma necessária 21
7. Analise e resultados 22
8. Bibliografia 24
Introdução
Esse trabalho tem por objetivo mostrar o jogo Street Frog criado usando as funcionalidades do
OpenGL bem como a utilização de suas bibliotecas de desenvolvimento (GLUT: OpenGL
Utility ToolKit) e funcionalidades da mesma, além da apresentação do embasamento teórico.
4
1. Histórico
5
b) O fim da idéia de que os fabricantes de computadores devem fornecer apenas a máquina e
o sistema operacional e que os usuários devem escrever seus próprios aplicativos. A
popularização dos aplicativos prontos e integrados (planilhas, editores de texto, editores
gráficos, processadores de imagem, bancos de dados, etc) permitiram a popularização da
Computação Gráfica na medida em que possibilitaram que o usuário comum sem
conhecimento ou tempo para desenvolver aplicativos gráficos (nem sempre tão simples de
serem programados) pudesse utilizar as facilidades da mesma.
6
implementável em plataformas com capacidades distintas sem comprometer o desempenho
gráfico do hardware e sem sacrificar o controle sobre as operações de hardware.
7
2.1 Tema
Em Street Frog, você é um sapo no qual tem que atravessar a avenida para concluir os
níveis de velocidade. Ao atravessar e chegar do lado oposto, a tela mudará. A ida é baseada
em atravessar a avenida, e a volta em pular troncos em uma lagoa. Entretanto você não poderá
ser atropelado e nem poderá cair do tronco, (esse sapo não gosta de água), no caso ao ser
atropelado, você voltará ao inicio (Acostamento da pista), e caso seja na lagoa, voltará para a
beira do lago. Lembre-se o sapo não pode cair do tronco, e nem permanecer em cima desse
tronco até o fim do rio, caso contrário voltará para o inicio. Na fase da lagoa, há duas pontes,
locais seguros no qual o sapo pode caminhar livremente.
8
3. Plataforma de Desenvolvimento
9
4. Introdução ao OpenGL e GLUT
Diante das funcionalidades providas pelo OpenGL, tal biblioteca tem se tornado um
padrão amplamente adotado na indústria de desenvolvimento de aplicações. Este fato tem sido
encorajado também pela facilidade de aprendizado, pela estabilidade das rotinas, pela boa
documentação disponível e pelos resultados visuais consistentes para qualquer sistema de
exibição concordante com este padrão.
10
4.1 OpenGL como máquina de estados
11
4.2 O "Pipeline" do OpenGL
A maior parte das implementações do OpenGL tem uma ordem de operações a serem
executadas. Uma série de estágios de processos chamam o "pipeline" de renderização do
OpenGL.
4.2.2 Avaliadores
Todas as primitivas geométricas são eventualmente descritas por vértices. As curvas e
as superfícies paramétricas podem inicialmente ser descritas pelos pontos de controle e pelas
funções polinomiais chamadas funções base. Os avaliadores fornecem um método para
derivar os vértices usados para representar a superfície dos pontos de controle. O método é o
12
mapeamento polinomial, que pode produzir a normal de superfície, as coordenadas da textura,
as cores, e valores de coordenadas espaciais dos pontos de controle.
13
Uma aplicação OpenGL pode aplicar imagens de texturas em objetos geométricos,
para tornar estes mais realísticos. Se diversas imagens de textura forem usadas, as mesmas
deverão ser colocadas em objetos de modo que se possa facilmente comutar entre elas.
Algumas exceções do OpenGL podem ter recursos especiais para acelerar o desempenho das
texturas. Se existir memória especial disponível , os objetos de textura podem ter prioridade
de controle do recurso limitado de memória.
4.2.7 Rasterização
Rasterização é a conversão de dados geométricos e do pixel em fragmentos. Cada
quadrado do fragmento corresponde a um pixel no framebuffer. Os "stipples" da linha e do
polígono, largura da linha, tamanho do ponto, modelo de sombra, e os cálculos da cobertura
para suportar o antialiasing são feitos considerando a conexão dos vértices em linhas ou os
pixels internos. Os valores da cor e da profundidade são atribuídos para cada quadrado do
fragmento.
14
4.3 Funções gráficas do OpenGL
Alfa Blending: Provê mecanismos para criar objetos transparentes. Usando a informação alfa,
um objeto pode ser definido como algo totalmente transparente até algo totalmente opaco.
Modo "Color-Index": Buffer de Cores que armazena índices de cores das componentes
vermelhas, verdes, azuis, e alfa das cores (RGBA).
Display Lists: Uma lista nomeada de comandos de OpenGL. Os índices de um Display list
podem ser pré-processados e podem conseqüentemente executar mais eficientemente do que o
mesmo conjunto de comandos do OpenGL executados no modo imediato.
Double buffering: Usado para fornecer uma animação suave dos objetos. Cada cena
sucessiva de um objeto em movimento pode ser construída em "background' ou no buffer
"invisível" e então apresentado. Isto permite que somente as imagens completas sejam sempre
apresentadas na tela.
15
Gouraud Shading: Interpolação suave das cores através de um segmento de polígono ou de
linha. As cores são atribuídas em vértices e linearmente interpoladas através da primitiva para
produzir uma variação relativamente suave na cor.
Modo Imediato: A execução de comandos OpenGL quando eles são chamados, possui
resultado melhor do que os "Display Lists".
Modo RGBA: Buffers de cores armazenam componentes vermelhos, verdes, azuis, e alfa da
cor.
Planos do estêncil: Um buffer que é usado para mascarar pixels individuais no buffer de
frame de cores.
Mapeamento de Texturas: O processo de aplicar uma imagem a uma primitiva gráfica. Esta
técnica é usada para gerar o realismo nas imagens.
4.4 GLUT
O GLUT suporta:
A versão mais atual do Dev-C++ (4.9.8 ou superior) já inclui as bibliotecas do GLUT por
padrão devendo apenas ter o passo 2 executado. Para versões anteriores siga os seguintes
passos :
17
4.4.2 Configurando GLUT no DEV-C++
18
5. FMOD
FMOD é uma engine de áudio disponível nas plataformas Windows, Windows CE, Linux,
Macintosh, GameCube, Playstation 2 e XBox. Ela pode ser usado com C/C++, Visual Basic,
Delphi e MASM.
5.2 Alternativas:
Uma alternativa pode ser o OpenAL. O OpenAL é uma outra API de áudio multi-plataforma
que está disponível para Windows, Linux e Macintosh e pode ser usado com C/C++, Delphi e
Java. O estilo é similar ao OpenGL.
Os desenvolvedores do FMOD têm uma ótima filosofia; se você não pretende lucrar com seu
projeto, então você pode usá-la gratuitamente. Logo, até que você não torne seu projeto algo
profissional você não precisa pagar. Porém a partir do momento que seu produto é
comercializado então você deve comprar uma licença, começando por $100 para produtos
shareware. Para mais detalhes dê uma olhada na lista oficial de preços no site fmod.org.
5.4 Disponível:
Para usar FMOD em sua aplicação, você precisa de cabeçalhos e da biblioteca que pode ser
baixada a partir do site http://www.fmod.org/.
19
5.5 Instalando o FMOD no DEV-C++
20
6. Plataforma Necessária
21
7. Análise e Resultados
Na parte gráfica não tive problemas, consegui desenhar cada objeto de forma rápida,
embora essa seja uma parte bastante cansativa. Logo em seguida fui buscar como escrever um
texto e mostrar via OpenGL, estudei bastante e consegui implantar essa função (Referência na
Bibliografia).
A maior dificuldade foi criar um sistema de detecção de colisão, por exemplo, como
eu iria saber que o carro atropelou o sapo? Ou se ele caiu do tronco, ou caiu na água? Conclui
com uma idéia obvia: Compararia os valores de x e y dos objetos em movimento com o sapo,
se os dois estivessem no mesmo valor, acarretaria na colisão. Entretanto para o tronco esse
código não teria lógica, nesse caso teria que ser o inverso, onde se o valor do tronco fosse o
mesmo lugar do sapo tudo estaria ok.
22
Após criar a colisão e a correção das falhas, criei os níveis. De Inicio os níveis eram
nada mais que a mudança de tempo em milissegundos dos objetos. Os níveis eram ativados
pelas teclas 1 a 5. Totalmente sem lógica, em um jogo você conquista o nível, e demorei um
pouco pra programar. Criei um código que quando o sapo chegasse em y=7 o lado seria lado
+ 1, nesse caso de inicio lado tem valor 0. Usando o código, ao chegar no valor y=7 (Altura
da avenida para mudança de lado) executaria automaticamente a formula citada, lado 0+1,
com resultado lado=1 mudando para fase dos troncos e assim sucessivamente. Ativei a
dificuldade para que o lado 0 e 1 gerassem uma velocidade de movimento dos objetos para
devagar, 2 e 3 para médio, 4 e 5 para rápido e 6 para vitória ou zeramento como é mais
conhecido.
Em seguida, fui procurar como adicionar um som ao meu jogo, e encontrei uma
biblioteca especialmente para isso, a FMOD (Referencia do FMOD na bibliografia), com
licença para uso gratuito em programas livres.
Por fim, tenho esse trabalho como desafio concluído. Espero que Street Frog possa
despertar o interesse pela pesquisa em computação gráfica, servindo aos demais alunos como
uma contribuição acadêmica e como referência sobre OpenGL.
23
Bibliografia
KILGARD, M. J.; OpenGL and X, Part 1 :An Introduction. Technical report; SGI;
Disponível em <http://www.sgi.com/software/opengl/glandx/intro/intro.html>.
SEGAL, M. ; AKELEY, K.; The Design of the OpenGL Graphics Interface. Technical
report, Silicon Graphics Inc; Disponível em:
<http://www.opengl.org/developers/documentation/white_papers/opengl/index.html >.
24