44
Introdução a OpenGL Renato Rodrigues Oliveira da Silva Danilo Medeiros Eler Adaptado do material de Marcela X. Ribeiro Maria Cristina F. de Oliveira Rosane Minghim

Introdução a OpenGL - USPwiki.icmc.usp.br/images/3/36/Rosane_CG_Pos_Introducao_OpenGL.pdf · // código seguro. void drawDot(GLint x, GLint y) {glBegin(GL_POINTS); glVertex2i(x,

  • Upload
    others

  • View
    22

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Introdução a OpenGL - USPwiki.icmc.usp.br/images/3/36/Rosane_CG_Pos_Introducao_OpenGL.pdf · // código seguro. void drawDot(GLint x, GLint y) {glBegin(GL_POINTS); glVertex2i(x,

Introdução a OpenGL

Renato Rodrigues Oliveira da SilvaDanilo Medeiros Eler

Adaptado do material de

Marcela X. Ribeiro

Maria Cristina F. de Oliveira

Rosane Minghim

Page 2: Introdução a OpenGL - USPwiki.icmc.usp.br/images/3/36/Rosane_CG_Pos_Introducao_OpenGL.pdf · // código seguro. void drawDot(GLint x, GLint y) {glBegin(GL_POINTS); glVertex2i(x,

2

Sumário

IntroduçãoNúcleo OpenGL, GLU, GLUTAmbiente 2DAmbiente 3DTratamento de Eventos

Page 3: Introdução a OpenGL - USPwiki.icmc.usp.br/images/3/36/Rosane_CG_Pos_Introducao_OpenGL.pdf · // código seguro. void drawDot(GLint x, GLint y) {glBegin(GL_POINTS); glVertex2i(x,

3

Introdução – O que é OpenGL?

OpenGL – Open Graphics LibraryÉ uma API (Application Program Interface) para o aplicações gráficasAbstrai a complexidade do hardware

Page 4: Introdução a OpenGL - USPwiki.icmc.usp.br/images/3/36/Rosane_CG_Pos_Introducao_OpenGL.pdf · // código seguro. void drawDot(GLint x, GLint y) {glBegin(GL_POINTS); glVertex2i(x,

4

Introdução - Histórico

Especificação gerenciada por um consórcio independente formado em 1992

Constituído por empresas líderes na área: NVIDIA, 3Dlabs, Apple Computer...Responsável pela aprovação de novas funcionalidades, versões e extensões da OpenGLhttp://www.opengl.org

Page 5: Introdução a OpenGL - USPwiki.icmc.usp.br/images/3/36/Rosane_CG_Pos_Introducao_OpenGL.pdf · // código seguro. void drawDot(GLint x, GLint y) {glBegin(GL_POINTS); glVertex2i(x,

5

Núcleo OpenGL

Pipeline

Armazenamentoem memória dos

comandos OpenGL

Processamento dedados geométricos

e imagens

RasterizationOperações de

fragmento

Chamadas a funções da API OpenGL

Frame Buffer

Page 6: Introdução a OpenGL - USPwiki.icmc.usp.br/images/3/36/Rosane_CG_Pos_Introducao_OpenGL.pdf · // código seguro. void drawDot(GLint x, GLint y) {glBegin(GL_POINTS); glVertex2i(x,

6

Exemplo – Primitivas Geométricas

Triângulos

glBegin(GL_TRIANGLES);

glVertex2f(x1, y1, z1);

glVertex3f(x2, y2, z2);

glVertex3f(x3, y3, z3);

glEnd();

Page 7: Introdução a OpenGL - USPwiki.icmc.usp.br/images/3/36/Rosane_CG_Pos_Introducao_OpenGL.pdf · // código seguro. void drawDot(GLint x, GLint y) {glBegin(GL_POINTS); glVertex2i(x,

7

Exemplo – Primitivas Geométricas

Quadriláteros

glBegin(GL_QUADS);

glVertex3f(x1, y1, z1);

glVertex3f(x2, y2, z2);

glVertex3f(x3, y3, z3);

glVertex3f(x4, y4, z4);

glEnd();

Page 8: Introdução a OpenGL - USPwiki.icmc.usp.br/images/3/36/Rosane_CG_Pos_Introducao_OpenGL.pdf · // código seguro. void drawDot(GLint x, GLint y) {glBegin(GL_POINTS); glVertex2i(x,

8

Exemplo – Primitivas Geométricas

exemploPrimitivasGeometricas.c

Page 9: Introdução a OpenGL - USPwiki.icmc.usp.br/images/3/36/Rosane_CG_Pos_Introducao_OpenGL.pdf · // código seguro. void drawDot(GLint x, GLint y) {glBegin(GL_POINTS); glVertex2i(x,

