Silvânia de Assis Guilherme de Melo Moisés Tadeu Cardoso Isabela de Oliveira Glauber Ataíde...

36
Silvânia de Assis Guilherme de Melo Moisés Tadeu Cardoso Isabela de Oliveira Glauber Ataíde Henrique de Araujo 1

Transcript of Silvânia de Assis Guilherme de Melo Moisés Tadeu Cardoso Isabela de Oliveira Glauber Ataíde...

Page 1: Silvânia de Assis Guilherme de Melo Moisés Tadeu Cardoso Isabela de Oliveira Glauber Ataíde Henrique de Araujo 1.

Silvânia de AssisGuilherme de Melo Moisés Tadeu CardosoIsabela de OliveiraGlauber AtaídeHenrique de Araujo

1

Page 2: Silvânia de Assis Guilherme de Melo Moisés Tadeu Cardoso Isabela de Oliveira Glauber Ataíde Henrique de Araujo 1.

OpenGL e uma biblioteca de funções para desenvolver aplicações gráficas em 2D e

3D, portáteis e interativas, foi desenvolvida em 1992 pela Silicon Graphics .

O OpenGL foi desenvolvido em C, mas e integrável com outras linguagens como

Java, Python e C++ .

2

Page 3: Silvânia de Assis Guilherme de Melo Moisés Tadeu Cardoso Isabela de Oliveira Glauber Ataíde Henrique de Araujo 1.

A utilização do OpenGL pela industria de desenvolvimento de jogos e muito intensa, hoje muitos jogos utilizama biblioteca para seu desenvolvimento, entre eles podemos citar:

Half Life, Medal of Honor, NeverWinter Nights, Unreal Tournament, Alone in the Dark, entre inúmeros outros títulos.

3

Page 4: Silvânia de Assis Guilherme de Melo Moisés Tadeu Cardoso Isabela de Oliveira Glauber Ataíde Henrique de Araujo 1.

As rotinas de exibição de objetos de OpenGL são sempre iguais. O que difere o uso de OpenGl em uma plataforma UNIX ou PC, ou em ferramentas como Delphi, C Builder, Borland C, Visual C ou Visual Basic é a forma de inicializar e integrar a biblioteca OpenGL em cada linguagem e a forma de definir em que janela(ou parte dela) a imagem será exibida.

4

Page 5: Silvânia de Assis Guilherme de Melo Moisés Tadeu Cardoso Isabela de Oliveira Glauber Ataíde Henrique de Araujo 1.

A biblioteca gráfica OpenGL é capaz de trabalhar com 3 tipos de LUZ:

Ambiente, Difusa Especular.

5

Page 6: Silvânia de Assis Guilherme de Melo Moisés Tadeu Cardoso Isabela de Oliveira Glauber Ataíde Henrique de Araujo 1.

Observe como a iluminação é importante para a representação de Objetos 3D:

6

Page 7: Silvânia de Assis Guilherme de Melo Moisés Tadeu Cardoso Isabela de Oliveira Glauber Ataíde Henrique de Araujo 1.

Luz Ambiente Um objeto que não esteja diretamente

iluminado é ainda visível por causa da luz refletida a partir doutras superfícies. Modelada por uma simples fonte de luz ambiente.Em vez de calcular as reflexões nas superfícies dos objetos, especifica-se uma luz ambiente constante para todas as superfíciesDefinida somente pelas intensidades de luz ambiente RGB

7

Page 8: Silvânia de Assis Guilherme de Melo Moisés Tadeu Cardoso Isabela de Oliveira Glauber Ataíde Henrique de Araujo 1.

Exemplo Completo de Luz Difusa:   // As funções "DefineLuz", "DesenhaCubo”

procedure DefineLuz; const // Define a cor da luz ambiente.     LuzAmbient : Array[0..3] of GLfloat = (1.0, 1.0, 1.0, 1.0); begin // Habilita o uso de iluminação     glEnable(GL_LIGHTING); // Ativa o uso da luz ambiente     glLightModelfv(GL_LIGHT_MODEL_AMBIENT, @LuzAmbient); // Ativa o "Color Tracking"     glEnable(GL_COLOR_MATERIAL); end;

procedure DesenhaCubo; begin

glColor3f(0,0,0.5); // Define a de contrasteglBegin(GL_POLYGON); // face 1

glNormal3f(0,0,1); glVertex3f(10.0, 10.0, 10.0); glVertex3f(-10.0, 10.0, 10.0); glVertex3f(-10.0, -10.0, 10.0); glVertex3f(10.0, -10.0, 10.0);

glEnd; glColor3f(0.5,0.5,0); // Define a cor amarela glBegin(GL_POLYGON); // face 2

