29
DIM102 OpenGL 35T56 – Sala 3E3 Bruno Motta de Carvalho DIMAp – Sala 15 – Ramal 227

Representação de Imagensmotta/dim102/OpenGL.pdf · OpenGL 35T56 – Sala 3E3 Bruno Motta de Carvalho DIMAp – Sala 15 – Ramal 227. 2 DIM102 Introdução

  • Upload
    others

  • View
    1

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Representação de Imagensmotta/dim102/OpenGL.pdf · OpenGL 35T56 – Sala 3E3 Bruno Motta de Carvalho DIMAp – Sala 15 – Ramal 227. 2 DIM102 Introdução

DIM102 1  

OpenGL

35T56 – Sala 3E3Bruno Motta de CarvalhoDIMAp – Sala 15 – Ramal 227

Page 2: Representação de Imagensmotta/dim102/OpenGL.pdf · OpenGL 35T56 – Sala 3E3 Bruno Motta de Carvalho DIMAp – Sala 15 – Ramal 227. 2 DIM102 Introdução

DIM1022

Introdução

Definição História Portabilidade

Page 3: Representação de Imagensmotta/dim102/OpenGL.pdf · OpenGL 35T56 – Sala 3E3 Bruno Motta de Carvalho DIMAp – Sala 15 – Ramal 227. 2 DIM102 Introdução

DIM1023

Vantagens

Rápida Simples Robusta Padrão aberto Multiplataforma Mecanismo de incorporação de 

extensões ao padrão

Page 4: Representação de Imagensmotta/dim102/OpenGL.pdf · OpenGL 35T56 – Sala 3E3 Bruno Motta de Carvalho DIMAp – Sala 15 – Ramal 227. 2 DIM102 Introdução

DIM1024

Bibliotecas OpenGL

Sistema de janelas pode ser trocado

Existem implementações para variantes de Unix (IRIX, Solaris, Linux, etc.), OS/2, Windows, BSD, MAC OS

Page 5: Representação de Imagensmotta/dim102/OpenGL.pdf · OpenGL 35T56 – Sala 3E3 Bruno Motta de Carvalho DIMAp – Sala 15 – Ramal 227. 2 DIM102 Introdução

DIM1025

Bibliotecas OpenGL

Page 6: Representação de Imagensmotta/dim102/OpenGL.pdf · OpenGL 35T56 – Sala 3E3 Bruno Motta de Carvalho DIMAp – Sala 15 – Ramal 227. 2 DIM102 Introdução

DIM1026

Pipeline da OpenGL

Page 7: Representação de Imagensmotta/dim102/OpenGL.pdf · OpenGL 35T56 – Sala 3E3 Bruno Motta de Carvalho DIMAp – Sala 15 – Ramal 227. 2 DIM102 Introdução

DIM1027

Máquina de Estados da OpenGL Máquina de estados Setando estados

Cor Normal Coordinadas de texturas Modo de desenho Modo de matriz

Page 8: Representação de Imagensmotta/dim102/OpenGL.pdf · OpenGL 35T56 – Sala 3E3 Bruno Motta de Carvalho DIMAp – Sala 15 – Ramal 227. 2 DIM102 Introdução

DIM1028

Opções em OpenGL

As funções glEnable() e glDisable() funcionalidades da OpenGLGL_DEPTH_TESTGL_CULL_FACEGL_DITHERGL_BLENDetc.

Page 9: Representação de Imagensmotta/dim102/OpenGL.pdf · OpenGL 35T56 – Sala 3E3 Bruno Motta de Carvalho DIMAp – Sala 15 – Ramal 227. 2 DIM102 Introdução

DIM1029

Tipos de dados

Nomes das funções denotam argumentos

GLbyte, GLshort glVertex{2,3,4}{sifd}[v]()

glVertex3i(Glint x, Glint y, Glint z);glVertex3fv(Glgloat *v); 