9

OpenGL: Máquina de Estados

OpenGL rastreia diversas variáveis de estado

Tamanho atual de um ponto, cor de fundo da janela, cor do desenhoO valor corrente permanece ativo até que seja alterado

Tamanho de ponto: glPointSize(3.0)Cor de traçado: glColor3f(red, green, blue)Cor de fundo: glClearColor(r, g, b, alpha)...

Page 10: Introdução a OpenGL - USPwiki.icmc.usp.br/images/3/36/Rosane_CG_Pos_Introducao_OpenGL.pdf · // código seguro. void drawDot(GLint x, GLint y) {glBegin(GL_POINTS); glVertex2i(x,

10

Exemplo OpenGL

exemploEstadosOpenGL.c

Page 11: Introdução a OpenGL - USPwiki.icmc.usp.br/images/3/36/Rosane_CG_Pos_Introducao_OpenGL.pdf · // código seguro. void drawDot(GLint x, GLint y) {glBegin(GL_POINTS); glVertex2i(x,

11

Padronização dos nomes das funções

Convenção:<Prefixo Biblioteca> <Comando Raiz>

<Contador de Argumentos> <Tipo Argumentos>

Visa padronizar e facilitar a utilizaçãoPossibilita identificar a qual biblioteca a função pertence, quantos argumentos possui e quais são os tipos dos argumentos.

Page 12: Introdução a OpenGL - USPwiki.icmc.usp.br/images/3/36/Rosane_CG_Pos_Introducao_OpenGL.pdf · // código seguro. void drawDot(GLint x, GLint y) {glBegin(GL_POINTS); glVertex2i(x,

12

Exemplo

void glColor3f(GLfloat red, GLfloat green,

GLfloat blue)

//gl – É o prefixo da biblioteca GL

//Color – comando objetivo da função

//3 – contador para o número de argumentos

//f – indica o tipo dos argumentos

Padronização dos nomes das funções

Page 13: Introdução a OpenGL - USPwiki.icmc.usp.br/images/3/36/Rosane_CG_Pos_Introducao_OpenGL.pdf · // código seguro. void drawDot(GLint x, GLint y) {glBegin(GL_POINTS); glVertex2i(x,

13

Tipos de Dados

Tipos de dados próprios para OpenGLTornam o programa-fonte portável

............

GLfloatfloatfloat 32 bitsf

GLintint/longinteiro 32 bitsi

GLshortshortinteiro 16 bitss

GLbytesigned charinteiro 8 bitsb

nometipo CTiposufixo

Page 14: Introdução a OpenGL - USPwiki.icmc.usp.br/images/3/36/Rosane_CG_Pos_Introducao_OpenGL.pdf · // código seguro. void drawDot(GLint x, GLint y) {glBegin(GL_POINTS); glVertex2i(x,

14

Tipos de Dados

//Perigo!!: sistema passa int...void drawDot(int x, int y) { glBegin(GL_POINTS); glVertex2i(x, y); // função “espera” inteiro 32 bits glEnd();}

// código seguro. void drawDot(GLint x, GLint y) { glBegin(GL_POINTS); glVertex2i(x, y); glEnd();}

Page 15: Introdução a OpenGL - USPwiki.icmc.usp.br/images/3/36/Rosane_CG_Pos_Introducao_OpenGL.pdf · // código seguro. void drawDot(GLint x, GLint y) {glBegin(GL_POINTS); glVertex2i(x,

15

GLU – OpenGL Utility Library

Instalada junto com a OpenGLContém uma série de funções que encapsulam comandos OpenGL de mais baixo nível

Definição de matrizes para projeçãoDesenho de superfícies quádricasCurvas e superfícies NURBS

Page 16: Introdução a OpenGL - USPwiki.icmc.usp.br/images/3/36/Rosane_CG_Pos_Introducao_OpenGL.pdf · // código seguro. void drawDot(GLint x, GLint y) {glBegin(GL_POINTS); glVertex2i(x,

16

GLUT – OpenGL Utility Toolkit

Por ser portável, a OpenGL não possui funções para gerenciamento de janelas, tratamento de eventos ou manipulação de arquivos

Podem ser utilizadas as funções específicas de cada plataformaOu usar uma biblioteca independente (GLUT, FLTK, wxWidgets, por exemplo)

Page 17: Introdução a OpenGL - USPwiki.icmc.usp.br/images/3/36/Rosane_CG_Pos_Introducao_OpenGL.pdf · // código seguro. void drawDot(GLint x, GLint y) {glBegin(GL_POINTS); glVertex2i(x,

