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なんかはこれを使う必要があるかもしれません。
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あたりから使い物になってくるかもしれません。(たぶん)
v4.8あたりから使い物になってくるかもしれません。(たぶん)