GLbyte, Glshort, Glint, Glfloat, GLdouble

Page 10: Representação de Imagensmotta/dim102/OpenGL.pdf · OpenGL 35T56 – Sala 3E3 Bruno Motta de Carvalho DIMAp – Sala 15 – Ramal 227. 2 DIM102 Introdução

DIM10210

Primitivas Geométricas Desenha­se primitivas 

usando­se glBegin() e glEnd()

Tipos de primitivas:    GL_POINTS,     GL_LINES,     GL_LINE_STRIP,     GL_LINE_LOOP,     GL_POLYGON,     GL_QUADS, etc.

Page 11: Representação de Imagensmotta/dim102/OpenGL.pdf · OpenGL 35T56 – Sala 3E3 Bruno Motta de Carvalho DIMAp – Sala 15 – Ramal 227. 2 DIM102 Introdução

DIM10211

Vértices

Usa­se glVertex3f(GLfloat x, GLfloat y, GLfloat z)  Alternativa: glVertex3fv(const Glfloat *v) Variantes: glVertex2, glVertex3 e 

glVertex4, e shorts, ints, floats, doubles Arrays (OpenGL 1.1)

Page 12: Representação de Imagensmotta/dim102/OpenGL.pdf · OpenGL 35T56 – Sala 3E3 Bruno Motta de Carvalho DIMAp – Sala 15 – Ramal 227. 2 DIM102 Introdução

DIM10212

Normais

Usa­se glNormal3f(GLfloat x, GLfloat y, GLfloat z) Alternativa: glNormal3fv(const Glfloat *v) Variantes: glVertex2, glVertex3 e glVertex4, 

e bytes, shorts, ints, floats, doubles

Page 13: Representação de Imagensmotta/dim102/OpenGL.pdf · OpenGL 35T56 – Sala 3E3 Bruno Motta de Carvalho DIMAp – Sala 15 – Ramal 227. 2 DIM102 Introdução

DIM10213

Cores

Usa­se glColor3f(GLfloat x, GLfloat y, GLfloat z) Alternativa: glColor3fv(const Glfloat *v) Variantes: glColor3 e glColor4, e bytes, 

unsigned bytes, shorts, ints, floats, doubles

Page 14: Representação de Imagensmotta/dim102/OpenGL.pdf · OpenGL 35T56 – Sala 3E3 Bruno Motta de Carvalho DIMAp – Sala 15 – Ramal 227. 2 DIM102 Introdução

DIM10214

Transformações

Coord.objetos

Matriz dosModelos

Matriz daProjeção

Matriz doViewport

Coord.camera

Coord.Normalizadas

Coord.display

Page 15: Representação de Imagensmotta/dim102/OpenGL.pdf · OpenGL 35T56 – Sala 3E3 Bruno Motta de Carvalho DIMAp – Sala 15 – Ramal 227. 2 DIM102 Introdução

DIM10215

Transformações

TranslaçãoglTranslationf(GLfloat x, GLfloat y, GLfloat z)

RotaçãoglRotationf(Glfloat angulo, GLfloat x, GLfloat 

y, GLfloat z)Ângulo é dado em graus e (x,y,z) é o eixo da 

rotação Escala

glScalef(GLGLfloat x, GLfloat y, GLfloat z)

Page 16: Representação de Imagensmotta/dim102/OpenGL.pdf · OpenGL 35T56 – Sala 3E3 Bruno Motta de Carvalho DIMAp – Sala 15 – Ramal 227. 2 DIM102 Introdução

DIM10216

Projeção Ortogonal Comando glOrtho utiliza seis parâmetros que 

definem um volume de visão.    glOrtho(left,right,bottom,top,near,far);

Page 17: Representação de Imagensmotta/dim102/OpenGL.pdf · OpenGL 35T56 – Sala 3E3 Bruno Motta de Carvalho DIMAp – Sala 15 – Ramal 227. 2 DIM102 Introdução

DIM10217