17

GLUT – OpenGL Utility Toolkit

Biblioteca que inclui alguns elementos de interface gráfica com o usuário

Criação de janelas e menus pop-upGerenciamento de eventos de mouse e teclado

Independente de plataforma

Page 18: Introdução a OpenGL - USPwiki.icmc.usp.br/images/3/36/Rosane_CG_Pos_Introducao_OpenGL.pdf · // código seguro. void drawDot(GLint x, GLint y) {glBegin(GL_POINTS); glVertex2i(x,

18

GLUT - Inicialização

void glutInitDisplayMode(parâmetros)GLUT_DOUBLE: Define que a GLUT usará dois buffers de corGLUT_SINGLE: Define apenas um buffer de corGLUT_DEPTH: Define o uso de um buffer de profundidade (z-buffer), para remoção de superfícies escondidasGLUT_RGB: Define que as cores são especificadas por componentes RGB

Page 19: Introdução a OpenGL - USPwiki.icmc.usp.br/images/3/36/Rosane_CG_Pos_Introducao_OpenGL.pdf · // código seguro. void drawDot(GLint x, GLint y) {glBegin(GL_POINTS); glVertex2i(x,

19

GLUT - Inicialização

void glutInitWindowPosition(int x, int y)Define a posição inicial da janela. Os parâmetros representam o canto superior esquerdo

void glutInitWindowSize(int width, int height)Define a largura e altura da janela

int glutCreateWindow(char *string)Cria a janela e define o seu título

Page 20: Introdução a OpenGL - USPwiki.icmc.usp.br/images/3/36/Rosane_CG_Pos_Introducao_OpenGL.pdf · // código seguro. void drawDot(GLint x, GLint y) {glBegin(GL_POINTS); glVertex2i(x,

20

GLUT - Inicialização

Exemploint main(int argc, char *argv) {

glutInit(&argc, argv);

glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);

glutInitWindowSize(400, 400);

glutCreateWindow(“Primeiro

Programa”);

glutMainLoop();

}

Page 21: Introdução a OpenGL - USPwiki.icmc.usp.br/images/3/36/Rosane_CG_Pos_Introducao_OpenGL.pdf · // código seguro. void drawDot(GLint x, GLint y) {glBegin(GL_POINTS); glVertex2i(x,

21

GLUT - Exemplo

exemploEstadosOpenGL.c

Page 22: Introdução a OpenGL - USPwiki.icmc.usp.br/images/3/36/Rosane_CG_Pos_Introducao_OpenGL.pdf · // código seguro. void drawDot(GLint x, GLint y) {glBegin(GL_POINTS); glVertex2i(x,

22

Ambiente de Trabalho

Page 23: Introdução a OpenGL - USPwiki.icmc.usp.br/images/3/36/Rosane_CG_Pos_Introducao_OpenGL.pdf · // código seguro. void drawDot(GLint x, GLint y) {glBegin(GL_POINTS); glVertex2i(x,

23

Ambiente de Trabalho

Em OpenGL os objetos são representados no Sistema de Referência do Universo (SRU)

Plano cartesiano bi ou tridimensional, com eixos se interceptando na origem

Todos os comandos e modelos são definidos em relação a este sistema de referência

Page 24: Introdução a OpenGL - USPwiki.icmc.usp.br/images/3/36/Rosane_CG_Pos_Introducao_OpenGL.pdf · // código seguro. void drawDot(GLint x, GLint y) {glBegin(GL_POINTS); glVertex2i(x,

24

Ambiente de Trabalho

No monitor do computador é adotado o SRT (Sistema de Referência da Tela)

No SRT a origem fica no canto superior esquerdo do monitor

Page 25: Introdução a OpenGL - USPwiki.icmc.usp.br/images/3/36/Rosane_CG_Pos_Introducao_OpenGL.pdf · // código seguro. void drawDot(GLint x, GLint y) {glBegin(GL_POINTS); glVertex2i(x,

25

Ambiente de Trabalho - 2D

No caso 2D, é necessário definir a porção o universo que desejamos mapear na tela.

Essa área é chamada de janela de seleção, ou window

void gluOrtho2D(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top)

Page 26: Introdução a OpenGL - USPwiki.icmc.usp.br/images/3/36/Rosane_CG_Pos_Introducao_OpenGL.pdf · // código seguro. void drawDot(GLint x, GLint y) {glBegin(GL_POINTS); glVertex2i(x,

26

Ambiente de Trabalho - 2D

exemploPrimitivasGeometricas.c

