Tutorial 2 – Explorando alguns recursos  

 

      

1 - Introdução

             Neste tutorial, exploraremos alguns recursos oferecidos pelas API OpenGL e SDL. Mostrarei como utilizar evento de teclado, definir onde a figura será desenhada  no plano e a criação de primitivas no OpenGL.

 2 – Eventos SDL

       Para facilitar as coisas vamos criar uma função chamada handleKeyDown, que passara a variável keysym como referencia, essa variável é do tipo struct, e armazenara a tecla precionada no teclado.

            Agora é só verificar que tecla foi pressionada criando uma estrutura condicional, um switch e verificaremos se a tecla pressionada é o esc.

 

//Esse metodo é utilizado quando um evento de teclado ocorrer

void handleKeyDown(SDL_keysym *keysym)

{

      //Verifica qual tecla foi pressionada

      switch(keysym->sym)

      {

      case SDLK_ESCAPE: // caso a tecla for esc, sair do programa

            exit(0);    // função da biblioteca padrão c/c++, stdlib.h

            break;

      }

}

 

Acrescentaremos um case na função processEvent, função criada no primeiro tutorial, o case SDL_KEYDOWN que será processado, caso a tecla for pressionada. Dentro dessa estrutura, colocaremos a nossa função handleKeyDown.

 

//Processa os Eventos ocorridos

void processEvent()

{

      SDL_Event event;

 

      while(SDL_PollEvent(&event))

      {

            switch(event.type)//captura o tipo de evento ocorrido

            {

            case SDL_KEYDOWN: //caso seja um evento de teclado, sendo pressionado

                  handleKeyDown(&event.key.keysym);

            break;

 

            case SDL_RESIZABLE: //caso o evento seja de alteração da janela

                  mainWindow = SDL_SetVideoMode( event.resize.w, event.resize.h, bpp, flags );

                  resizeOpenGL(event.resize.w, event.resize.h);

                  break;

            case SDL_QUIT:

                  exit(0);

                  break;

            }

      } 

}

 

3 – Configurando a Projeção

 

            Visando a facilitar a legibilidade, criaremos a função initProjection, que armazenara o conteúdo necessário para a configuração do modo de visualização na tela. Para alterar o modo de projeção na tela, utilizaremos a função glMatrixMode, passando como parâmetro GL_PROJECTION, disendo que qualquer operação feita agora, alterara a matriz de projeção.

            Vamos inicializar a matriz de projeção com a matriz identidade utilizando a função glLoadIdentity.

            Agora mudemos o modo de projeção para ortogonal usando a função gluOrtho2D(esquerda, direita, base, topo), onde esquerda e direita são os cantos da tela e base e topo são a parte inferior e superior respectivamente da tela.

 

Tela do monitor após gluOrtho2D.

 

//Modo de visualização

void initProjection()

{

     

      glMatrixMode(GL_PROJECTION);

      glLoadIdentity();

 

      gluOrtho2D(-1, 1, -1, 1); //Aqui criamos um plano cartesiano normalizado

 

      glMatrixMode(GL_MODELVIEW); // Retorna para o modelo de visão

      glLoadIdentity();

}

 

4 – Desenhando primitivas

 

            Para desenharmos primitivas, no caso, um trianglo basta acrescentar as seguintes linhas de codigo na função rendering, entre glClear e SDL_GL_SwapBuffers.

 

//Funcao onde sera posto os desenhos

void rendering()

{

      glClear( GL_COLOR_BUFFER_BIT );

 

     

      //prepara o opengl para receber os vertex. Inicia a inserção de vertex no pipeline do opengl

      glBegin(GL_TRIANGLES);//Desenha um trianglo

            glVertex2f(  0.0f, 0.5f );

            glVertex2f( -0.5f, 0.0f );

            glVertex2f(  0.5f, 0.0f );

      glEnd();

     

    SDL_GL_SwapBuffers();

}

 

A OpenGL oferece 10 tipos de primitivas para ser passado como parâmetro para o glBegin(GLenum primitiva), onde as primitivas são:

 

·         GL_LINES: exibe uma linha a cada dois comandos glVertex;

·         GL_LINE_STRIP: exibe uma seqüência de linhas conectando os pontos definidos por glVertex;

·         GL_LINE_LOOP: exibe uma seqüência de linhas conectando os pontos definidos por glVertex e ao final liga o primeiro como último ponto;

·         GL_POLYGON: exibe um polígono convexo preenchido, definido por uma seqüência de chamadas a glVertex;

·         GL_TRIANGLES: exibe um triângulo preenchido a cada três pontos definidos por glVertex;

·         GL_TRIANGLE_STRIP: exibe uma seqüência de triângulos baseados no trio de vértices v0, v1, v2, depois, v2, v1, v3, depois, v2, v3, v4 e assim por diante;

·         GL_TRIANGLE_FAN: exibe uma seqüência de triângulos conectados baseados no trio de vértices v0, v1, v2, depois, v0, v2, v3, depois, v0, v3, v4 e assim por diante;

·         GL_QUADS: exibe um quadrado preenchido conectando cada quatro pontos definidos por glVertex;

·         GL_QUAD_STRIP: exibe uma seqüência de quadriláteros conectados a cada quatro vértices; primeiro v0, v1, v3, v2, depois, v2, v3, v5, v4, depois, v4, v5, v7, v6, e assim por diante.

 

 

 

 

4       – Referência

 

[1] Documentação SDL www.libsdl.org

[2] www.opengl.org

[3] www.mesa3d.org

[6] OpenGL Super Bible

[7] OpenGL RedBook

[8] Premier.Press.Beginning.OpenGL.Game.Programming

Free Web Hosting