Projeção Perspectiva Comando glFrustum, define o volume de visão 

em forma de tronco de pirâmide (frustum).    glFrustrum(left,right,bottom,top,near,far);

Page 18: Representação de Imagensmotta/dim102/OpenGL.pdf · OpenGL 35T56 – Sala 3E3 Bruno Motta de Carvalho DIMAp – Sala 15 – Ramal 227. 2 DIM102 Introdução

DIM10218

Exemplo

glBegin(GL_POLYGON); glTranslatef(4.5,7.0,0); glRotatef(40,0,1,0); glScalef(1,1,1); glColor3f(1,0,0); glNormal3f(0,0,1); glVertex3f(-0.5, 0.5,0.5); glVertex3f( 0.5, 0.5,0.5); glVertex3f( 0.5,-0.5,0.5); glVertex3f(-0.5,-0.5,0.5);glEnd();

Page 19: Representação de Imagensmotta/dim102/OpenGL.pdf · OpenGL 35T56 – Sala 3E3 Bruno Motta de Carvalho DIMAp – Sala 15 – Ramal 227. 2 DIM102 Introdução

DIM10219

Visibilidade

OpenGL só suporta Z­buffering glEnable(GL_DEPTH_TEST) glClear(GL_DEPTH_BUFFER)

Page 20: Representação de Imagensmotta/dim102/OpenGL.pdf · OpenGL 35T56 – Sala 3E3 Bruno Motta de Carvalho DIMAp – Sala 15 – Ramal 227. 2 DIM102 Introdução

DIM10220

Iluminação Em OpenGL a luz é dividida em quatro 

componentes independentes:  Ambiente: resultado da luz refletida no ambiente; 

é uma luz que vem de todas as direções  Difusa: luz que vem de uma direção, atinge a 

superfície e é refletida em todas as direções Especular: luz que vem de uma direção e tende a 

ser refletida numa única direção Emissiva: simula a luz que se origina em um 

objeto

Page 21: Representação de Imagensmotta/dim102/OpenGL.pdf · OpenGL 35T56 – Sala 3E3 Bruno Motta de Carvalho DIMAp – Sala 15 – Ramal 227. 2 DIM102 Introdução

DIM10221

Luzes e Colorização glLightfv(GLenum light, GLenum pname,GLfloat 

*param) glEnable(GL_LIGHTING) glEnable(GL_LIGHT0) glShadeModel(GLenum mode), onde mode pode 

serGL_FLAT    ­ FLAT shadingGL_SMOOTH  ­ GOURAUD shading

Page 22: Representação de Imagensmotta/dim102/OpenGL.pdf · OpenGL 35T56 – Sala 3E3 Bruno Motta de Carvalho DIMAp – Sala 15 – Ramal 227. 2 DIM102 Introdução

DIM10222

Mapeamento de Texturas Crie um objeto de textura

Especifique um bitmap da textura Escolha como aplicar a textura Ligue o mapeamento de texturas Desenha a cena, enviando as 

coordenadas geométricas e as coordenadas de textura

Page 23: Representação de Imagensmotta/dim102/OpenGL.pdf · OpenGL 35T56 – Sala 3E3 Bruno Motta de Carvalho DIMAp – Sala 15 – Ramal 227. 2 DIM102 Introdução

DIM10223

Extensões

Mecanismo utilizado para se incluir novas funcionalidades a OpenGL

São propostas por fabricantes e podem ser adotadas pela ARB posteriormente

Prefixos denotam os proponentes, HP, SUN, NV, SGI, WIN, INTEL, etc.

Função glGetString é usada para se determinar quais extensões estão disponíveis

Page 24: Representação de Imagensmotta/dim102/OpenGL.pdf · OpenGL 35T56 – Sala 3E3 Bruno Motta de Carvalho DIMAp – Sala 15 – Ramal 227. 2 DIM102 Introdução

DIM10224

Interação com o Usuário