glNormal3f(0,0,-1); glVertex3f(10.0, 10.0, -10.0); glVertex3f(10.0, -10.0, -10.0); glVertex3f(-10.0, -10.0, -10.0); glVertex3f(-10.0, 10.0, -10.0);

glEnd;

8

Page 9: Silvânia de Assis Guilherme de Melo Moisés Tadeu Cardoso Isabela de Oliveira Glauber Ataíde Henrique de Araujo 1.

Luz difusa responsável pelo efeito de "degradé" nos objetos;

a cor da luz difusa(r,g,b); a posição da luz(x,y,z). Os passos para fazer isso são: definir cor da luz Ambiente, posição e a cor da Luz Difusa, através de constantes

9

Page 10: Silvânia de Assis Guilherme de Melo Moisés Tadeu Cardoso Isabela de Oliveira Glauber Ataíde Henrique de Araujo 1.

const   LuzAmbiente : Array[0..3] of GLfloat = (0.5, 0.5, 0.5, 1.0);

// Cor da Luz Difusa LuzDifusa : Array[0..3] of GLfloat = (0.8, 0.8, 0.8, 1.0); // Posição da Luz Difusa PosicaoLuz : Array[0..3] of GLfloat = (30.0, 30.0, 0.0, 1.0);

Ativar o uso da luz ambiente e o "Color Tracking"(conforme exemplo anterior)

// Habilita o uso de iluminação

    glEnable(GL_LIGHTING);

// Ativa o uso da luz ambiente

    glLightModelfv(GL_LIGHT_MODEL_AMBIENT, @LuzAmbient);

// Ativa o "Color Tracking"

    glEnable(GL_COLOR_MATERIAL); Definir e ativar uma luz Difusa

Em OpenGl podemos ter até 8 pontos de Luz. Cada um deles designado por uma constante(GL_LIGHT0,

GL_LIGHT1, GL_LIGHT2, ...). NoExemplo a seguir definimos as características da luz de número 0(zero).

   glLightfv(GL_LIGHT0, GL_AMBIENT, @LuzAmbiente);    glLightfv(GL_LIGHT0, GL_DIFFUSE, @LuzDifusa );    glLightfv(GL_LIGHT0, GL_POSITION,@PosicaoLuz );    glEnable(GL_LIGHT0);

// Exibe uma linha da posição da luz até (0,0,0)    glBegin(GL_LINES);    glVertex4fv(@PosicaoLuz);    glVertex3f(0,0,0);

10

Page 11: Silvânia de Assis Guilherme de Melo Moisés Tadeu Cardoso Isabela de Oliveira Glauber Ataíde Henrique de Araujo 1.

Uma luz do tipo Especular é a responsável pela geração de pontos de brilho no objeto; o brilho é da cor da luz; há um ponto a partir do qual ela é emitida; seu brilho é emitido indistintamente em todas as direções;

cada tipo de material(objeto) tem um grau de especularidade (que em outras

palavras define a capacidade de brilho do material). a posição da luz(x,y,z). a cor da luz difusa(r,g,b); a cor da luz especular(r,g,b); a cor especular do objeto(r,g,b); o capacidade de brilho do objeto, ou o grau de concentração do brilho(algo

como o grau de polimento do objeto);

11

Page 12: Silvânia de Assis Guilherme de Melo Moisés Tadeu Cardoso Isabela de Oliveira Glauber Ataíde Henrique de Araujo 1.

definir cor da luz Ambiente, a posição e a cor da Luz Difusa e da Luz especular, através de constantes const

LuzAmbiente : Array[0..3] of GLfloat = (0.5, 0.5, 0.5, 1.0); LuzDifusa : Array[0..3] of GLfloat = (0.4, 0.4, 0.4, 1.0); LuzEspecular: Array[0..3] of GLfloat = (1.0, 0.0, 1.0, 1.0); PosicaoLuz : Array[0..3] of GLfloat = (0.0, 20.0, 60.0, 1.0); Especularidade: Array[0..3] of GLfloat = (0.0, 0.0, 0.0, 1.0);

Ativar o uso da luz ambiente e o "Color Tracking"(conforme exemplo anterior) // Habilita o uso de iluminação     glEnable(GL_LIGHTING); // Ativa o uso da luz ambiente     glLightModelfv(GL_LIGHT_MODEL_AMBIENT, @LuzAmbient); // Ativa o "Color Tracking"     glEnable(GL_COLOR_MATERIAL);

