Buscar en el Blog

lunes, 31 de octubre de 2016

OpenGL con Qt



En esta ocasión veremos un ejemplo de como usar OpenGL en Qt. Vale recalcar que solo se verá como usarlo, no se va a profundizar sobre el tema de OpenGL.


Primero vamos a crear un proyecto común y corriente(no se explicará esta parte por ser muy sencillo).
Una vez que tenemos nuestro proyecto, vamos a agregar una clase.
Clic derecho sobre el proyecto agregar nuevo... seleccionamos C++ Class

Le ponemos un nombre a nuestro Widget, por ejempo WidgetOpenGL 
y en Base class Custom. Luego colocamos QOpenGLWidget y siguiente.
 
 Finalmente les pedirá finalizar.

 Ya tenemos nuestro proyecto con nuestra clase. Ahora vamos a modificar el archivo ".pro" para agregar las referencias a opengl. Agregaremos QT +=opengl y LIBS += -lOpengl32.




Ahora nos dirigimos a la clase que habiamos agregado y agregaremos las siguientes librerias.

#include <QOpenGLWidget>
#include <QOpenGLFunctions>

#include <QGLFramebufferObjectFormat>
 
 
Modificaremos la definicion de la clase.
 
class WidgetOpenGL : public QOpenGLWidget,protected QOpenGLFunctions
 
Agregamos las funciones virtuales que vamos a reimplementar.
void initializeGL() Q_DECL_OVERRIDE;//reimplementando las funciones virtuales
void resizeGL(int w, int h)Q_DECL_OVERRIDE;
void paintGL()Q_DECL_OVERRIDE;

Al final su archivo de cabecera widgetopengl.h se vera de la siguiente manera.
 
#ifndef WIDGETOPENGL_H
#define WIDGETOPENGL_H
#include <QOpenGLWidget>
#include <QOpenGLFunctions>


#include <QGLFramebufferObjectFormat>


class WidgetOpenGL : public QOpenGLWidget,protected QOpenGLFunctions
{
public:
    WidgetOpenGL();
explicit WidgetOpenGL(QWidget *parent = 0);
protected:
void initializeGL() Q_DECL_OVERRIDE;//reimplementando las funciones virtuales
void resizeGL(int w, int h)Q_DECL_OVERRIDE;
void paintGL()Q_DECL_OVERRIDE;


};


#endif // WIDGETOPENGL_H

Las funciones que hemos declarado van a ser implementadas.Asi que nos dirigimos 
al archivo widgetopengl.cpp
 
 
Modificamos el archivo modificando el constructor.
WidgetOpenGL::WidgetOpenGL(QWidget *parent):QOpenGLWidget(parent)
 
 Agregando las funciones declaradas. 
void WidgetOpenGL::initializeGL()
{
   

}


void WidgetOpenGL::resizeGL(int w, int h)
{


}


void WidgetOpenGL::paintGL()
{

}

 En la funcion initializeGL()vamos a agregar el siguiente código 
 //esta parte sirve para poder usar las funciones de opengl
 initializeOpenGLFunctions(); 
 //Para habilitar o deshabilitar el buffer de profundidad
      glEnable(GL_DEPTH_TEST); 
  
la fucion deberia quedar asi.
void WidgetOpenGL::initializeGL()
{
    initializeOpenGLFunctions();
      glEnable(GL_DEPTH_TEST);


}
 
la fucion resizeGL no la tocaremos por ahora, esta sirve como su mismo nombre 
lo dice para redimensionar el contenido cuando la ventana cambia de tamaño.
 
Ahora vamos con el painGL. Aqui codificaremos nuestras instrucciones openGL.
Por ejemplo, si deseamos mostrar un rectangulo, usaremos la GL_POLYGON. Si han 
usado openGL con glut, esto es lo mismo.
 
void WidgetOpenGL::paintGL()
{
    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
    glDepthFunc(GL_LESS);
    glEnable(GL_DEPTH_TEST);
    glShadeModel(GL_SMOOTH);
    // Resetear transformaciones
    glLoadIdentity();


    // LADO IZQUIERDO: lado verde
    glBegin(GL_POLYGON);


    glColor3f( 1.0, 0.0, 0.0 );
    glVertex3f(  0.5, -0.5, -0.5 );      // P1 es rojo
    glColor3f( 0.0, 1.0, 0.0 );
    glVertex3f(  0.5,  0.5, -0.5 );      // P2 es verde
    glColor3f( 0.0, 0.0, 1.0 );
    glVertex3f( -0.5,  0.5, -0.5 );      // P3 es azul
    glColor3f( 1.0, 0.0, 1.0 );
    glVertex3f( -0.5, -0.5, -0.5 );      // P4 es morado

    glEnd();
    glFlush();
      this->makeCurrent();
}

 
 
 Con esto ya tenemos lista nuestra clase. Ahora vamos a usarla en nuesta ventana.
En nuestra ventana(formulario) insertamos un widget.
 
 una vez agregado el widget hacemos clic derecho sobre el y elegimos Promote to...
 



En promoted class name ingresamos el nombre de la clase que  habiamos creado.





Luego le damos clic en Add.

Finalmente click en Promote.

Ejecutamos el proyecto y este es el resultado.


Aqui podran descargar el codigo fuente de este ejemplo y el ejemplo del cubo.

No hay comentarios:

Publicar un comentario

Google+ Seguidores