Interação com o usuário é feita através de outras ferramentas, como GLUT, Qt, GTK, etc.

OpenGL foi desenvolvida para ser independente de plataformas

Diferentes SOs tratam eventos de formas diferentes

Page 25: Representação de Imagensmotta/dim102/OpenGL.pdf · OpenGL 35T56 – Sala 3E3 Bruno Motta de Carvalho DIMAp – Sala 15 – Ramal 227. 2 DIM102 Introdução

DIM10225

/#include <GL/glut.h>    // Header File For The GLUT Library 

#include <GL/gl.h> // Header File For The OpenGL32 Library

#include <GL/glu.h> // Header File For The GLu32 Library

#include <unistd.h>     // needed to sleep

#define ESCAPE 27

int window; /* The number of our GLUT window */

float rtri = 0.0f, rquad = 0.0f; /* rotation angles for the triangle and quadrilateral. */

void InitGL(int Width, int Height)         // We call this right after our OpenGL window is created.

{

  glClearColor(0.0f, 0.0f, 0.0f, 0.0f); // This Will Clear The Background Color To Black

  glClearDepth(1.0); // Enables Clearing Of The Depth Buffer

  glDepthFunc(GL_LESS);         // The Type Of Depth Test To Do

  glEnable(GL_DEPTH_TEST);         // Enables Depth Testing

  glShadeModel(GL_SMOOTH); // Enables Smooth Color Shading

  glMatrixMode(GL_PROJECTION);

  glLoadIdentity(); // Reset The Projection Matrix

  gluPerspective(45.0f,(GLfloat)Width/(GLfloat)Height,0.1f,100.0f); // Calculate The Aspect Ratio Of The Window

   glMatrixMode(GL_MODELVIEW);

}

void ReSizeGLScene(int Width, int Height)

{

  if (Height==0) Height=1;  // Prevent A Divide By Zero If The Window Is Too Small

  glViewport(0, 0, Width, Height); // Reset The Current Viewport And Perspective Transformation

  glMatrixMode(GL_PROJECTION);

  glLoadIdentity();

  gluPerspective(45.0f,(GLfloat)Width/(GLfloat)Height,0.1f,100.0f);

  glMatrixMode(GL_MODELVIEW);

}

Exemplo

Page 26: Representação de Imagensmotta/dim102/OpenGL.pdf · OpenGL 35T56 – Sala 3E3 Bruno Motta de Carvalho DIMAp – Sala 15 – Ramal 227. 2 DIM102 Introdução

DIM10226

void DrawGLScene()

{

  glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT); // Clear The Screen And The Depth Buffer

  glLoadIdentity(); // Reset The View

  glTranslatef(­1.5f,0.0f,­6.0f); // Move Left 1.5 Units And Into The Screen 6.0

  glRotatef(rtri,0.0f,1.0f,0.0f); // Rotate The Pyramid On The Y axis 

  // draw a pyramid (in smooth coloring mode)

  glBegin(GL_POLYGON); // start drawing a pyramid

  // front face of pyramid

  glColor3f(1.0f,0.0f,0.0f); // Set The Color To Red

  glVertex3f(0.0f, 1.0f, 0.0f);         // Top of triangle (front)

  glColor3f(0.0f,1.0f,0.0f); // Set The Color To Green

  glVertex3f(­1.0f,­1.0f, 1.0f); // left of triangle (front)

  glColor3f(0.0f,0.0f,1.0f); // Set The Color To Blue

  glVertex3f(1.0f,­1.0f, 1.0f);         // right of traingle (front)

  // right face of pyramid

  glColor3f(1.0f,0.0f,0.0f); // Red

  glVertex3f( 0.0f, 1.0f, 0.0f); // Top Of Triangle (Right)

  glColor3f(0.0f,0.0f,1.0f); // Blue

  glVertex3f( 1.0f,­1.0f, 1.0f); // Left Of Triangle (Right)

  glColor3f(0.0f,1.0f,0.0f); // Green

  glVertex3f( 1.0f,­1.0f, ­1.0f); // Right Of Triangle (Right)

  

  // back face of pyramid

  glColor3f(1.0f,0.0f,0.0f); // Red

  glVertex3f( 0.0f, 1.0f, 0.0f); // Top Of Triangle (Back)

  glColor3f(0.0f,1.0f,0.0f); // Green

  glVertex3f( 1.0f,­1.0f, ­1.0f); // Left Of Triangle (Back)

  glColor3f(0.0f,0.0f,1.0f); // Blue

  glVertex3f(­1.0f,­1.0f, ­1.0f); // Right Of Triangle (Back)

  // left face of pyramid.

  glColor3f(1.0f,0.0f,0.0f); // Red

  glVertex3f( 0.0f, 1.0f, 0.0f); // Top Of Triangle (Left)

  glColor3f(0.0f,0.0f,1.0f); // Blue

  glVertex3f(­1.0f,­1.0f,­1.0f); // Left Of Triangle (Left)

  glColor3f(0.0f,1.0f,0.0f); // Green

  glVertex3f(­1.0f,­1.0f, 1.0f); // Right Of Triangle (Left)

  glEnd(); // Done Drawing The Pyramid