Definir e ativar uma luz Especular // Define os parâmetros da Luz número Zero glLightfv(GL_LIGHT0, GL_AMBIENT, @LuzAmbiente); glLightfv(GL_LIGHT0, GL_DIFFUSE, @LuzDifusa ); glLightfv(GL_LIGHT0, GL_SPECULAR, @LuzEspecular ); glLightfv(GL_LIGHT0, GL_POSITION, @PosicaoLuz ); glEnable(GL_LIGHT0);

Definir a cor especular do obejto // Define a reflectancia do material glMaterialfv(GL_FRONT,GL_SPECULAR, @Especularidade);

Definir o grau de especularidade do objeto // Define a concentração do brilho. // Quanto maior o valor do Segundo parametro, mais concentrado será o brilho. // (Valores válidos: de 0 a 128)

glMateriali(GL_FRONT,GL_SHININESS,20);

12

Page 13: Silvânia de Assis Guilherme de Melo Moisés Tadeu Cardoso Isabela de Oliveira Glauber Ataíde Henrique de Araujo 1.

• Possui primitivas geométricas (pontos, linhas, polígonos e imagens) e operações para especificar os objetos geométricos a serem renderizados em duas ou três dimensões.

• Capaz de gerar imagens de alta qualidade.

• Independente de plataforma.

• Objetos complexos devem ser construídos a partir de primitivas geométricas simples.

13

Page 14: Silvânia de Assis Guilherme de Melo Moisés Tadeu Cardoso Isabela de Oliveira Glauber Ataíde Henrique de Araujo 1.

• Uma vez emitido um vértice (glVertex), este é desenhado com as propriedades (cor, material, normal, coordenadas de textura etc) registradas nas variáveis de estado correspondentes.

• Conclusão: Antes de emitir um vértice, assegurar-se que cor, material, normal e etc, têm o valor certo.

14

Page 15: Silvânia de Assis Guilherme de Melo Moisés Tadeu Cardoso Isabela de Oliveira Glauber Ataíde Henrique de Araujo 1.

Valor Significado

GL_POINTS Pontos individuais

GL_LINES Pares de vértices interpretados como segmentos de reta individuais.

GL_LINE_STRIP Serie de segmentos de reta conectados.

GL_LINE_LOOP Igual ao anterior. Ultimo vertice conectado a primeiro

GL_TRIANGLES Triplas de vértices interpretados como triângulos.

GL_TRIANGLE_STRIP Cadeia triângulos conectados.

GL_TRIANGLE_FAN Leque de triângulos conectados.

GL_QUADS Quadrupla de vértices interpretados como quadriláteros.

GL_QUAD_STRIP Cadeia de quadriláteros conectados.

GL_POLYGON Borda de um polígono convexo simples.

15

Page 16: Silvânia de Assis Guilherme de Melo Moisés Tadeu Cardoso Isabela de Oliveira Glauber Ataíde Henrique de Araujo 1.

16

Page 17: Silvânia de Assis Guilherme de Melo Moisés Tadeu Cardoso Isabela de Oliveira Glauber Ataíde Henrique de Araujo 1.

17

Page 18: Silvânia de Assis Guilherme de Melo Moisés Tadeu Cardoso Isabela de Oliveira Glauber Ataíde Henrique de Araujo 1.

18

Page 19: Silvânia de Assis Guilherme de Melo Moisés Tadeu Cardoso Isabela de Oliveira Glauber Ataíde Henrique de Araujo 1.

19

Page 20: Silvânia de Assis Guilherme de Melo Moisés Tadeu Cardoso Isabela de Oliveira Glauber Ataíde Henrique de Araujo 1.

20

Page 21: Silvânia de Assis Guilherme de Melo Moisés Tadeu Cardoso Isabela de Oliveira Glauber Ataíde Henrique de Araujo 1.

• Todos os comandos começam com o prefixo gl (Ex.: glClearColor).

• As palavras nos nome dos comandos começam com letras maiúsculas (Ex.: glColor()).

• O sufixo indica o número e o tipo dos argumentos (Ex.: glVertex2i(1,3)).

• As constantes começam com GL_ (Ex.: GL_COLOR_BUFFER_BIT).

21

Page 22: Silvânia de Assis Guilherme de Melo Moisés Tadeu Cardoso Isabela de Oliveira Glauber Ataíde Henrique de Araujo 1.

glVertex3fv( v )

Número deNúmero decomponentescomponentes2 - (x,y) 3 - (x,y,z)4 - (x,y,z,w)

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

vetorvetoromita o “v” qdo

coords dadas uma a uma

glVertex2f( x, y )

22

Page 23: Silvânia de Assis Guilherme de Melo Moisés Tadeu Cardoso Isabela de Oliveira Glauber Ataíde Henrique de Araujo 1.

