{{notification.text}}

MirGames

Небольшой тутор о том, как очень просто создавать кроссплатформенные (Windows, Linux, Mac, а, с небольшими модификациями, даже Android + iOS) приложения на OpenGL легко и просто.

Сегодня мой друг попробовал Qt. Он решил вывести на экран текстурку. У него возникли некоторые проблемы и он попросил меня помочь. Так Qt увидел и я :-) После того, как мы разобрались с проблемой, я решил немного упростить его код, чтобы получился очень-очень маленький пример, и выложить его сюда. Итак, наше приложение будет выводить картинку на весь экран. А сама картинка будет зашита в ресурсы. #

Итак, создаём проект. В main.cpp записываем:

#include <QApplication>
#include "oglquad.h"

int main(int argc, char *argv[]) {
    QApplication a(argc, argv);
    OGLQuad      oglQuad;

    oglQuad.showFullScreen();
    return a.exec();
}

Видно, что тут есть некий OGLQuad - это наш класс, который мы наследуем от QGLWigdet:

#ifndef OGLQUAD_H
#define OGLQUAD_H

#include <QGLWidget>

class OGLQuad : public QGLWidget
{
protected:
    virtual void initializeGL();
    virtual void paintGL     ();
private:
    GLuint texId;
};

#endif // OGLQUAD_H

А вот и реализация класса:

#include "oglquad.h"
#include <QDebug>
#include <QtOpenGL>

void OGLQuad::initializeGL()
{
    glEnable( GL_TEXTURE_2D );
    texId = bindTexture(QPixmap(":/tex.png") ) ;
}

// ----------------------------------------------------------------------
void OGLQuad::paintGL()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glBindTexture(GL_TEXTURE_2D, texId);
    glBegin(GL_TRIANGLE_FAN);
        glTexCoord2d(0.0,0.0); glVertex2d(-1.0,-1.0);
        glTexCoord2d(1.0,0.0); glVertex2d( 1.0,-1.0);
        glTexCoord2d(1.0,1.0); glVertex2d( 1.0, 1.0);
        glTexCoord2d(0.0,1.0); glVertex2d(-1.0, 1.0);
    glEnd();
}

Как видите, всё очень-очень просто. Но есть нюансы:

  1. Не нужно вызывать swapBuffers() вручную - Qt это делает за нас. Если это не требуется, то это поведение можно изменить.
  2. Загрузить текстуры из конструктора не получится. Нужно использовать именно initializeGL для работы с Qt-OpenGL . Если всё же попытаться вызвать bindTexture из конструктора, то вызов просто повесит поток и программа не будет работать.

С тем, как засунуть картинку в ресурсы, надеюсь, вы сможете разобраться сами, например, поиграясь с файлом проекта

27.05.14 19:48