Você está na página 1de 39

Iniciando com OpenGL

Rossana Baptista Queiroz

15 de agosto de 2011

O que OpenGL?
2

OpenGL (Open Graphics Library)


interface
2D

para hardware grfico


de rotinas grficas e de modelagem

Biblioteca

e 3D Portvel e rpida
Especificao

aberta
distribuda em SDKs e drivers de placas

Implementao

grficas Licenas variadas


Verso

atual: 4.1

OpenGL

Incio:

Biblioteca grfica desenvolvida para rodar aplicaes grficas sobre o hardware proprietrio da Silicon Graphics Inc. (SGI).
Primeira verso foi o IRIS GL, biblioteca grfica das estaes IRIS Graphics da SGI.

Hardware que provia transformaes de matrizes com altssima performance.

OpenGL surge da deciso de portar a IRIS GL para um padro aberto, para suportar outros fabricantes de dispositivos grficos, outras plataformas de hardware e outros sistemas operacionais.

OpenGL

OpenGL ARB:

API aberta no pode ser de propriedade de uma empresa apenas. Surge ento o OpenGL Architecture Review Board (ARB) Consrcio, originalmente, formado por SGI, Digital Equipament Corporation, IBM, Intel e Microsoft. Outras empresas fazem parte do consrcio, como: SUN, nVIDIA, ATI, ...

01/07/1992 sai a primeira verso da especificao da OpenGL.


A partir de 2006 SGI transfere o controle sobre o padro OpenGL para o grupo de trabalho The Khronos Group (www.khronos.org).

Atualmente, este grupo promove o OpenGL e outros padres como o OpenGL ES (para dispositivos mveis).

OpenGL

Software x hardware:

SW tem muito menos performance que HW e alguns efeitos especiais podem ser proibitivos nas aplicaes grficas.
SW pode executar em qualquer plataforma sem que o usurio necessite de hardware especial, no caso hardware grfico.

HW tem performance, porm maior custo. OpenGL interage com o hardware. Uma aplicao grfica que use a OpenGL necessitar que o dispositivo grfico (placa-de-vdeo) e o driver grfico implementem a especificao da OpenGL.

OpenGL
6

Quando usamos a OpenGL, 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 efeito desejado. Funes com prefixo gl No possui funes para o gerenciamento de janelas e eventos
GLU OpenGL Utility Library GLUT OpenGL Utility Toolkit FLTK, wxWidgets, SDL, Qt...

OpenGL
7

GLU
Consiste de funes que utilizam os recurso de baixo nvel da biblioteca OpenGL para prover rotinas de desenho de alto nvel. Normalmente distribuda junto com o pacote bsico do OpenGL

Mapeamento de coordenadas entre o espao de tela e do objeto Desenho de superfcies qudricas e NURBS Gerao de mipmaps de textura Tesselation de primitivas poligonais Interpretao dos cdigos de erros do OpenGL Funes com prefixo glu

OpenGL
8

GLUT
criao e controle de janelas tratamento de eventos de dispositivos de entrada (mouse e teclado) desenho de formas tridimensionais pr-definidas (como cubo, esfera, bule, etc) Funes com prefixo glut

OpenGL + GLUT: a combinao mais adequada para aprender a programar em OpenGL e para construir aplicaes pequenas

Pipeline do OpenGL
9

Chamadas a funes da API OpenGL

Armazenamento em memria dos comandos OpenGL

Processamento de dados geomtricos e imagens

Frame Buffer

Operaes de fragmento

Rasterizao

O que pipeline? uma palavra usada para descrever um processo composto de duas ou mais etapas para a gerao de uma imagem.

Como funciona a OpenGL

API (Application Prigramming Interface) procedural. Programador invoca comandos OpenGL para compor uma cena.
De forma mais bsica, os objetos so desenhados com primitivas grficas: pontos, linhas e polgonos em 3D. uma mquina de estados. necessrio alterar/habilitar os estados de acordo com a descrio da cena que se deseja gerar, atravs da chamada de funes

Ex.: a cor corrente

Mantm uma srie de variveis de estado, tais como estilo (ou padro) de uma linha, posies e caractersticas das luzes, e propriedades do material dos objetos que esto sendo desenhados.

Como funciona a OpenGL

Permite visualizao de objetos em qualquer ponto de um espao 3D. Suporta tambm iluminao e sombreamento, mapeamento de textura, blending, transparncia, animao e diversos outros efeitos especiais.
Faz a converso das primitivas para imagem rasterizao. Tambm no existe nenhum formato de arquivo associado ao OpenGL para modelos ou ambientes virtuais. O programador deve fazer a carga e interpretao dos formatos de arquivos comuns e converter para primitivas grficas.

Como funciona a OpenGL


Brilho
Cor do fog Framebuffer glEnable() e glDisable()

Luz Erro

Cor atual

Matriz

Largura da linha

Textura

Iniciando com o VS2010


13

