jueves, 18 de junio de 2015

C++ - Programa básico con SFML y OpenGL


Programa básico con SFML y OpenGL


Esta entrada no será texto, sinó un vídeo grabado en el que muestro el proceso mediante el cual hago un programa muy sencillo como base para usar OpenGL con SFML. Lo hago en 2D, pero se puede usar OpenGL para 3D también, por supuesto, solo habría que plantearlo.



Para compilar necesitaréis SFML (yo uso la versión 2.1, que es la que tengo instalada; otra versión probablemente funcione también), y un compilador de C++11. Digo C++11 porque en este caso uso las librerías thread y chrono para limitar los ciclos del programa, aunque se puede usar cualquier otra técnica.

Y bueno, solo queda poner el vídeo. El vídeo está sin sonido, y es una grabación con apenas edición, pero me sirve de prueba para futuras entradas o vídeos.



En este programa, el bucle principal se encarga solo de controlar el tiempo, y llamar a otras funciones para hacer las cosas básicas de todo programa: la parte de procesamiento de eventos y datos, y la parte de dibujado en pantalla.



Y para finalizar, el código para quien lo quiera copiar.

#include <SFML/Graphics.hpp>
#include <SFML/OpenGL.hpp>
#include <iostream>
#include <ctime>
#include <chrono>
#include <thread>

using namespace std;

int offset = 0;

void render(sf::RenderWindow &window){
    window.clear();
    glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);

    glColor3ub(0,0,255);
    glBegin(GL_POLYGON);
        glVertex2f(offset,      50);
        glVertex2f(offset+100, 250);
        glVertex2f(offset,     450);
    glEnd();
}

bool processData(sf::RenderWindow &window){
    offset += 2;
    if(offset>500)
        offset=-100;
    sf::Event ev;
    while(window.pollEvent(ev));
    return true;
}

int main(){
    sf::RenderWindow window;
    window.create(sf::VideoMode(500,500),"Title");
    glOrtho(0,500,500,0,0,1);
    bool running=true;
    clock_t last = 0;

    while(running){
        render(window);
        running = processData(window);
        window.display();
        while(clock()-last<25)
            this_thread::sleep_for(chrono::milliseconds(1));
        last = clock();
    }
}

3 comentarios:

  1. Eh compañero, buen vídeo =D. ¿Harás más como esos? Podías poner voz =)
    ¡Suerte!

    ResponderEliminar
  2. Interesante, me pregunto como funcionan los modelos en 3D

    ResponderEliminar
    Respuestas
    1. A decir verdad, el paso de 2D a 3D no es muy grande. OpenGL se encarga de prácticamente todo.
      Luego, un modelo no es más que un conjunto de triángulos (otra cosa ya es el formato del archivo del modelo, que puede ser más o menos tedioso de leer)
      Tenía pensado sacar alguna entrada de OpenGL 3D, pero sería más larga d elo habitual, y tendría que planearla mucho. (Además, hay tantas entradas de ello en otros blogs que casi no me merece la pena)

      Eliminar