Introdução ao OpenGL
OpenGL
Open Graphic Library
Biblioteca de rotinas gráficas e modelagens
bidimensional (2d) e tridimensional (3d)
extremamente portável e rápida
Incorpora diversos algoritmos otimizados para
desenho de primitivas gráficas, mapeamento de
texturas e efeitos especiais
Gerenciado por um consórcio formado pelas principais
empresas da área
3Dlabs, Apple Computer, NVIDIA, SGI e SUN
Freqüentes revisões proporciona a incorporação das
mais recentes técnicas e da evolução do hardware
OpenGL
Usado na construção de ferramentas CAD, programas
de modelagem, jogos, etc.
Funcionalidades
Desenho de primitivas gráficas
Iluminação
Coloração
Mapeamento de texturas
Transparências
Animações
OpenGL
Restrições
As funcionalidades fornecidas pelo OpenGL são de baixo
nível
Não fornecem funcionalidades de gerenciamento de janelas
Solução
Extensão da OpenGL através de novas bibliotecas
GLU (OpenGL Utility Library)
Matrizes de projeção
Orientação da visualização
Desenho de superfícies quádricas
GLUT (OpenGL Utility Toolkit)
Criação de janelas e menus
Gerenciamento de janelas e eventos
OpenGL – Padronização de nomes
<PrefixoBiblioteca> <ComandoRaiz> <ContadorArgumentosOpc> <TipoArgumentosOp>
void glColor3f(Glfloat red, Glfloat green, Glfloat blue)
Argumento
gl
Prefixo que representa a biblioteca OpenGl
color
Comando raiz que representa a funcionalidade da função
3
Número de argumentos que a função possui
f
Indica que os argumentos são valores de ponto flutuante
•Os duas ultimas partes do padrão são opcionais
•Funções das bibliotecas Glu e GLUT não as utilizam
OpenGL – Primeiros Passos
#include <stdlib.h>
#include <GL/openglut.h>
int main(void)
{
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
glutInitWindowSize(400,400);
glutCreateWindow("Primeiro programa OpenGL");
//Inicializa();
//glutDisplayFunc(Desenha);
//glutKeyboardFunc(Teclado);
glutMainLoop();
return 0;
}
void Desenha(void)
{
glClearColor(1,1,1,0);
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1,0,0);
glBegin(GL_TRIANGLES);
glVertex3f(-0.5, -0.5, 0);
glVertex3f(0.0, 0.5, 0);
glVertex3f(0.5, -0.5, 0);
glEnd();
glFlush();
}
void Teclado(unsigned char key, int x, int y)
{
if (key == 27)
exit(0);
}
void Inicializa(void)
{
glMatrixMode(GL_PROJECTION);
gluOrtho2D(-1.0,1.0,-1.0,1.0);
glMatrixMode(GL_MODELVIEW);
}
Tratamento de eventos
void glutReshapeFunc(AlteraTamanhoTela)
void <nomeFunção>(int largura, int altura);
void glutSpecialFunc(TeclasEspeciais)
void <nomeFunção>(int tecla, int x, int y);
void glutMouseFunc(GerenciaMouse)
void <nomeFunção>(int botao, int estado,
int x, int y)
void glutMotionFunc
(MoveMouseBotãoPressionado)
void <nomeFunção>(int x, int y);
void
glutPassiveMotionFunc(MoveMouse)
void <nomeFunção>(int x, int y);
void glutIdleFunc(Idle)
void <nomeFunção>(void)
Constantes GLUT para eventos
do mouse
Valor
Descrição
GLUT_LEFT_BUTTON
Informa que foi pressionado o botão esquerdo
GLUT_MIDDLE_BUTTON
Informa que foi pressionado o botão do meio
GLUT_RIGHT_BUTTON
Informa que foi pressionado o botão direito
Valor
Descrição
GLUT_DOWN
Informa que o botão foi pressionado
GLUT_UP
Informa que o botão foi precionado
Constantes GLUT para eventos
de teclas especiais
Valor
Tecla pressionada
GLUT_KEY_F1
Tecla F1
GLUT_KEY_Fn
Tecla Fn
GLUT_KEY_F12
Tecla F12
GLUT_KEY_LEFT
Tecla direção esquerda
GLUT_KEY_RIGHT
Tecla direção direita
GLUT_KEY_UP
Tecla direção cima
GLUT_KEY_DOWN
Tecla direção baixo
GLUT_KEY_PAGE_UP
Tecla PageUp
GLUT_KEY_PAGE_DOWN
Tecla PageDown
GLUT_KEY_END
Tecla End
GLUT_KEY_INSERT
Tecla Insert
Desenhos Bidimencionais
Valor
Tecla pressionada
GL_POINTS
Desenha pontos
GL_LINES
Desenha segmentos de linha
GL_LINE_STRIP
Desenha segmentos de linha conectados
GL_LINE_LOOP
Desenha segmentos de linha conectados, unindo o
primeiro ao ultimo
GL_POLYGON
Desenha um polígono convexo
GL_TRIANGLES
Desenha triângulos
GL_TRIANGLE_STRIP
Desenha triângulos conectados
GL_TRIANGLE_FAN
Desenha triângulos a partir de um ponto central
GL_QUADS
Desenha quadriláteros
GL_QUAD_STRIP
Desenha quadriláteros conectados
Desenhos Bidmencionais
#include <math.h>
float ang;
glBegin(GL_POINTS);
for(ang=0;ang<2*M_PI;ang+=M_PI/7.0)
glVertex2f(20*cos(ang), 20*sin(ang));
glEnd();
Criação de menus
int glutCreateMenu(void (*func) (int value))
func – função responsável pelo tratamento do menu
retorna um inteiro que identifica o menu criado
void glutAddMenuEntry(char *name, int value)
void glutAddSubMenu(char *name, int menu)
name – nome do sub-menu
menu – valor inteiro correspondente ao menu ao qual o sub-menu
deve ser adcionado
void glutAttachMenu(int button)
Associa um botão ao menu
void glutDetachMenu(int button)
Desassocia o menu
Alterando Propriedades dos
Desenhos
void glPointSize(GLfloat size)
void glLineWidth(Glfloat width)
Altera a espessura da linha
glEnable(GL_LINE_STIPPLE)
Habilita a variável de estado que armazena o estilo de
linha
void glLineStipple(GLint factor, Glushort pattern)
Factor – valor entre 1 e 256 que altera o número de pixels
do tracejado
Pattern – valor de 16 bits utilizado p/ especificar o tipo
de tracejado
Exibição de Textos
Utiliza a GLUT para exibição de textos na tela gráfica
Dois tipos de fontes de caracteres
Segmentos de reta (STROKE)
Mais flexíveis (escalável e rotacionável)
Imagens (BITMAP)
Mais rápidas
As funções de texto presentes na GLUT são básicas,
para textos com melhor qualidades devem ser
utilizadas bibliotecas específicas, como a FTGL
(http://homepages.paradise.net/henryj/code)
void glutBitmapCharacter(void *font, int character)
Valor
Descrição
GLUT_BITMAP_8_BY_13
Fonte padrão 8x13
GLUT_BITMAP_9_BY_15
Fonte padrão 9x15
GLUT_BITMAP_TIMES_ROMAN_10
Fonte times roman tamanho 10
GLUT_BITMAP_TIMES_ROMAN_24
Fonte times roman tamanho 24
GLUT_BITMAP_HELVITICA10
Fonte helvítica, tamanho 10
GLUT_BITMAP_HELVITICA12
Fonte helvítica, tamanho 12
GLUT_BITMAP_HELVITICA18
Fonte helvítica, tamanho 18
void glRasterPos2f, void glRasterPos2i, void glRasterPos2d
Modifica a posição matricial corrente utilizada para desenhar
o texto
void glutStrokeCharacter(void *font, int character)
Exibe caracteres formados por segmentos de reta
GLUT_STROKE_ROMAN e
GLUT_STROKE_MONO_ROMAN
Funções que afetam as linhas também afetam as letras
escritas com este método
void DesenhaTexto(void *font, char *string){
while(*string)
glutBitmapCharacter(*font, *string++);
}
*obs: Utilizar a função glRasterPos2f(int x,int y) para
posicionar o texto