Windows fornece os arquivos opengl32.dll e glu32.dll, necessrios para execuo de programas OpenGL Para desenvolver aplicaes, necessrio as bibliotecas estticas (.lib) e os arquivos de cabealhos (.h). A SDK do Visual Studio j fornece:
opengl32.lib

(OpenGL) e glu32.lib (GLU)

gl.h e glu.h. Estes arquivos normalmente esto localizados em uma pasta especial no path do include.

Iniciando com o VS2010


14

GLUT

necessrio baixar a GLUT (pode ser a verso prcompilada) Colocar o arquivo de cabealho (glut.h) no diretrio include/GL do VS 2010
Ex.:

C:\Program Files\Microsoft Visual Studio 10.0\VC\include\GL

Colocar

a biblioteca esttica (glut32.lib) no diretrio lib

C:\Program Files\Microsoft Visual Studio 10.0\VC\lib

Colocar

a biblioteca dinmica (glut32.dll) no diretrio System32 do Windows


C:\Windows\System32

Iniciando um programa
15

Inserir os arquivos de cabealho no seu programa:


#include <GL/gl.h> #include <GL/glu.h>

Utilizando a GLUT, s precisa incluir o cabealho dela, pois as outras esto includas j no arquivo
#include <GL/glut.h>

Programando com OpenGL

Conveno de nomes

glVertex3f(0.0f, 0.0f, 0.0f); glVertex3i(0, 0, 0); glVertex3v(vertex[0]);

Programando com OpenGL

Tipos de dados para se usar com a API OpenGL

Programando com OpenGL

Conveno de nomes
Comeam com gl... Prximas palavras comea com a primeira letra maiscula.

glBegin() GL_COLOR_BUFFER_BIT

Constantes comeam com GL_ e so sempre em maisculas.

Programando com OpenGL

Lembre-se:

OpenGL mquina de estados, desenha primitivas e o estado das variveis altera o resultado da sntese da imagem.

Um objeto desenhado com a cor que est definida, com iluminao que est definida, com as transformaes previamente definidas e etc. Portanto, um vez definida um propriedade, ela ficar residente at tenha o seu estado limpo ou alterado com outro valor.
Por exemplo, quando uma cor definida ela ser usada em qualquer processo de colorizao at que ocorra um novo comando de cor.

OpenGL no faz interao com usurio, portanto, no gerencia entrada e sada de dados. necessrio o uso de alguma biblioteca para gerenciamento de GUI. Padro GLUT.

Programando com OpenGL

Como uma mquina de estados, os comandos tambm podem ter seu estado definido/alterado apenas como ligado ou desligado.

glEnable() e glDisable()

o caso da iluminao:

glEnable(GL_LIGHTING)

CUIDADO: a troca frequente de estados afeta a performance. O melhor setar os estados uma vez s, quando possvel.

Funes de callback
21

A GLUT baseada em eventos Funes de callback


Funes

que no so chamadas pelo programador, e sim pela GLUT Eventos de mouse, teclado, redesenho, Precisam ser registradas no incio do programa

Uma das funes de callback que todo programa com OpenGL+GLUT deve ter uma funo que desenha na tela

Inicializando a GLUT
22

Na prpria funo main ou em uma funo criada por voc, chamada no main

// Programa Principal int main(void) { // Define do modo de operao da GLUT glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); // Especifica o tamanho inicial em pixels da janela GLUT glutInitWindowSize(400,400);

// Cria a janela passando como argumento o ttulo da mesma glutCreateWindow("Primeiro Programa"); continua...

Inicializando a GLUT
23

// Registra a funo callback de redesenho da janela de visualizao glutDisplayFunc(Desenha); // Registra a funo callback para tratamento das teclas ASCII glutKeyboardFunc (Teclado);

// Chama a funo responsvel por fazer as inicializaes Inicializa(); // Inicia o processamento e aguarda interaes do usurio glutMainLoop();
return 0; }

Registro de Funes de Callback


24

Exemplo:
glutDisplayFunc(Desenha); glutReshapeFunc(AlteraTamanhoJanela); glutKeyboardFunc(Teclado); glutSpecialFunc(TeclasEspeciais); glutMouseFunc(GerenciaMouse); glutMotionFunc(MoveMouseBotaoPressionado); glutPassiveMotionFunc(MoveMouse); glutIdleFunc(Idle);

Inicializando a OpenGL
25

// Funo responsvel por inicializar parmetros e variveis void Inicializa(void) { // Define a janela de visualizao 2D glMatrixMode(GL_PROJECTION); gluOrtho2D(-1.0,1.0,-1.0,1.0); glMatrixMode(GL_MODELVIEW); }

glMatrixMode(Glenum mode)

Permite identificar com qual tipo de matriz se vai trabalhar (de projeo e de modelo)

gluOrtho2D(GLDouble left, GLDouble right, GLDouble bottom, GLDouble top)

Define que est trabalhando com cenas 3D

