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