Exemplo

Page 27: Representação de Imagensmotta/dim102/OpenGL.pdf · OpenGL 35T56 – Sala 3E3 Bruno Motta de Carvalho DIMAp – Sala 15 – Ramal 227. 2 DIM102 Introdução

DIM10227

  glLoadIdentity(); // make sure we're no longer rotated.

  glTranslatef(1.5f,0.0f,­7.0f); // Move Right 3 Units, and back into the screen 7

  glRotatef(rquad,1.0f,1.0f,1.0f); // Rotate The Cube On X, Y, and Z

  // draw a cube (6 quadrilaterals)

  glBegin(GL_QUADS); // start drawing the cube.

  // top of cube

  glColor3f(0.0f,1.0f,0.0f); // Set The Color To Blue

  glVertex3f( 1.0f, 1.0f,­1.0f); // Top Right Of The Quad (Top)

  glVertex3f(­1.0f, 1.0f,­1.0f); // Top Left Of The Quad (Top)

  glVertex3f(­1.0f, 1.0f, 1.0f); // Bottom Left Of The Quad (Top)

  glVertex3f( 1.0f, 1.0f, 1.0f); // Bottom Right Of The Quad (Top)

  // bottom of cube

  glColor3f(1.0f,0.5f,0.0f); // Set The Color To Orange

  glVertex3f( 1.0f,­1.0f, 1.0f); // Top Right Of The Quad (Bottom)

  glVertex3f(­1.0f,­1.0f, 1.0f); // Top Left Of The Quad (Bottom)

  glVertex3f(­1.0f,­1.0f,­1.0f); // Bottom Left Of The Quad (Bottom)

  glVertex3f( 1.0f,­1.0f,­1.0f); // Bottom Right Of The Quad (Bottom)

  // front of cube

  glColor3f(1.0f,0.0f,0.0f); // Set The Color To Red

  glVertex3f( 1.0f, 1.0f, 1.0f); // Top Right Of The Quad (Front)

  glVertex3f(­1.0f, 1.0f, 1.0f); // Top Left Of The Quad (Front)

  glVertex3f(­1.0f,­1.0f, 1.0f); // Bottom Left Of The Quad (Front)

  glVertex3f( 1.0f,­1.0f, 1.0f); // Bottom Right Of The Quad (Front)

 

 // back of cube.

  glColor3f(1.0f,1.0f,0.0f); // Set The Color To Yellow

  glVertex3f( 1.0f,­1.0f,­1.0f); // Top Right Of The Quad (Back)

  glVertex3f(­1.0f,­1.0f,­1.0f); // Top Left Of The Quad (Back)

  glVertex3f(­1.0f, 1.0f,­1.0f); // Bottom Left Of The Quad (Back)

  glVertex3f( 1.0f, 1.0f,­1.0f); // Bottom Right Of The Quad (Back)

