Você está na página 1de 42

Introduo ao OpenGL

Marta Becker Villamil


Processamento Grfico / Computao Grfica
mbvillamil@unisinos.br

Slides so provenientes da apresentao dos professores


Christian Hofsetz e Leandro Tonietto

Sumrio

! Introduo
! Programando com OpenGL
! Exemplos

Introduo

! O que OpenGL? [1]


! Open Graphics Library
! Interface de software para hardware grfico.
! uma biblioteca de modelagem e grficos
3D, altamente portvel e muito rpida.
! Independente de SO e de hardware.

! Muito mais rpido do que implementao


puramente em software, como: motores de
grficos ou software de ray-tracing.

Introduo
! Inicio:
! Biblioteca grfica desenvolvida para rodar aplicaes
grficas sobre o hardware proprietrio da Silicon
Graphis 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.

Introduo
! 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 est na verso 2.0.

Introduo
! 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-devdeo) e o driver grfico implementem a especificao da
OpenGL.

Introduo
! Como funciona a OpenGL
!
!
!
!
!
!
!

API Procedural. Programador invoca comandos OpenGL para


compor uma cena. OpenGL no renderiza uma cena descrita, ela
deve ser programada em cdigo.
De forma mais bsica, os objetos so desenhados com primitivas
grficas: pontos, linhas e polgonos em 3D.
Permite visualizao de objetos em qualquer ponto de um espao
3D.
OpenGL suporta tambm iluminao e sombreamento,
mapeamento de textura, blending, transparncia, animao e
diversos outros efeitos especiais.
Faz a converso das primitivas para imagem rasterizao.
No possui funcionalidades para gerenciamento de janela,
interao com o usurio ou acesso a arquivos (I/O). necessrio
utilizar alguma biblioteca adicional (GLUT, SDL, ...)
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.

Modelo de Aplicao
Dados 2D/3D
Modelo da
Aplicao

Aplicao
Manipula dados e define
o que ser desenhado e
aonde.

OpenGL/GLUT/SDL/DirectX

Sistema
Grfico

Modelo de Aplicao
Dados 2D/3D
Modelo da
Aplicao

Aplicao

GLUT

Manipula dados e define


o que ser desenhado e
aonde.

GLUT sistema de janelas independente


de sistema. No livre

Modelo de Aplicao
Dados 2D/3D
Modelo da
Aplicao

Aplicao
Manipula dados e define
o que ser desenhado e
aonde.

SDL Simple DirectMedia Layer. LGPL. livre

Programando com OpenGL


!

Bibliotecas OpenGL
!
!

Microsoft Windows opengl32.dll


OpenGL utility library (GLU) glu32.dll
!

Headers:
!
!

Conjunto de funes utilitrias para tarefas comuns e complexas, algumas


matrizes especiais para clculo e suporte para curvas e superfcies.

gl.h header de prototipao das funes OpenGL


glu.h header de prototipao das funoes GLU

Exemplo de #include para um programa OpengGL:


#include <windows.h> // no vem no VisualC++ Express
#include <gl/gl.h>
#include <glu/glu.h>
#include glee.h // extenses da OpenGL
#include glut.h // freeglut

Programando com OpenGL


! Tipos de dados para se usar com a API OpenGL

Programando com OpenGL


! Conveno de nomes

glVertex3f(0.0f, 0.0f, 0.0f);


glVertex3i(0, 0, 0);
glVertex3v(vertex[0]);

Programando com OpenGL


! Conveno de nomes
! Comeam com gl...
! Prximas palavras comea com a primeira letra
maiscula.
! glBegin()

! Constantes comeam com GL_ e so sempre em


maisculas.
! GL_COLOR_BUFFER_BIT

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.

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:
Primitiva / Constante

Descrio

GL_POINTS

Pontos individuais

GL_LINES

Par de vrtices = 1 linha

GL_LINE_STRIP

Pontos conectados por linhas

GL_LINE_LOOP

= strip + 1 linha para fechar

GL_TRIANGLES

3 pontos = 1 tringulo

GL_TRIANGLE_STRIP

Srie de tringulos conectados

GL_TRIANGLE_FAN

Todos tri compartilham ponto zero

GL_QUADS

4 pontos = 1 quadriltero

GL_QUAD_STRIP

Srie de quads. conectados

GL_POLYGON

Todos pontos = 1 polgono

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, pode-se
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


! Tratamento de erros em OpenGL:
! Quando fazemos algo invlido em OpenGL ou GLU o
programa no pra; apenas no faz o que a gente
espera. Isso dificulta a depurao!
! Quando um erro ocorre um flag setado com um
cdigo de erro. Para acessar esse cdigo deve-se
usar glGetError();
! Por outro lado cada chamada OpenGL a mais
afetam a performance Em alguns casos quando
queremos renderizao em tempo real temos que
eliminar o maior nmero possvel dessas
chamadas! Lembre-se: todos os comandos so
bufferizados e processados.

Programando com OpenGL


