21
An Interactive Introduction to OpenGL Programming SIGGRAPH 2001 - Los Angeles 1 Marcelo Walter - UFPE Introdução Prática à Programação em OpenGL Marcelo Walter 2 Marcelo Walter - UFPE Objetivos Demonstrar o suficiente de OpenGL, a fim de que você possa escrever um programa de computação gráfica interativo com objetos 3D

Introdução Prática à Programação em OpenGL

  • Upload
    others

  • View
    17

  • Download
    0

Embed Size (px)

Citation preview

An Interactive Introduction to OpenGLProgramming

SIGGRAPH 2001 - Los Angeles 1

Marcelo Walter - UFPE

Introdução Prática à Programaçãoem OpenGL

Marcelo Walter

2Marcelo Walter - UFPE

Objetivos

Demonstrar o suficiente de OpenGL, a fim deque você possa escrever um programa decomputação gráfica interativo com objetos3D

An Interactive Introduction to OpenGLProgramming

SIGGRAPH 2001 - Los Angeles 2

3Marcelo Walter - UFPE

OpenGL…

Permite criar programas interativos queproduzem imagens coloridas de objetos emmovimento

4Marcelo Walter - UFPE

Exemplos Simples

Worms• Bidimensional (2D)

Gears• Tridimensional (3D)

An Interactive Introduction to OpenGLProgramming

SIGGRAPH 2001 - Los Angeles 3

5Marcelo Walter - UFPE

Características Principais

Início em 1992• Projetada para aplicações gráficas interativas 2D e 3D

Descendente de GL (Graphics Library - SGI)Controlada pelo

• Consórcio de indústrias

• 3DLabs, ATI, Discreet, Evans&Sutherland, Intel, Nvidia,SGI, Sun

• … creation of open standard APIs to enable theauthoring and playback of dynamic media on a widevariety of platforms and devices

6Marcelo Walter - UFPE

Versão atual 3.0 (agosto 2008)A partir da versão 1.4 incluiu OpenGL

Shading Language• Programação em Hardware

Linux: MESA (www.mesa3d.org) FREE

An Interactive Introduction to OpenGLProgramming

SIGGRAPH 2001 - Los Angeles 4

7Marcelo Walter - UFPE

Família

Embedded systems

8Marcelo Walter - UFPE

Mais informação www.opengl.org

An Interactive Introduction to OpenGLProgramming

SIGGRAPH 2001 - Los Angeles 5

9Marcelo Walter - UFPE

Livros

OpenGL ProgrammingGuide (Woo, Neider,Davis - Addison-Wesley )

Interactive ComputerGraphics: A Top-DownApproach with OpenGL(E. Angel - Addison-Wesley)

http://www.opengl.org/resources/code/samples/redbook/

10Marcelo Walter - UFPE

Livros

OpenGL ExtensionsGuide (Eric Lengyel)

Opengl ShadingLanguage (Randi J.Rost)

An Interactive Introduction to OpenGLProgramming

SIGGRAPH 2001 - Los Angeles 6

11Marcelo Walter - UFPE

Livros

OpenGL Programming forthe X Window System

OpenGL GameProgramming (Astle,Hawkins, LaMothe)

12Marcelo Walter - UFPE

Porque aprender OpenGL?

Padrão gráfico para aplicações industriais,entretenimento, visualização, etc.

Opção independente de plataforma dehardware

Compete com DirectX (Direct3D)Aprender conceitos de CG

An Interactive Introduction to OpenGLProgramming

SIGGRAPH 2001 - Los Angeles 7

13Marcelo Walter - UFPE

OpenGL como Sintetizador deImagens (Renderizador)

Primitivas geométricas• pontos, linhas e polígonos

Primitivas de ImagensRenderização depende do ESTADO atual

• cor, tipo de linha, escala, etc

• As variáveis de controle têm valores default

Não gerencia eventos de controle (mouse,exibição, teclado, etc)

14Marcelo Walter - UFPE

Formato dos Comandos emOpenGL

glVertex3fv( v )

Número decomponentes

2 - (x,y) 3 - (x,y,z)4 - (x,y,z,w)

Tipo de Dadob - byteub - unsigned bytes - shortus - unsigned shorti - intui - unsigned intf - floatd - double

Vector

omit “v” forscalar form

glVertex2f( x, y )

An Interactive Introduction to OpenGLProgramming

SIGGRAPH 2001 - Los Angeles 8

15Marcelo Walter - UFPE

Primitivas Geométricas de OpenGL

Todas primitivas geométricas são especificadas porvértices

GL_QUAD_STRIP

