Tutorial OpenGL v3.0

Nesse artigo, trago-lhes a biblioteca SFML junto com OpenGL.

[ Hits: 17.232 ]

Por: Thiago Henrique Hüpner em 15/06/2015


Simulando uma gambiarra - Parte 2



Agora que vimos que é possível fazer um "mix" de OpenGL e SFML, vamos utilizar isso para algo ainda mais útil: Texto!

Se você leu meu artigo sobre SFML, deve saber como é feito. E como já viu como fazer para funcionar, você é ninja. ;)

Mas, de qualquer forma, segue o código com as fontes na localização padrão do Ubuntu.
* Nota: As fontes podem variar de distribuição para distribuição.

#include <SFML/OpenGL.hpp>
#include <SFML/Graphics.hpp>

void desenhaNaTela(sf::RectangleShape retangulo, float r = 255, int g = 0, int b = 0) {
    glLoadIdentity();
    // Pega a posicao do Retangulo
    sf::Vector2f posicao = retangulo.getPosition();
    // Pega o taamanho do retangulo
    sf::Vector2f tamanho = retangulo.getSize();

    // Define a cor para Vermelho
    glColor3ub (  r,  g, b );
    // Inicia quadrados
    glBegin(GL_QUADS);
    // Primeira posicao: (x,y)
    glVertex2f(posicao.x,posicao.y);
    // Segunda posicao: (x+tamanho.x,y)
    glVertex2f(posicao.x + tamanho.x, posicao.y);
    // Terceira posicao: (x+tamanho.x,y + tamanho.y)
    glVertex2f(posicao.x + tamanho.x, posicao.y + tamanho.y);
    // Quarta posicao: (x+tamanho.x,y)
    glVertex2f(posicao.x, posicao.y + tamanho.y);
    glEnd();

}
// Funcao para inicializar o OpenGL
void inicializaOpenGL() {

    // Define a Cor de 'limpar' para Branco usando
    //   Red     Blue    Green   Alpha
    glClearColor(255.0f, 255.0f, 255.0f, 1.0f);

    // Avisa o OpenGL que qualquer alteração futura
    // afetará a Câmera ( O Observador)
    glMatrixMode(GL_PROJECTION);

    //  Reinicia todas as transformações e/ou rotações
    glLoadIdentity();

    // Define a projeção cartesiana 2D iniciando de (0,0)
    // No Lado Superior Esquerdo (ficando igual a projeção do SDL 'puro')
    gluOrtho2D(0,400,400,0);

    // Avisa o OpenGL que qualquer alteração futura
    // afetará o/os desenho/desenhos
    glMatrixMode(GL_MODELVIEW);

    // 'Limpa' a tela usando a cor de 'limpar' a tela
    glClear(GL_COLOR_BUFFER_BIT);
}

int main(void) {
    // Cria uma janela de 400x400 com o titulo "Teste com OpenGL"
    sf::RenderWindow janela (sf::VideoMode(400,400),"Teste com OpenGL");

    // Variavel booleana para indicar se o programa "estaRodando"
    bool estaRodando = true;
    // Variavel para Eventos
    sf::Event evento;

    // Inicializa o OpenGL
    inicializaOpenGL();

// Variavel para armazenar a fonte
    sf::Font fonte;
    // As fontes geralmente ficam nessa localizacao "UBUNTU!"
    if(!fonte.loadFromFile("/usr/share/fonts/truetype/ubuntu-font-family/Ubuntu-B.ttf")) {
        // Erro ao carregar a fonte
        exit(EXIT_FAILURE);
    }

    // Variavel para armazenar o texto e manipular o a fonte
    sf::Text texto;
    // Define a fonte a ser utilizada (foi carregada logo em cima)
    texto.setFont(fonte);
    // Define o Texto
    texto.setString("Hello world");
    // Define a posicao
    texto.setPosition(30,20);
    // Define o tamanho em pixels
    texto.setCharacterSize(24);
    // Define a cor
    texto.setColor(sf::Color::Red);
    // Define alguns estilos para a fonte
    texto.setStyle(sf::Text::Bold | sf::Text::Underlined);

    int x = 0, y = 0;
    sf::Vector2i posicaoMouse;
    // Main Loop
    while(estaRodando) {
        // Se existir eventos coloca na variavel
        while(janela.pollEvent(evento)) {
            // Se foi clicado no 'X' da janela
            if(evento.type == sf::Event::Closed) {
                // "estaRodando" é falsa
                estaRodando = false;
            }

            posicaoMouse = sf::Mouse::getPosition(janela);
            x = posicaoMouse.x;
            y = posicaoMouse.y;
        }
        // Comecar o OpenGL aqui
        glClear(GL_COLOR_BUFFER_BIT);
        // Variavel do Retangulo
        sf::RectangleShape retangulo;
        retangulo.setSize(sf::Vector2f(30,30));
        retangulo.setPosition((400-30)/2,(400-30)/2);
        desenhaNaTela(retangulo);
        janela.pushGLStates();
        // Desenha o Texto
        janela.draw(texto);

        janela.popGLStates();

        janela.display();
    }

    janela.close();

    return 0;
}

Se compilar, deverá aparecer algo assim:
Linux: Tutorial OpenGL v3.0
Espero que esteja claro até aqui.

Página anterior     Próxima página

Páginas do artigo
   1. Introdução
   2. Primeira integração do OpenGL com o SFML
   3. Brincando com o OpenGL
   4. Simulando uma gambiarra
   5. Simulando uma gambiarra - Parte 2
   6. Agradecimentos, fontes e links úteis
Outros artigos deste autor

Tutorial OpenGL

Tutorial SFML

Visual Studio no Linux

Ubuntu/Debian/Kali Linux e outros no Android

Tutorial OpenGL v2.0

Leitura recomendada

Bug afeta todas as distros

Alocação dinâmica

Desenvolvendo para microcontroladores em GNU/Linux

A duplicação do buffer de saída na chamada de sistema fork() do Linux

Instalando Facebook Folly através do Conan

  
Comentários
[1] Comentário enviado por Thihup em 16/06/2015 - 09:17h

Sem comentários? o.0

Acho que já deu de artigos sobre OpenGL, certo?

Se quiserem, ainda tenho mais um artigo pré encaminhado.

[]'s

T+

[2] Comentário enviado por alexsdn em 16/06/2015 - 22:48h

Excelente artigo, de grande valia. Espero que você continue contribuindo do básico ao avançado sobre OpenGL.
Abraço!



Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts