QtでOpenGL描画
※環境はQt SDK 4.7.3, OpenGL 2.1
QtでOpenGLを利用するにはQGLWidgetクラスを利用します。このクラスはOpenGL絡みの抽象メソッドを3つ持っています。
・initializeGL(初期化処理)
・resizeGL(フレームバッファサイズ変更時処理)
・paintGL(描画処理)
実際にはQGLWidgetの派生クラスのメソッド内に実処理を書き加えることになります。
Qtプロジェクト作成
まずは空プロジェクトを作成します。(ここではQGL_test.proという名称を付けたとしましょう。)
そしてC++ソースをプロジェクトに追加してmain関数を作成します。
main.cpp
#include <qapplication.h> #include "canvaswidget.h" int main( int argc, char **argv ) { QApplication app(argc, argv); CanvasWidget widget; widget.setGeometry( 100, 100, 200, 300 ); widget.show(); return app.exec(); }
QGLWidgetの派生クラスであるCanvasWidgetクラスをプロジェクトに追加し、描画処理を実装します。
canvaswidget.h(インクルードガード略)
#include <QGLWidget> class CanvasWidget : public QGLWidget { Q_OBJECT public: explicit CanvasWidget(QWidget *parent = 0 , const char *name = 0); virtual void initializeGL(); virtual void resizeGL( int width, int height ); virtual void paintGL(); signals: public slots: };
canvaswidget.cpp
#include "canvaswidget.h" CanvasWidget::CanvasWidget(QWidget *parent, const char *name) : QGLWidget(parent){} void CanvasWidget::initializeGL(){ int width = geometry().width(); int height = geometry().height(); glViewport(0,0, width, height); glMatrixMode(GL_PROJECTION); glOrtho(-width *0.5, width*0.5, -height* 0.5, height* 0.5, -1.0, 1.0); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); gluLookAt(0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0); } void CanvasWidget::resizeGL( int width, int height ){ glViewport(0,0,width,height); } void CanvasWidget::paintGL(){ glClearColor(0.0f,0.0f,0.0f,1.0f); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glLoadIdentity(); glColor4f(1.0f,0.0f,0.0f,1.0f); glBegin(GL_TRIANGLES); glVertex3f( -100.0f, 100.0f, 0.0f); glVertex3f(-100.0f,-100.0f, 0.0f); glVertex3f( 100.0f,-100.0f, 0.0f); glEnd(); }