GL_POLYGON

GL_TRIANGLE_STRIPGL_TRIANGLE_FAN

GL_POINTSGL_LINES

GL_LINE_LOOPGL_LINE_STRIP

GL_TRIANGLES

GL_QUADS

16Marcelo Walter - UFPE

Exemplo Simples

void desenhaRhombus( GLfloat color[] ){

glBegin( GL_QUADS ); glColor3fv( color ); glVertex2f( 0.0, 0.0 ); glVertex2f( 1.0, 0.0 ); glVertex2f( 1.5, 1.118 ); glVertex2f( 0.5, 1.118 ); glEnd();

}

An Interactive Introduction to OpenGLProgramming

SIGGRAPH 2001 - Los Angeles 9

17Marcelo Walter - UFPE

Pipeline deVisualização Modeling

Transformation

ViewingTransformation

ProjectionTransformation

Lighting

3D Geometric Primitives

Image

Clipping

ScanConversion

1

2

3

18Marcelo Walter - UFPE

Transformações em OpenGL

ModelagemVisualização

• Orientação da câmera

• Projeção

AnimaçãoMapeamento para a tela

An Interactive Introduction to OpenGLProgramming

SIGGRAPH 2001 - Los Angeles 10

19Marcelo Walter - UFPE

Analogia com Câmera

3D é como tirar fotografias (muitas!)

câmera

tripé modelo

volumede visualização

20Marcelo Walter - UFPE

Analogia com Câmera eTransformações

Transformações de Projeção• ajusta a lente da câmera

Transformações de Visualização• definem posição e orientação do volume de visualização no

universo

Transformações de Modelagem• movem o modelo

Transformações de Viewport• aumentam ou diminuem o tamanho da fotografia

An Interactive Introduction to OpenGLProgramming

SIGGRAPH 2001 - Los Angeles 11

21Marcelo Walter - UFPE

APIs Relacionadas com OpenGL

AGL, GLX, WGL• “cola” entre OpenGL e o sistema de janelas

GLU (OpenGL Utility Library)GLUT (Graphics Library Utility Toolkit)

22Marcelo Walter - UFPE

GLU (Graphics Utility Library)

Conjunto de rotinas utilizadas freqüentemente• Construídas a partir de comandos OpenGL

Rotinas para:• Manipulação de projeções

• Desenho de superfícies quádricas

• NURBS

• Manipulação de superfícies poligonais

An Interactive Introduction to OpenGLProgramming

SIGGRAPH 2001 - Los Angeles 12

23Marcelo Walter - UFPE

GLUT

Biblioteca de software que se integra comOpenGL (autor: Mark J. Kilgard - SGI)

Habilita acesso aos eventos do sistemaoperacional necessários em programasinterativos• mouse, teclado, display, etc.

Utilizada nos livros que ensinam OpenGL eCG com OpenGL

24Marcelo Walter - UFPE

Filosofia de Projeto de GLUT

Fácil de ProgramarIndependente do sistema de janelas nativoProgramas de tamanho pequeno e médioNão apresenta muitos recursos de interface

(apenas menus)Programação orientada a eventos

An Interactive Introduction to OpenGLProgramming

SIGGRAPH 2001 - Los Angeles 13

25Marcelo Walter - UFPE

Programação Interativa

Programas gráficos são na maioria dos casosinterativos• Usuário controla a execução do programa

Controle é executado via dispositivos deentrada (mouse, teclado, etc.)

2 maneiras básicas para implementação• Amostragem

• Eventos

26Marcelo Walter - UFPE

Eventos

Um gerenciador monitora embackground a ocorrência de eventos eos coloca numa fila de eventos

Evento: mudança no estado dodispositivo causada pela ação dousuário

Programa principal, à sua conveniência,verifica a fila de eventos

An Interactive Introduction to OpenGLProgramming

SIGGRAPH 2001 - Los Angeles 14

27Marcelo Walter - UFPE

Primeiro evento da fila é removidoControle da execução é transferido para

execução de uma rotina associada aoevento

Se a fila estiver vazia, programaprincipal segue execução (rotina idle)

Exemplos de eventos: click do mouse,tecla pressionada, janelaredimensionada, etc.

28Marcelo Walter - UFPE

Gerenciadorde

Dispositivos

Programa

Aplicativo

Tecla Q Click botão direito mouse Tecla X Movimento 30 pixels p/ direita do mouse

FILA DE EVENTOS

An Interactive Introduction to OpenGLProgramming

SIGGRAPH 2001 - Los Angeles 15

29Marcelo Walter - UFPE

Rotinas

