GLView

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

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

GLView.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
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 )とすることによりマウス操作を有効にすることができます.