// left of cube

  glColor3f(0.0f,0.0f,1.0f); // Blue

  glVertex3f(­1.0f, 1.0f, 1.0f); // Top Right Of The Quad (Left)

  glVertex3f(­1.0f, 1.0f,­1.0f); // Top Left Of The Quad (Left)

  glVertex3f(­1.0f,­1.0f,­1.0f); // Bottom Left Of The Quad (Left)

  glVertex3f(­1.0f,­1.0f, 1.0f); // Bottom Right Of The Quad (Left)

  // Right of cube

  glColor3f(1.0f,0.0f,1.0f); // Set The Color To Violet

  glVertex3f( 1.0f, 1.0f,­1.0f);         // Top Right Of The Quad (Right)

  glVertex3f( 1.0f, 1.0f, 1.0f); // Top Left Of The Quad (Right)

  glVertex3f( 1.0f,­1.0f, 1.0f); // Bottom Left Of The Quad (Right)

  glVertex3f( 1.0f,­1.0f,­1.0f); // Bottom Right Of The Quad (Right)

  glEnd(); // Done Drawing The Cube

  rtri+=15.0f; // Increase The Rotation Variable For The Pyramid

  rquad­=15.0f; // Decrease The Rotation Variable For The Cube

  // swap the buffers to display, since double buffering is used.

  glutSwapBuffers();

}

Exemplo

Page 28: Representação de Imagensmotta/dim102/OpenGL.pdf · OpenGL 35T56 – Sala 3E3 Bruno Motta de Carvalho DIMAp – Sala 15 – Ramal 227. 2 DIM102 Introdução

DIM10228

/* The function called whenever a key is pressed. */

void keyPressed(unsigned char key, int x, int y) 

{

    /* avoid thrashing this call */

    usleep(100);

    /* If escape is pressed, kill everything. */

    if (key == ESCAPE) 

    { 

      /* shut down our window */

      glutDestroyWindow(window); 

      /* exit the program...normal termination. */

      exit(0);                   

    }

}

int main(int argc, char **argv) 

{  

  /* Initialize GLUT state ­ glut will take any command line arguments that pertain to it or 

     X Windows ­ look at its documentation at http://reality.sgi.com/mjk/spec3/spec3.html */  

  glutInit(&argc, argv);  

  /* Select type of Display mode:   

     Double buffer 

     RGBA color

     Alpha components supported 

     Depth buffered for automatic clipping */  

  glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_ALPHA | 

GLUT_DEPTH);  

  /* get a 640 x 480 window */

  glutInitWindowSize(640, 480);

  /* the window starts at the upper left corner of the screen */

  glutInitWindowPosition(0, 0);  

  /* Open a window */  

  window = glutCreateWindow("Jeff Molofee's GL Code Tutorial ... NeHe '99");  

  /* Register the function to do all our OpenGL drawing. */

  glutDisplayFunc(&DrawGLScene);  

  /* Go fullscreen.  This is as soon as possible. */

  glutFullScreen();

  /* Even if there are no events, redraw our gl scene. */

  glutIdleFunc(&DrawGLScene);

  /* Register the function called when our window is resized. */

  glutReshapeFunc(&ReSizeGLScene);

  /* Register the function called when the keyboard is pressed. */

  glutKeyboardFunc(&keyPressed);

  /* Initialize our window. */

  InitGL(640, 480);

  /* Start Event Processing Engine */  

  glutMainLoop();  

  return 1;

}

Exemplo

Page 29: Representação de Imagensmotta/dim102/OpenGL.pdf · OpenGL 35T56 – Sala 3E3 Bruno Motta de Carvalho DIMAp – Sala 15 – Ramal 227. 2 DIM102 Introdução

DIM10229

Exemplo