研究開発日誌

CG研究・開発のちょっとしたメモ書き

GLView

2014-12-24 OpenGL UI

QtでOpenGL描画を行うためのWidget.

以下が,おおよそ最小の実装になります.

class GLView :  public QGLWidget
{
    Q_OBJECT
public :
    //! Constructor.
    GLView(QWidget *parent = 0);

    //! Destructor.
    virtual ~GLView(){}

private:
    virtual void initializeGL();
    virtual void paintGL();
    virtual void resizeGL(int width, int height);
};

initializeGL関数内では,OpenGLが初期化された際の処理を行います.例えば,シェーダーのコンパイルやテクスチャデータの作成,ステートの初期化などがこれにあたります. paintGL関数では,実際にOpenGLの関数群をコールして,Viewへの描画を行います. resizeGL関数はWidgetのサイズが更新された時に呼ばれ,viewportの更新等を行います.

以下,実装部分です.

GLView::GLView(QWidget *parent)
    : QGLWidget(QGLFormat(QGL::SampleBuffers|QGL::AlphaChannel), parent)
{
    setMouseTracking( true );
    setFocusPolicy(Qt::StrongFocus);
}

void GLView::initializeGL()
{
    qglClearColor(QColor(255,0,0));
    // glEnable(GL_DEPTH_TEST);
}

void GLView::paintGL()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glColor3d( 0.3, 0.3, 0.8);
    glBegin(GL_QUADS);
    glVertex2d(0.1, 0.1);
    glVertex2d(0.9, 0.1);
    glVertex2d(0.9, 0.9);
    glVertex2d(0.1, 0.9);
    glEnd();
}

void GLView::resizeGL(int width, int height)
{
    glViewport(0, 0, width, height);
}

QGLFormat(QGL::SampleBuffers|QGL::AlphaChannel)は一般的なQGLWidgetのフレームバッファフォーマットです.QGL::AlphaChannelを指定することによりアルファ付の画像を扱えるようになります.QGLWidgetのマウス操作はデフォルトでは無効になっているので,setMouseTracking( true )とすることによりマウス操作を有効にすることができます.