• A OpenGL funciona como uma máquina de estados.

• Os estados correntes permanecem ativos até que sejam modificados.

• Exemplo: a cor de desenho corrente é aplicada a qualquer primitiva geométrica até que seja modificada.

23

Page 24: Silvânia de Assis Guilherme de Melo Moisés Tadeu Cardoso Isabela de Oliveira Glauber Ataíde Henrique de Araujo 1.

• Existem vários estados:

– Cor de desenho corrente.– Transformações de visualização e projeção.– Padrões de linhas e polígonos.– Modo de desenho dos polígonos.– Posição e característica das fontes de luz.– Propriedades dos materiais associados aos objetos.– etc.

24

Page 25: Silvânia de Assis Guilherme de Melo Moisés Tadeu Cardoso Isabela de Oliveira Glauber Ataíde Henrique de Araujo 1.

• Vários estados se referem a modos que estão habilitados ou desabilitados.

• Estes estados são modificados através dos comandos:

– glEnable() e glDisable().– Exemplo: glEnable(GL_LIGHTINING).

25

Page 26: Silvânia de Assis Guilherme de Melo Moisés Tadeu Cardoso Isabela de Oliveira Glauber Ataíde Henrique de Araujo 1.

• Alguns comandos para ler um estado:– glGetBooleanv(), glGetDoublev(), glGetFloatv(),

glGetIntegerv(), glPointerv() ou glIsEnabled().

• Comandos para salvar um estado:– glPushAttrib() e glPushClientAttrib().

• Comandos para restaurar um estado:– glPopAttrib() e glPopClientAttrib().

26

Page 27: Silvânia de Assis Guilherme de Melo Moisés Tadeu Cardoso Isabela de Oliveira Glauber Ataíde Henrique de Araujo 1.

• GLU (OpenGL Utility Library)– Parte do padrão OpenGL.– NURBS, trianguladores, quádricas, etc.

• AGL, GLX, WGL– Camadas entre o OpenGL os diversos sistemas de

janelas.

• GLUT (OpenGL Utility Toolkit)– API portátil de acesso aos sistemas de janelas.– Encapsula e esconde as camadas proprietárias.– Não é parte official do OpenGL.

27

Page 28: Silvânia de Assis Guilherme de Melo Moisés Tadeu Cardoso Isabela de Oliveira Glauber Ataíde Henrique de Araujo 1.

• Rendering – processo através do qual um computador gera imagens a partir de um modelo.

• Pixel – menor elemento visível que um dispositivo gráfico pode apresentar. Uma imagem é formada por vários pixels.

• Plano de bits – área de memória que armazena um bit de informação para cada pixel.

• Framebuffer – estrutura que armazena todas as informações necessárias para que o display gráfico possa controlar a intensidade da cor em cada pixel.

28

Page 29: Silvânia de Assis Guilherme de Melo Moisés Tadeu Cardoso Isabela de Oliveira Glauber Ataíde Henrique de Araujo 1.

PixelsPixels

VérticesVértices

Listas deDisplay

AvaliadorPolinomial

Operaçõespor vértice

& Montagemde primitivas

Rasterização

Memória de Textura

Operaçõespor Fragmento

FrameBuffer

Operaçõessobrepixels

29

Page 30: Silvânia de Assis Guilherme de Melo Moisés Tadeu Cardoso Isabela de Oliveira Glauber Ataíde Henrique de Araujo 1.

Baseado no Jogo Metal Gear

30

Page 32: Silvânia de Assis Guilherme de Melo Moisés Tadeu Cardoso Isabela de Oliveira Glauber Ataíde Henrique de Araujo 1.

32

Page 34: Silvânia de Assis Guilherme de Melo Moisés Tadeu Cardoso Isabela de Oliveira Glauber Ataíde Henrique de Araujo 1.

34

Page 35: Silvânia de Assis Guilherme de Melo Moisés Tadeu Cardoso Isabela de Oliveira Glauber Ataíde Henrique de Araujo 1.

35

Page 36: Silvânia de Assis Guilherme de Melo Moisés Tadeu Cardoso Isabela de Oliveira Glauber Ataíde Henrique de Araujo 1.

#include "Nanna.h“#include <iostream>using namespace std;

void Nanna::draw() { glColor3f(1,0,0); glBegin(GL_QUADS); glVertex3f(this->getX(), this->getY(), 0); glVertex3f(this->getX() + this->getLargura(), this->getY(), 0); glVertex3f(this->getX() + this->getLargura(), this->getY() + this->getAltura(), 0); glVertex3f(this->getX(), this->getY() + this->getAltura(), 0); glEnd();

}36