Iniciam com prefixo glut(0,0) canto superior esquerdo da janelaIncluir diretiva #include <GL/glut.h>Inicialização

•glutInit( int *argc, char **argc)•glutInitWindowPosition•glutInitWindowSize

30Marcelo Walter - UFPE

Processamento de Eventos•void glutMainLoop( void )

Gerenciamento de janelas•int glutCreateWindow( char *name )•void glutPostRedisplay( void )

Registro de rotinas de callback•glutDisplayFunc•glutReshapeFunc•glutKeyboardFunc•glutMouseFunc

Objetos Pré-definidos•glutSolidSphere, glutWireCube, glutSolidTeapot

An Interactive Introduction to OpenGLProgramming

SIGGRAPH 2001 - Los Angeles 16

31Marcelo Walter - UFPE

Estrutura de um Programa

Configura e cria a janelaInitializa estado de OpenGLRegistra as callback functions de GLUT

•renderização•redimensionamento•entrada: teclado, mouse, etc.

Chama laço principal de processamento

32Marcelo Walter - UFPE

Programa Exemplo

int main( int argc, char** argv ){ glutInit( &argc, argv);glutInitDisplayMode( GLUT_RGB | GLUT_SINGLE);

initOpenGL();

initGLUT();

glutMainLoop();return 1;

}

An Interactive Introduction to OpenGLProgramming

SIGGRAPH 2001 - Los Angeles 17

33Marcelo Walter - UFPE

Inicialização OpenGL

void initOpenGL( void ){ /* Cor default fundo preta */ glClearColor( 0, 0, 0, 0 ); glMatrixMode( GL_MODELVIEW ); glLoadIdentity(); glMatrixMode( GL_PROJECTION ); glLoadIdentity(); /* Cor default para objetos */ glColor3f( 1.0, 0.0, 0.0 );}

34Marcelo Walter - UFPE

Inicialização GLUT

void initGLUT( void ){ glutInitWindowPosition( 200, 100 ); glutCreateWindow( "Exemplo Simples 1" );

/* Registra as rotinas de CallBack */ glutDisplayFunc( desenhaCB ); glutKeyboardFunc( tecladoCB ); glutReshapeFunc( redesenhaCB ); glutMouseFunc( mouseCB );}

An Interactive Introduction to OpenGLProgramming

SIGGRAPH 2001 - Los Angeles 18

35Marcelo Walter - UFPE

Callback para RenderizaçãoTodos desenhos para a tela ficam nesta rotina

glutDisplayFunc( desenhaCB );void desenhaCB( void ){ /* Limpa buffer de cor */

glClear ( GL_COLOR_BUFFER_BIT );glMatrixMode( GL_MODELVIEW );glBegin(GL_POLYGON);

glVertex2i( 200, 200 );glVertex2i( 200, 150 );glVertex2i( 150, 150 );glVertex2i( 150, 200 );

glEnd();glFlush();

}

36Marcelo Walter - UFPE

Callback de Teclado

glutKeyboardFunc( tecladoCB );void tecladoCB( unsigned char tecla, int x, int y ){ switch( tecla ) {case 'q': /* Encerra o programa */case 'Q':

exit( 0 );default:

printf("Opcao nao definida!\n");}

}

An Interactive Introduction to OpenGLProgramming

SIGGRAPH 2001 - Los Angeles 19

37Marcelo Walter - UFPE

Callback de Mouse

glutMouseFunc( mouseCB );void mouseCB( int botao, int estado, int x, int y ){if ( botao == GLUT_LEFT_BUTTON )

glColor3ub( (char) (rand()%256), (char) (rand()%256),

(char) (rand()%256) );

glutPostRedisplay();

}

38Marcelo Walter - UFPE

Callback de Redimensionamento

glutReshapeFunc( redesenhaCB );void redesenhaCB( int w, int h ){

glViewport( 0, 0, w, h );

glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho( 0, (GLfloat) w, 0, (GLfloat) h , -1.0, 1.0

);

}

An Interactive Introduction to OpenGLProgramming

SIGGRAPH 2001 - Los Angeles 20

Marcelo Walter - UFPE

Compilar e executar primeiroexemplo

http://www.cin.ufpe.br/~marcelow

Ensino -> Processamento Gráfico -> GLUT

Marcelo Walter - UFPE

Fazer os exercícios do final dapágina

An Interactive Introduction to OpenGLProgramming

SIGGRAPH 2001 - Los Angeles 21

Marcelo Walter - UFPE

Compilar e executar segundoexemplo

http://www.cin.ufpe.br/~marcelow/Marcelow/cubo.c.html