! Matrizes:
! Trs tipos de matrizes:
! GL_MODELVIEW:
! A matriz modelview controla as transformaes dos
vrtices dos objetos da cena

! GL_PROJECTION
! A matriz de projeo controla como a cena 3-D
projetada em 2-D

! 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)

Programando com OpenGL

! Transformaes:
! Modelagem
! glTranslate{fd}(x, y, z)
! glRotate{fd) (angle, x, y, z )
! glScale{fd}(x,y,z)

! Propriedades Materiais glMaterial*()


! ambiente, difuso, especular

! Fontes de Luz glLight*()


! cor, posio, atenuao, etc

Programando com OpenGL


! Exemplo:
// Estabelece o modo de projeo
glMatrixMode(GL_PROJECTION);
// limpa matrizes
glLoadIdentity();
// especifica o Frustum
glFrustum(-1, 1, -1, 1, 0.0, 40.0);
// habilita estado de modelagem
glMatrixMode(GL_MODELVIEW);
// cria matriz de transformao
glPushMatrix();
// define uma transformao de rotao em X,Y,Z
glRotatef(45.0, 1.0, 1.0, 1.0);
render(); // invoca um mtodo do programa
glPopMatrix();

Programando com OpenGL


! Dicas:
! Lembre-se que a origem do OpenGL no canto
esquerdo (e baseado em um sistema de
coordenadas left-hand )
! Lembre-se de (1) ativar o modo de preenchimento
desejado (por ex.: glEnable(GL_DEPTH_TEST);)
e de (2) Limpar os respectivos buffers! (por ex.:
glClear(GL_COLOR_BUFFER_BIT |
GL_DEPTH_BUFFER_BIT);)
! Evitar mudanas constantes de estado
! Maior freqncia de erros: posicionamento de
cmera. Atente-se para olhar de um ponto e para
um ponto que seja coerente com os objetos
renderizados.

Programando com OpenGL


! Dicas:
!
!

Ao manipular as matrizes OpenGL lembre-se de verificar se o


tipo de matriz correto est ativado.
Por exemplo:
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glFrustum(-1, 1, -1, 1, 0.0, 40.0);
/* glMatrixMode(GL_MODELVIEW); */
glPushMatrix();
glRotatef(45.0, 1.0, 1.0, 1.0);
render();
glPopMatrix();

Programando com OpenGL


! Renderizao de textos:
! OpenGL no d nenhum suporte nativo para o
tratamento textos e de fontes grficas. Portanto, o
texto no considerado uma primitiva ou algo do
gnero para ser renderizado.
! Deve ser utilizado algum recurso de biblioteca para
fazer esta tarefa.
! GLUT e SDL possuem mtodos para suportar a
renderizao como uma imagem:
! Exemplo GLUT:
//Para posicionar na coordenada (x,y)
glRasterPos2f(x,y);
//Chamada GLUT para escrita
glutBitmapCharacter(fonte,*(texto++));

Programando com OpenGL

! Renderizao de textos:
! Usado em fonte
!
!
!
!
!
!
!

GL_BITMAP_8_BY_13
GL_BITMAP_9_BY_15
GL_BITMAP_TIMES_ROMAN_10
GL_BITMAP_TIMES_ROMAN_24
GL_BITMAP_HELVETICA_10
GL_BITMAP_HELVETICA_12
GL_BITMAP_HELVETICA_18

Programando com OpenGL


! Alguns mtodos normalmente presentes em
programas OpenGL:

! init() inicializiao de variveis e de estados


permanentes.
! display() que a coisa acontece!! Desenho das
primitivas e definio dos estados relacionados a
elas, como cor, textura e outros aspectos.
! update() alteraes a serem realizadas quando
do redimensionamento da janela.
! getInputs() processamento de entradas como
teclado e mouse.

Programando com OpenGL


! Exemplos de cdigo para o mtodo init():
void init(){
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(50.0, 1.0, -10.0, 7.0);
glEnable(GL_LIGHTING);
const float specularColor[]={1.0f,0.0f,1.0f,0.5f};
glLightfv(GL_LIGHT0, GL_SPECULAR, specularColor);
glMatrixMode(GL_MODELVIEW);
}

OpenGL
! Fake or Real?

Bibliografias

! 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)

Bibliografias
! Red Book
!

http://fly.cc.fer.hr/~unreal/theredbook/

! Tutorial de OpenGL (Portugus)


!

http://www.ingleza.com.br/opengl/index.html

! Referncia (API) para PyOpenGL


!

http://pyopengl.sourceforge.net/documentation/manual/

! Documentao para PyOpenGL


!

http://pyopengl.sourceforge.net/documentation/index.html

! Referncia (API) para wxPython


!

http://www.wxpython.org/onlinedocs.php

! Tutorial bsico de wxPython


!

http://www.wxpython.org/tutorial.php

Referncias bibliogrficas

! WRIGHT Jr., Richard S.; LIPCHAK,

Benjamin; HAEMEL, Nicholas. OpenGL


Superbible: Comprehensive Tutorial
and Reference. 4ed.: Addison-Wesley.
2007.

Você também pode gostar