Tutorial OpenGL v3.0

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

[ Hits: 14.599 ]

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

Tutorial OpenGL v2.0

Ubuntu/Debian/Kali Linux e outros no Android

Leitura recomendada

Programação com números inteiros gigantes

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

Cuidado com números em Ponto Flutuante

Projeto Icecream (parte 1)

Utilizando técnicas recursivas em C e C++

  
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