Page 27: Introdução a OpenGL - USPwiki.icmc.usp.br/images/3/36/Rosane_CG_Pos_Introducao_OpenGL.pdf · // código seguro. void drawDot(GLint x, GLint y) {glBegin(GL_POINTS); glVertex2i(x,

27

Ambiente de Trabalho - 3D

observador ou câmera

projeção

Page 28: Introdução a OpenGL - USPwiki.icmc.usp.br/images/3/36/Rosane_CG_Pos_Introducao_OpenGL.pdf · // código seguro. void drawDot(GLint x, GLint y) {glBegin(GL_POINTS); glVertex2i(x,

28

Ambiente de Trabalho - 3D

A GLU oferece a seguinte função para posicionar e orientar a câmera

void gluLookAt(GLdouble obsx, obsy, obsz,

alvox, alvoy, alvoz,

upx, upy, upz)//obs*: define a posição da câmera

//alvo*: ponto para onde o observador está olhando

//up*: vetor que indica a 'vertical' da câmera

Page 29: Introdução a OpenGL - USPwiki.icmc.usp.br/images/3/36/Rosane_CG_Pos_Introducao_OpenGL.pdf · // código seguro. void drawDot(GLint x, GLint y) {glBegin(GL_POINTS); glVertex2i(x,

29

Projeção Perspectiva

As projetantes emanam de um único ponto, a uma distância finita do plano de projeção

Page 30: Introdução a OpenGL - USPwiki.icmc.usp.br/images/3/36/Rosane_CG_Pos_Introducao_OpenGL.pdf · // código seguro. void drawDot(GLint x, GLint y) {glBegin(GL_POINTS); glVertex2i(x,

30

Projeção Perspectiva

void gluPerspective(GLdouble fovy, aspect,

zNear, zFar)

//fovy: ângulo de abertura da câmera em y

//aspect: área de visualização em x

//zNear: distância do observador ao plano de corte frontal

//zFar: distância do observador ao plano de corte traseiro

Page 31: Introdução a OpenGL - USPwiki.icmc.usp.br/images/3/36/Rosane_CG_Pos_Introducao_OpenGL.pdf · // código seguro. void drawDot(GLint x, GLint y) {glBegin(GL_POINTS); glVertex2i(x,

31

Projeção Perspectiva

Exemplovoid Desenha(){ glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(60, 1.0f, 0.5, 500); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); gluLookAt(40, 60, 100, 0, 0, 0, 0, 1, 0); glClearColor(1.0f, 1.0f, 1.0f, 1.0f); glClear(GL_COLOR_BUFFER_BIT); glColor3f(0.0f, 0.0f, 1.0f); glutWireCube(50); glFlush(); }

Page 32: Introdução a OpenGL - USPwiki.icmc.usp.br/images/3/36/Rosane_CG_Pos_Introducao_OpenGL.pdf · // código seguro. void drawDot(GLint x, GLint y) {glBegin(GL_POINTS); glVertex2i(x,

32

Projeção Paralela

As projetantes são paralelas entre siNão há alteração nas medidas do objeto

Page 33: Introdução a OpenGL - USPwiki.icmc.usp.br/images/3/36/Rosane_CG_Pos_Introducao_OpenGL.pdf · // código seguro. void drawDot(GLint x, GLint y) {glBegin(GL_POINTS); glVertex2i(x,

33

Projeção Paralela

void gluOrtho(GLdouble left, right,

bottom, top, near, far)/*Os parâmetros definem os limites mínimo e

máximo da janela de projeção em x, y e z.*/

Page 34: Introdução a OpenGL - USPwiki.icmc.usp.br/images/3/36/Rosane_CG_Pos_Introducao_OpenGL.pdf · // código seguro. void drawDot(GLint x, GLint y) {glBegin(GL_POINTS); glVertex2i(x,

34

Projeção Paralela

Exemplovoid Desenha(){ glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(-65.0, 65.0, -65.0, 65.0, -400.0, 400.0); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); gluLookAt(40,60,100, 0,0,0, 0,1,0); glClearColor(1.0f, 1.0f, 1.0f, 1.0f); glClear(GL_COLOR_BUFFER_BIT); glColor3f(0.0f, 0.0f, 0.0f); glutWireCube(50); glFlush(); }

Page 35: Introdução a OpenGL - USPwiki.icmc.usp.br/images/3/36/Rosane_CG_Pos_Introducao_OpenGL.pdf · // código seguro. void drawDot(GLint x, GLint y) {glBegin(GL_POINTS); glVertex2i(x,

35

GLUTTratamento de Eventos

