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.