bambooflow Note

クラス

最終更新:

bambooflow

- view
メンバー限定 登録/ログイン

QtでOpenGL:クラス


QtでOpenGLを扱うためのクラスを記載ます。



QGLWidget



QGLWidgetは、OpenGLのキャンパスの役割をなします。

#include <QtOpenGL>
 
class GLWidget : public QGLWidget
{
    Q_OBJECT
public:
    GLWidget(QWidget *parent = 0);
    ~GLWidget();
 
protected:
    virtual void initializeGL();
    virtual void resizeGL( int w, int h );
    virtual void paintGL();
};
 


QGLShaderProgram


プログラマブルシェーダを利用する場合に必要になります。
このクラスを用いるとシェーダをオブジェクトとして扱うことになります。

#include <QtOpenGL/QGLShaderProgram>

  • 使い方
QGLShaderProgram *program;
 
     program = new QGLShaderProgram();
 
     // Compiling vertex shader
     if (!program->addShaderFromSourceFile(QGLShader::Vertex, ":/vshader.glsl"))
         close();
 
     // Compiling fragment shader
     if (!program->addShaderFromSourceFile(QGLShader::Fragment, ":/fshader.glsl"))
         close();
 
     // Linking shader pipeline
     if (!program->link())
         close();
 
     // Binding shader pipeline for use
     if (!program->bind())
         close();
 


QGLFunctions(Qt4.8)


OpenGL/ES 2.0 APIが揃っています。
VBOなんかはこれを使う必要があるかもしれません。

#include <QtOpenGL/QGLFunctions>

  • glActiveTexture
  • glGenBuffers
  • glGenFramebuffers
  • glGenRenderbuffers
  • glBindBuffer
  • glBindFramebuffer
  • glBindRenderbuffer
  • glBufferData
  • glBufferSubData
  • glVertexAttrib
  • glUniform
  • glVertexAttribPointer
など(ここに記載したのは一部です)


ダイレクトに継承して使う方法を記載します。
class MyGLWidget : public QGLWidget, protected QGLFunctions
 {
     Q_OBJECT
 public:
     MyGLWidget(QWidget *parent = 0) : QGLWidget(parent) {}
 
 protected:
     void initializeGL();
     void paintGL();
 };
 
 void MyGLWidget::initializeGL()
 {
     initializeGLFunctions();
 }
 


便利クラス


QVector2D


#include <QVector2D>

QVector3D


#include <QVector3D>

QMatrix4x4


4x4マトリックスを扱うクラス。
  • setToIdentity
  • scale
  • rotate
  • translate
  • ortho
  • frustum
  • perspective
  • lookAt
といったGLSLに役立つ大抵の機能が備わっています。

#include <QMatrix4x4>


  • 使い方
void GLWidget::resizeGL(int w, int h)
{
    glViewport(0, 0, w, h);
 
    //プロジェクション・マトリックス設定
    glMatrixMode (GL_PROJECTION);
    glLoadIdentity();
    QMatrix4x4 m;
    m.perspective(30, (qreal)w / (qreal)h, 1.0f, 100.0f);
    glMultMatrixd(m.data());
    //gluPerspective(30.0, (double)w / (double)h, 1.0, 100.0);  // ※
}
 

//モデル・ビュー・マトリックス設定
    glMatrixMode (GL_MODELVIEW);
    glLoadIdentity();
 
    //カメラ設定
    QMatrix4x4 m;
    m.lookAt(QVector3D(3.0, 4.0, 5.0),
             QVector3D(0.0, 0.0, 0.0),
             QVector3D(0.0, 1.0, 0.0) );
    glMultMatrixd(m.data());
    //gluLookAt(3.0, 4.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);  // ※
 

※注意 : glu*はQtのバージョンによって使えなくなる可能性があります


QQuaternion rotation;
 
QMatrix4x4 projection;
   projection.setToIdentity();
   projection.perspective(fov, w/h, zNear, zFar);
 
QMatrix4x4 matrix;
   matrix.translate(0.0, 0.0, -5.0);
   matrix.rotate(rotation);
 
   // Set modelview-projection matrix
   program->setUniformValue("mvp_matrix", projection * matrix);
 

QQuaternion


Quaternionを扱うクラス

#include <QQuaternion>


  • 使い方
QVector3D rotationAxis;
qreal angularSpeed;
QQuaternion rotation;
 
  rotation = QQuaternion::fromAxisAndAngle(rotationAxis, angularSpeed) * rotation;
 


QImage


画像データを扱うクラス。

#include <QImage>


  • 使い方
GLuint texture = bindTexture(QImage(":/image.jpg"));
 


GLuint texture);
 
  QImage img("image.jpg");
  QImage gl_img = QGLWidget::convertToGLFormat(img);
 
  glGenTextures(1, &texture);
 
  glBindTexture(GL_TEXTURE_2D, texture);
 
  glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA,
              gl_img.width(),
              gl_img.height(),
              0, GL_RGBA, GL_UNSIGNED_BYTE,
              gl_img.bits() );
 


めも


GLSL環境は、Qt v4.6あたりからよくなってきています。
v4.8あたりから使い物になってくるかもしれません。(たぶん)





参考

タグ:

Qt OpenGL
記事メニュー
目安箱バナー