Tutorial OpenGL v2.0

Finalmente chegou! Após quase 1 ano depois de meu primeiro artigo sobre OpenGL, chegou a versão 2.0. Clique e fique mais Geek.

[ Hits: 18.114 ]

Por: Thiago Henrique Hüpner em 08/05/2015


"Imagine" seu programa



Após saber colisão, já é possível criar alguns joguinhos. Mas espere, e as imagens?

Diferentemente do que devem estar pensando, colocar uma imagem no OpenGL é mais complexo do que o próprio SDL. Mas não desanimem, não é impossível!

Salve essa imagem como "sdl.bmp":
Linux: Tutorial OpenGL v2.0
Segue o exemplo em código:

#include <SDL/SDL.h>
#include <SDL/SDL_opengl.h>
#include <time.h>

#define LARGURA 400
#define ALTURA 400

#define TAMANHO_IMAGEM 128

GLuint carregarImagem(const char *nomeImg) {
    SDL_Surface *img = SDL_LoadBMP(nomeImg);
    GLuint textura;

    if(img == NULL) {
        printf("Erro ao carregar a imagem %s: %s
",nomeImg,SDL_GetError());
        SDL_FreeSurface(img);
        exit(-1);
    }

    glGenTextures(1, &textura);

    glBindTexture(GL_TEXTURE_2D, textura);

    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

    glTexImage2D(GL_TEXTURE_2D, 0, 3, img->w, img->h, 0,
                 GL_RGR, GL_UNSIGNED_BYTE, img->pixels);
    SDL_FreeSurface(img);
    return textura;
}

void colocandoImagemNaTela(GLuint textura, int x,int y) {
    glBindTexture(GL_TEXTURE_2D, textura);

    glLoadIdentity();

    glTranslatef(x,y,0);

    glBegin(GL_QUADS);
    glTexCoord2f(0, 0);
    glVertex2f(0, 0);

    glTexCoord2f(1, 0);
    glVertex2f(TAMANHO_IMAGEM, 0);

    glTexCoord2f(1, 1);
    glVertex2f(TAMANHO_IMAGEM, TAMANHO_IMAGEM);

    glTexCoord2f(0, 1);
    glVertex2f(0, TAMANHO_IMAGEM);
    glEnd();

}

void inicializaOpenGL() {
    glClearColor(255,255,255,1);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();

    //Necessário para exibir a imagem
    glEnable(GL_TEXTURE_2D);

    gluOrtho2D(0,LARGURA,ALTURA,0);
    glMatrixMode(GL_MODELVIEW);
    glClear(GL_COLOR_BUFFER_BIT);
}

void GL_FillRect(SDL_Rect a,int r,int g,int b) {

    glLoadIdentity();

    glColor3ub(r,g,b);
    glBegin(GL_QUADS);
    glVertex2f(a.x,a.y);
    glVertex2f(a.x+a.w,a.y);
    glVertex2f(a.x+a.w,a.y+a.h);
    glVertex2f(a.x,a.y+a.h);
    glEnd();
}
int main(int argc,char *argv[]) {
    if(SDL_Init(SDL_INIT_VIDEO) < 0) {
        printf("Erro : %s
",SDL_GetError());
        return -1;
    }

    srand((unsigned)time(NULL));

    SDL_GL_SetAttribute( SDL_GL_RED_SIZE, 8 );
    SDL_GL_SetAttribute( SDL_GL_GREEN_SIZE, 8 );
    SDL_GL_SetAttribute( SDL_GL_BLUE_SIZE, 8 );
    SDL_GL_SetAttribute( SDL_GL_ALPHA_SIZE, 8 );
    SDL_GL_SetAttribute( SDL_GL_DOUBLEBUFFER, 2 );

    SDL_Surface * tela = SDL_SetVideoMode(LARGURA,ALTURA,32,SDL_OPENGL);

    if(tela == NULL) {
        printf("Erro : %s
",SDL_GetError());
        SDL_Quit();
        return -1;
    }

    SDL_WM_SetCaption(""Imagenando"",NULL);

    SDL_Event evento;

    int estaRodando = 1;

    inicializaOpenGL();

    GLuint textura = carregarImagem("cb.bmp");

    while(estaRodando) {
        while(SDL_PollEvent(&evento)) {
            switch(evento.type) {
            case SDL_QUIT:
                estaRodando = 0;
                break;

            default:
                break;

            }
        }

        glClear(GL_COLOR_BUFFER_BIT);

        colocandoImagemNaTela(textura,50,50);

        SDL_Delay(30);

        SDL_GL_SwapBuffers();
    }
    SDL_Quit();

    glDeleteTextures(1, &textura);

    return 0;

}

Esse exemplo não possui comentários explicando, mas deixe que eu explico:

#define TAMANHO_IMAGEM 128 :: Eu utilizei essa constante pois ajuda na hora de desenhar na tela. Se quiser, deixe como está, mas se sua imagem não for de 128x128, ela poderá ser deformada.

GLuint carregarImagem(const char *nomeImg) :: É a função encarregada de converter uma imagem carregada pelo SDL em textura do OpenGL (e retorna um GLuint, ou seja, um "unsigned int 'padronizado'".

glGenTextures(1, &textura) :: O OpenGL gera um "objeto de textura" que será encarregado de armazenar uma textura.

glBindTexture(GL_TEXTURE_2D, textura) :: O OpenGL "diz" ao "objeto de textura" que será carregado uma "GL_TEXTURE_2D", ou seja, carregará uma imagem em 2D.

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
E:
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); :: Definem as propriedades de "alongamento", ou seja, como será o preenchimento caso seja maior que a imagem. Por exemplo, a imagem é de 16x16 e será utilizado em um retângulo de 256x256 (por exemplo), com esses parametro irá definir como será a proporção.

glTexImage2D(GL_TEXTURE_2D, 0, 3, img->w, img->h, 0,
GL_RGR, GL_UNSIGNED_BYTE, img->pixels); :: Coloca a imagem do SDL na "textura" do OpenGL.

void colocandoImagemNaTela(GLuint textura, int x,int y) :: Essa função vai fazer o que o nome sugere: colocar a textura na tela.

glBindTexture(GL_TEXTURE_2D, textura); :: "Diz" ao próximos manipuladores que a textura a ser utilizada é a o conteudo da variavel "textura".

glTranslatef(x,y,0); :: Coloca a textura na posição X e Y

glTexCoord2f(0, 0); :: Aqui é a mesma regra do SDL_Rect, ou seja, o canto superior esquerdo = {0,0}, canto inferior esquero = {1,0},...

Main

GLuint textura = carregarImagem("sdl.bmp"); :: Carrega a textura da imagem "sdl.bmp".

colocandoImagemNaTela(textura,50,50); :: Coloca a textura na posição X: 50 e Y: 50.

Bom, parece complicado. E é, mas após pegar o jeito isso daqui é moleza.

Com esse exemplo, se apenas modificarmos no Main, o "sdl.bmp" para outro nome de arquivo ou criar outra textura e colocar em outra posição também vai funcionar.

Temos um programa funcional. =D

Página anterior     Próxima página

Páginas do artigo
   1. Introdução
   2. Inicializando o SDL
   3. OpenGL e SDL botando pra quebrar
   4. Simulando uma Gambiarra
   5. A jornada é longa parte 1 - Colisão Mouse e Retângulo
   6. A jornada é longa parte 2 - Colisão entre 2 Retângulos
   7. "Imagine" seu programa
   8. Agradecimentos, links úteis e fontes
Outros artigos deste autor

Ubuntu/Debian/Kali Linux e outros no Android

Visual Studio no Linux

Tutorial SFML

Tutorial OpenGL

Tutorial OpenGL v3.0

Leitura recomendada

Ponteiros void na linguagem C (parte 2)

Brincando com o editor HT

Criação e uso de um interpretador de script BrainFuck em C++

Conio.h para Linux

Utilizando a biblioteca NCURSES - Parte II

  
Comentários
[1] Comentário enviado por fabio em 08/05/2015 - 10:30h

Muito bom! Vou tentar criar um game simples pra minha filha ficar clicando no retângulo com a cor certa com base neste tutorial.

[2] Comentário enviado por Thihup em 08/05/2015 - 11:21h


[1] Comentário enviado por fabio em 08/05/2015 - 10:30h

Muito bom! Vou tentar criar um game simples pra minha filha ficar clicando no retângulo com a cor certa com base neste tutorial.


Fábio, mais uma vez, muito obrigado !

E boa sorte com o aplicativo, espero que sua filha goste.

Qualquer dúvida só pedir =D

[]'s

T+

[3] Comentário enviado por UmCaraAToa em 08/05/2015 - 11:25h

Bom artigo!
Favoritado e pega meu 10!

Até

[4] Comentário enviado por Thihup em 08/05/2015 - 11:30h


[3] Comentário enviado por UmCaraAToa em 08/05/2015 - 11:25h

Bom artigo!
Favoritado e pega meu 10!

Até


Valeu fera

T+

[5] Comentário enviado por xerxeslins em 08/05/2015 - 11:49h


Favoritado. Vou ler depois com calma. Mas só de dar uma olhada por rápida vi que é material interessante!
--
http://pastebin.com/aji5Qp05

[6] Comentário enviado por Thihup em 08/05/2015 - 11:55h


[5] Comentário enviado por xerxeslins em 08/05/2015 - 11:49h


Favoritado. Vou ler depois com calma. Mas só de dar uma olhada por rápida vi que é material interessante!
--
http://pastebin.com/aji5Qp05


Valeu fera, Obrigado!

[]'s

T+

[7] Comentário enviado por preroeb em 08/05/2015 - 19:02h

Parabéns pelo artigo escrito, é uns dos melhores (e únicos) artigos sobre OpenGL aqui no VOL.

[8] Comentário enviado por Thihup em 08/05/2015 - 19:04h


[7] Comentário enviado por preroeb em 08/05/2015 - 19:02h

Parabéns pelo artigo escrito, é uns dos melhores (e únicos) artigos sobre OpenGL aqui no VOL.


Valew pela força!

Dando duro pra trazer um artigo de qualidade pra vocês, meu povinho do "Volzinho"!

[]'s

T+

[9] Comentário enviado por Felipeigor em 08/05/2015 - 19:43h

Ae Parabéns brother excelente artigo , favoritado aqui tbm :)

Igor Felipe
Cadastrado desde: 25/09/2009

[b]If it moves , compile it.[/b]

[10] Comentário enviado por Thihup em 08/05/2015 - 19:44h


[9] Comentário enviado por Felipeigor em 08/05/2015 - 19:43h

Ae Parabéns brother excelente artigo , favoritado aqui tbm :)

Igor Felipe
Cadastrado desde: 25/09/2009

[b]If it moves , compile it.[/b]


Valew Tambem pelo apoio!

[]'s

T+

[11] Comentário enviado por SamL em 09/05/2015 - 12:50h

Legal cara, bem explicada a parte sobre colisão. Um bom artigo como um todo. Parabéns.

[12] Comentário enviado por Thihup em 09/05/2015 - 13:40h


[11] Comentário enviado por SamL em 09/05/2015 - 12:50h

Legal cara, bem explicada a parte sobre colisão. Um bom artigo como um todo. Parabéns.


Valew Sam! Sempre me apoiando!

[]'s

T+

[13] Comentário enviado por Ang em 09/05/2015 - 16:14h

Oi, Thiago!
Dei uma rápida lida no seu artigo.
Está muito bom!
Continue assim, com essas ótimas contribuições!

Ang,
Manaus, AM, Brasil.
Usuário de sistemas operacionais livres/abertos tipo Unix ou tipo DOS,
Distros Favoritas: FreeBSD, Free-DOS, , PC-DOS, Bodhi Linux, Ubuntu, Big Linux, Kurumim, OpenSUSE, Slackware e Slax.

[14] Comentário enviado por Thihup em 09/05/2015 - 16:18h


[13] Comentário enviado por Ang em 09/05/2015 - 16:14h

Oi, Thiago!
Dei uma rápida lida no seu artigo.
Está muito bom!
Continue assim, com essas ótimas contribuições!

Ang,
Manaus, AM, Brasil.
Usuário de sistemas operacionais livres/abertos tipo Unix ou tipo DOS,
Distros Favoritas: FreeBSD, Free-DOS, , PC-DOS, Bodhi Linux, Ubuntu, Big Linux, Kurumim, OpenSUSE, Slackware e Slax.


Valew !
Obrigado por ter lido!

[]'s

T+


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts