2012年1月2日月曜日

( Qt C++ )OpenGLを使った描画


どうも新年あけましておめでとうございます。
皆さんいかがお過ごしですか?私は寒い・やかましい・長い、三重苦そろったお笑い特番にうんざりしている次第であります。...なんとかなりませんかねアレ。毎年、付き合いで見ざる得ないんですよね。とりあえず過剰な自虐、遮る会話、キンキン声...etcやめてくんねぇかなぁ...。どう考えても下品で貧相でやりすぎ。そりゃ視聴率もさがるっての。


はい、それではOpenGLを使った描画をやっていきます。
はじめに宣言しておきます。私はOpenGLは初めて使います。ですので、OpenGLの関数の説明はまったくできません。Qtではこんな風に使えますよ的なサンプルとして見てください。

また、OpenGLはあらかじめインストールされていることが前提となります。windowsやmacのインストール方法はわかりません。他のサイトを参考にしてください。ubuntuなどlinuxではたぶんパッケージが用意されているのでapt-getでそれらをインストールしてください。私の環境(ubuntu)では端末で
sudo apt-get install freeglut3 freeglut3-dev
でOKでした。

サンプルは独自のものを使います。
そして、いつものようにQtCreaterの使用を前提とします。(QtCreaterなどの使い方は ”Qtをはじめよう" を見てください。)


 また、.proファイルに以下のような感じで
QT += core gui \
            opengl
(opengl)を追加済みであるとします。
ではコードを


(custumopengl.h)
#include <QGLWidget>
#include <qgl.h>

class CustumOpenGL : public QGLWidget
{
    Q_OBJECT
public:
    explicit CustumOpenGL(QWidget *parent = 0);
   
protected:
    void initializeGL();
    void resizeGL(int width, int height);
    void paintGL();   
};


(custumopengl.cpp)
#include "custumopengl.h"

CustumOpenGL::CustumOpenGL(QWidget *parent) :
    QGLWidget(parent)
{
}

void CustumOpenGL::initializeGL()
{
    glClearColor(0.9, 0.9, 0.9, 0.9);
    glOrtho(0.0, 1.0, 0.0, 1.0, -1.0, 1.0);
}

void CustumOpenGL::resizeGL(int width, int height)
{
    glViewport(0, 0, width, height);
    glLoadIdentity();
    glOrtho(0.0, 1.0, 0.0, 1.0, -1.0, 1.0);
}

void CustumOpenGL::paintGL()
{
    glClear(GL_COLOR_BUFFER_BIT);
    glBegin(GL_TRIANGLES);
    glColor3d(0.0, 0.0, 0.0);
    glVertex2d(0.2,0.1);
    glColor3d(0.0, 0.0, 1.0);
    glVertex2d(0.6, 0.6);
    glColor3d(0.0, 0.0, 0.0);
    glVertex2d(0.3,0.6);
    glEnd();
}


QGLWidgetを継承したというところが普通のやり方と違いますね。前述のとおり各関数の説明は省きます。
このウィジットの使い方は

(main.cpp)
#include <QtGui/QApplication>
#include "custumopengl.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    CustumOpenGL *gl = new CustumOpenGL();
    gl->resize(300, 300);
    gl->show();
   
    return a.exec();
}

のようになります。
実行すると以下のようになります。
以上です。