Вы находитесь на странице: 1из 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

OpenGL/GLUT/SDL/DirectX

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

Sistema Grfico

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

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

GLUT

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
! Conjunto de funes utilitrias para tarefas comuns e complexas, algumas matrizes especiais para clculo e suporte para curvas e superfcies.

Headers:
! ! 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
! glEnable() e glDisable()

tambm podem ter seu estado definido/alterado apenas como ligado ou desligado.

! 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 GL_POINTS GL_LINES GL_LINE_STRIP GL_LINE_LOOP GL_TRIANGLES GL_TRIANGLE_STRIP GL_TRIANGLE_FAN GL_QUADS GL_QUAD_STRIP GL_POLYGON Descrio Pontos individuais Par de vrtices = 1 linha Pontos conectados por linhas = strip + 1 linha para fechar 3 pontos = 1 tringulo Srie de tringulos conectados Todos tri compartilham ponto zero 4 pontos = 1 quadriltero Srie de quads. conectados 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/ 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

Referncias bibliogrficas

! WRIGHT Jr., Richard S.; LIPCHAK,

Benjamin; HAEMEL, Nicholas. OpenGL Superbible: Comprehensive Tutorial and Reference. 4ed.: Addison-Wesley. 2007.

Вам также может понравиться