Callback de Desenho
26

// Funo callback de redesenho da janela de visualizao void Desenha(void) { // Limpa a janela de visualizao com a cor branca glClearColor(1,1,1,0); glClear(GL_COLOR_BUFFER_BIT);
// Define a cor de desenho: vermelho glColor3f(1,0,0);

// Desenha um tringulo no centro da janela glBegin(GL_TRIANGLES); glVertex3f(-0.5,-0.5,0); glVertex3f( 0.0, 0.5,0); glVertex3f( 0.5,-0.5,0); glEnd();
//Executa os comandos OpenGL glFlush(); }

Callback de Teclado
27

// Funo callback chamada para gerenciar eventos de teclas void Teclado (unsigned char key, int x, int y) { if (key == 27) exit(0); }

Programando com OpenGL

Desenho de primitivas:

Basicamente, a definio dos vrtices das primitivas e das propriedades de cor, normais, texturas e etc. Tudo definido entre glBegin(<primitiva>) e glEnd() Exemplo:
glBegin(GL_TRIANGLES); glColor3f(0.0, 0.0, 1.0); glVertex3f(0.0, 0.0, 0.0); glVertex3f(1.0, 0.0, 0.0); glVertex3f(0.5, 0.5, 0.0); glEnd();

Outros comandos utilizados dentro do bloco: glColor*(), glNormal*(), glMaterial*()

Programando com OpenGL

Primitivas:

Programando com OpenGL

Primitivas. Exemplos:
glBegin(GL_POLYGON); // ou glBegin(GL_POINTS); glVertex2f(0.0, 0.0); glVertex2f(0.0, 3.0); glVertex2f(4.0, 3.0); glVertex2f(6.0, 1.5); glVertex2f(4.0, 0.0); glEnd();

Programando com OpenGL

Tipos de polgonos:

Vlidos

Invlidos

Programando com OpenGL

Objetos curvos so aproximados por retas:

Programando com OpenGL

Exemplo. Desenhando um crculo:


#define PI 3.1415926535898

GLfloat circle_points = 100.0f;


GLfloat angle, raioX=1.0f, raioY=1.0f; glBegin(GL_LINE_LOOP); for (int i = 0; i < circle_points; i++) { angle = 2*PI*i/circle_points;

glVertex2f(cos(angle)*raioX, sin(angle)*raioY);
} glEnd();
Note que: O tamanho do crculo dado pelo raio, no exemplo desenhado um crculo com raio 1 Definindo o valor dos raios X e Y com valores diferentes, podese desenhar uma elipse.

Programando com OpenGL

Modo de polgono:
glPolygonMode(<lado>,<modo>) <lado>
GL_FRONT_AND_BACK
GL_FRONT GL_BACK

<modo>
GL_POINT

GL_LINE
GL_FILL

Programando com OpenGL

Matrizes: Trs tipos de matrizes: GL_MODELVIEW:

A matriz modelview controla as transformaes dos vrtices dos objetos da cena A matriz de projeo controla como a cena 3-D projetada em 2-D

GL_PROJECTION

GL_TEXTURE

A matriz de texturas (geralmente pouco conhecida e utilizada) transforma as coordenadas das textura para obter efeitos como projetar e deslocar texturas

Programando com OpenGL

Matrizes de projeo:

glFrustum(left,right,bottom,top,near,far) glOrtho(left,right,bottom,top,near,far) gluPerspective(fovy,aspect,zNear,zFar) gluOrtho2D(left,right,bottom,top) gluLookAt(eyex, eyey, eyez, centerx, centery, centerz, upx, upy, upz)

Coordenadas de Tela

glViewport(x, y, width, height)

Referncias bibliogrficas
37

1.

2.

3.

http://www.inf.pucrs.br/~manssour/OpenGL/Tutori al.html COHEN, Marcelo, MANSSOUR, Isabel. OpenGL: uma abordagem prtica e objetiva. So Paulo : Novatec, 2006. 478 p. Notas de Aula do professor Leandro Tonietto (http://professor.unisinos.br/ltonietto/jed/pgr/pgr2 011_02.html)

Referncias bibliogrficas

www.opengl.org www.khronos.org OpenGL Programming Guide (Woo, Neider, Davis Addison-Wesley ) OpenGL Programming for the X Window System OpenGL Game Programming (Astle, Hawkins, LaMothe)

Referncias bibliogrficas

Red Book

http://fly.cc.fer.hr/~unreal/theredbook/ http://www.ingleza.com.br/opengl/index.html http://pyopengl.sourceforge.net/documentation/manual/ http://pyopengl.sourceforge.net/documentation/index.html http://www.wxpython.org/onlinedocs.php http://www.wxpython.org/tutorial.php

Tutorial de OpenGL (Portugus)

Referncia (API) para PyOpenGL

Documentao para PyOpenGL

Referncia (API) para wxPython

Tutorial bsico de wxPython

Você também pode gostar