Page 36: Introdução a OpenGL - USPwiki.icmc.usp.br/images/3/36/Rosane_CG_Pos_Introducao_OpenGL.pdf · // código seguro. void drawDot(GLint x, GLint y) {glBegin(GL_POINTS); glVertex2i(x,

36

GLUT – Tratamento de eventos

Gerenciamento de eventos por meio de funções “callback”Quem chama a função para o tratamento de um evento não é o programador e sim a GLUTO programador define apenas a função a ser chamada, respeitando os parâmetros definidos pela GLUT

Page 37: Introdução a OpenGL - USPwiki.icmc.usp.br/images/3/36/Rosane_CG_Pos_Introducao_OpenGL.pdf · // código seguro. void drawDot(GLint x, GLint y) {glBegin(GL_POINTS); glVertex2i(x,

37

GLUT – Tratamento de eventos

void glutDisplayFunc( Desenha)Define que a função Desenha será a responsável por redesenhar a janela, sempre que necessárioA função deve ter o seguinte protótipo

void <nomeFunção> (void)

Page 38: Introdução a OpenGL - USPwiki.icmc.usp.br/images/3/36/Rosane_CG_Pos_Introducao_OpenGL.pdf · // código seguro. void drawDot(GLint x, GLint y) {glBegin(GL_POINTS); glVertex2i(x,

38

GLUT – Tratamento de eventos

void glutReshapeFunc (AlteraTamanhoJanela)Define a função que será responsável por tratar o evento referente ao redimensionamento da janelaDeve ter o protótipo

void <nomeFunção> (int largura, int altura)

Page 39: Introdução a OpenGL - USPwiki.icmc.usp.br/images/3/36/Rosane_CG_Pos_Introducao_OpenGL.pdf · // código seguro. void drawDot(GLint x, GLint y) {glBegin(GL_POINTS); glVertex2i(x,

39

GLUT – Tratamento de eventos

int main(int argc, char *argv[]) {

glutInit(&argc, argv);

glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);

glutInitWindowSize(400, 400);

glutCreateWindow(“Primeiro Programa”);

glutDisplayFunc(Desenha);

glutReshapeFunc(AlteraTamanhoJanela);

...

}

Page 40: Introdução a OpenGL - USPwiki.icmc.usp.br/images/3/36/Rosane_CG_Pos_Introducao_OpenGL.pdf · // código seguro. void drawDot(GLint x, GLint y) {glBegin(GL_POINTS); glVertex2i(x,

40

GLUT – Interação com o teclado

void glutKeyboardFunc(Teclado)Trata o pressionamento de teclas comuns

void <nomeFunção> (unsigned char tecla, int x, int y)

Tecla representa o código ASCII da tecla pressionadaOs parâmetros x e y representam as coordenadas do mouse quando o evento ocorreu

Page 41: Introdução a OpenGL - USPwiki.icmc.usp.br/images/3/36/Rosane_CG_Pos_Introducao_OpenGL.pdf · // código seguro. void drawDot(GLint x, GLint y) {glBegin(GL_POINTS); glVertex2i(x,

41

GLUT – Interação com o teclado

Exemplo

exemploTecladoOpenGL.c

Page 42: Introdução a OpenGL - USPwiki.icmc.usp.br/images/3/36/Rosane_CG_Pos_Introducao_OpenGL.pdf · // código seguro. void drawDot(GLint x, GLint y) {glBegin(GL_POINTS); glVertex2i(x,

42

GLUT – Interação com o mouse

void glutMouseFunc(GerenciaMouse)Trata eventos de pressionamento e liberação de botões do mouse

void <nomeFunção> (int botao, int estado, int x, int y)

botão: GLUT_LEFT_BUTTON, GLUT_MIDDLE_BUTTON, GLUT_RIGHT_BUTTON

estado: GLUT_UP, GLUT_DOWN

Page 43: Introdução a OpenGL - USPwiki.icmc.usp.br/images/3/36/Rosane_CG_Pos_Introducao_OpenGL.pdf · // código seguro. void drawDot(GLint x, GLint y) {glBegin(GL_POINTS); glVertex2i(x,

43

GLUT – Interação com o mouse

Ex. posicionar pontos com o mouse

exemploMouseOpenGL.c

Page 44: Introdução a OpenGL - USPwiki.icmc.usp.br/images/3/36/Rosane_CG_Pos_Introducao_OpenGL.pdf · // código seguro. void drawDot(GLint x, GLint y) {glBegin(GL_POINTS); glVertex2i(x,

44

Bibliografia

Cohen, M. , Manssour, I. H, OpenGL – Uma Abordagem Prática e Objetiva