Introducción a OpenGL Moderno

OpenGL es una API de gráficos 3D multiplataforma, además existen adaptaciones de la API para dispositivos móviles (OpenGL ES), y para navegadores web (WebGL), además esta soportada por las principales tarjetas gráficas como ATI, NVidia, incluso procesadores gráficos integrados de AMD e Intel, OpenGL junto a DirectX son las dos API gráficas mas populares existentes a la fecha.

Los procesadores gráficos han evolucionado mucho en los últimos tiempos por lo que la API OpenGL también se ha actualizado, de tal modo que podemos aprovechar al máximo la potencia del hardware, una tarjeta gráfica actual modesta pude tener unos 2,000 o más núcleos de procesamiento, podemos aprovechas todos estos núcleos con la programación de shaders (GLSL) y las nuevas funciones agregadas, a partir de la versión OpenGL 3.1 el uso de shaders es obligatorio.

Creación de una ventana


Antes de comenzar debemos crear la ventana que mostrara los gráficos, la API OpenGL no cuenta con funciones para esta tarea por lo que recurriremos a librerías externas como: Freeglut y GLFW, ambas multiplataforma y muy fáciles de usar, usaremos la última, sin embargo no es estrictamente necesario cada uno puede usar la que más le guste o incluso programar directamente con la API del sistema para crear ventana.

Inicializar y crear una ventana GLFW.

if (!glfwInit()) return false;

window = glfwCreateWindow(800, 600, "Ventana OpenGL", NULL, NULL);
if (!window)
{
     glfwTerminate();
     return false;
}

glfwMakeContextCurrent(window);
glfwSwapInterval(1);

Para tener acceso a las extensiones OpenGL usaremos GLEW.

if (glewInit() != GLEW_OK) {
    glfwTerminate();
    return false;
}

Creamos el bucle de mensajes, los procesamos y llamamos a método de dibujo.

while (!glfwWindowShouldClose(window))
{
     double seconds = glfwGetTime();
     onrender(seconds);

     glfwSwapBuffers(window);
     glfwPollEvents();
}

glfwDestroyWindow(window);
glfwTerminate();

Encapsularemos todo el código en una clase C++ OpenGLWindow, proporcionaremos varios métodos virtuales, el principal onrender(float) que debemos sobrescribir para colocar el código de dibujo, las librerías GLFW y GLEW están incluidas en el proyecto.

Utilizar la clase OpenGLWindow en C++

#include "OpenGLWindow.hpp"

class Tutorial_01 : public OpenGLWindow {
  void onrender(double time) override {
     glClear(GL_COLOR_BUFFER_BIT);
     
     glMatrixMode(GL_PROJECTION);
     glLoadIdentity();
     glOrtho(-aspect_ratio, aspect_ratio, -1.f, 1.f, 1.f, -1.f);
     
     glMatrixMode(GL_MODELVIEW);
     glLoadIdentity();
     glRotatef(static_cast<GLfloat>(time) * 50.f, 0.f, 0.f, 1.f);
     
     glBegin(GL_TRIANGLES);
       glColor3f(1.f, 0.f, 0.f);
       glVertex3f(-0.6f, -0.4f, 0.f);
       glColor3f(0.f, 1.f, 0.f);
       glVertex3f(0.6f, -0.4f, 0.f);
       glColor3f(0.f, 0.f, 1.f);
       glVertex3f(0.f, 0.6f, 0.f);
     glEnd();
  }
};

int main(void) {
  Tutorial_01 win_app;
  if (win_app.init("Tutoriales OpenGL")) {
     win_app.info();
     win_app.run();
  }
  return 0;
}

Este ejemplo utiliza funciones de la API antigua ya que hasta el momento no saber como utilizar la API moderna y necesitamos visualizar un gráfico en pantalla para probar nuestra ventana, no entraremos en detalles sobre el código presentado, en el siguiente tutorial iremos paso a paso partiendo del uso de la clase OpenGLWindow para crear nuestras ventanas.

opengl moderno
Este y los siguientes tutoriales estarán configurados para ser generados con CMAKE por lo que requerimos esta herramienta, todas las librerías utilizadas serán incluidas en el proyecto, debemos tener una tarjeta gráfica con soporte mínimo para OpenGL 3.1, pueden verificar la versión OpenGL en la salida de consola.


Compilar los ejemplos


Todos los ejemplos de esta serie de tutoriales estarán ubicados en el repositorio github: Tutoriales OpenGL Moderno, se requieren las siguientes librerías externas GLEW, GLFW, GLM, a medida que avancemos agregaremos otras, estas librerias deben ser instaladas siguiendo los siguientes tutoriales: Instalación de GLEW, Intalación de GLM y GLFW, una  vez instaladas usaremos CMAKE para generar el proyecto para Visual Studio 14, a medida que avancemos iremos adecuando los CMakeLists.txt para soportar varios generadores y plataformas como Linux, Mac Os.

GitHub: Introducción a OpenGL Moderno

Comentarios

Entradas populares de este blog

Conectar SQL Server con Java

Procesamiento de imágenes en OpenCV

Acceso a la webcam con OpenCV

Entrenar OpenCV en Detección de Objetos

Gauss Seidel y Jacobi