QtOpenGLモジュール使ってOpenGL

QtのQtOpenGLモジュールを使ってみました。
何故かあんまり日本語情報無いのね。
おかげでサンプルの謎な部分が何やってるのか検索かけてもさっぱり出てこない。
みんな違うの使ってるのだろうか。
当面はソースとにらめっこすることになったりするかもしれない。


とりあえず今の所分かった必須呪文たち。

/* main.cpp */
#include "InheritQGLW.h"

int main(int argc, char *argv[]){
    QApplication app(argc, argv);
    if(!QGLFormat::hasOpenGL()){
        /* OpenGLがサポートされていない時 */
        return 1;
    }
    InheritQGLW iqglw;
    iqglw.setWindowTitle(QObject::tr("InheritQGLWidget"));
    iqglw.resize(300,300);
    iqglw.show();

    return app.exec();
}
/* InheritQGLW.h */
#include <QtOpenGL>

class InheritQGLW : public QGLWidget 
{
    Q_OBJECT
public:
    InheritQGLW(QWidget *parent = NULL)
        : QGLWidget(parent)
    {
        /*
         * OpenGLのディスプレイコンテキストを指定とか、プライベート変数の初期化とかしてるらしい。
         * QGLWidgetを継承したクラスのインスタンスを複数表示するときに困らないための呪文。
         */
        this->setFormat(QGLFormat(QGL::DoubleBuffer | QGL::DepthBuffer));
    }

protected:
    // インスタンス生成後、初めてpaintGL()が呼ばれる時にpaintGL()より先に呼ばれる。以降呼ばれない。
    void initializeGL()
    {
        glClearColor(0.5, 0.5, 0.5, 1.0);
    }

    // ウィジェットサイズが変更された時に呼ばれる。中に何書けばいいかはまだちゃんと理解していない。
    void resizeGL(int width, int height)
    {
        glViewport(0, 0, width, height);
    }

    // 描画メソッド。ここで描画する。
    void paintGL(){
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    }
};


なお、initializeGL() , resizeGL() , paintGL() はQGLWidgetでvirtual付けて定義されているメソッドをオーバーライドしている形になる。
オーバーライド必須というか、普通に作れば3つとも必要になる。
また、上記3メソッドがQt側で呼ばれた流れ以外でOpenGLの関数を呼ぶ場合、OpenGLの関数より先にmakeCurrent()メソッドを呼ばないと意図しない所に描画してしまう可能性がある。