約 2,562,522 件
https://w.atwiki.jp/bambooflow/pages/318.html
QtでOpenGL ここでは、QtでOpenGLを描画する方法を記載します。 QtのOpenGLに対するサポート状況がよくなってきたので、まとめていきます。 まだコンテンツの順番はバラバラです。 ご容赦ください。 CreatorでOpenGL CreatorでOpenGL(v4.7対応) OpenGLをQtで使うメリット クラス タイマーを使ったアニメーション テクスチャマッピング バージョンの確認 空のウィジェット
https://w.atwiki.jp/bambooflow/pages/316.html
QtでOpenGL:クラス QtでOpenGLを扱うためのクラスを記載ます。 QtでOpenGL:クラスQGLWidget QGLShaderProgram QGLFunctions(Qt4.8) 便利クラスQVector2D QVector3D QMatrix4x4 QQuaternion QImage めも 参考 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あたりから使い物になってくるかもしれません。(たぶん) 参考 http //doc.qt.nokia.com/4.8-snapshot/opengl-cube.html
https://w.atwiki.jp/bambooflow/pages/317.html
QtでOpenGL:バージョンの確認 QtでOpenGL:バージョンの確認QGLForamtを使う glGetStringで確認 QGLForamtを使う Qt上で動作するOpenGLのバージョンを確認するには、 QGLFormat openGLVersionFlags を使います。 QGLFormat #include QtGui/QApplication #include QtGui/QMessageBox #include QtOpenGL/QGLFormat int main(int argc, char *argv[]) { QApplication a(argc, argv); if ((QGLFormat openGLVersionFlags() QGLFormat OpenGL_Version_1_5) == 0) { QMessageBox critical(0, "OpenGL features missing", "OpenGL version 1.5 or higher is required.\n" "The program will now exit."); return -1; } // nothing. return a.exec(); } glGetStringで確認 OpenGLの機能であるglGetStringを使います。 #include QDebug void GLWidget initializeGL() { qDebug() "OpenGL Ver. " (const char*)(glGetString(GL_VERSION)); qDebug() "Shader Ver. " (const char*)(glGetString(GL_SHADING_LANGUAGE_VERSION)); qDebug() "Vendor " (const char*)(glGetString(GL_VENDOR)); qDebug() "GPU " (const char*)(glGetString(GL_RENDERER)); } 例) OpenGL Ver. 3.3.0 Shader Ver. 3.30 NVIDIA via Cg compiler Vendor NVIDIA Corporation GPU GeForce GTX 260/PCI/SSE2 initializeGLで記述しているのは、コンストラクタで使おうとすると何も返ってこないからです。
https://w.atwiki.jp/bambooflow/pages/314.html
QtでOpenGL:空のウィジェット(QGLWidget) QtでOpenGL:空のウィジェット(QGLWidget)QGLWidget QGLWidgetの使い方 プロジェクトとmainの準備 QGLWidget QtでOpenGLを描画するには、QGLWidgetを用います。 QGLWidgetは、次の抽象メソッドを持ちます。 メソッド 説明 initializeGL() OpenGLの初期化で呼ばれる resizeGL() ウィンドウのリサイズが行われたとき呼ばれる paintGL() 描画処理で呼ばれる QGLWidgetの使い方 QGLWidgetを使うには、クラスを派生させます。 ここでは、QGLWidgetを派生させたGLWidgetの作り方を示します。 glwidget.h #ifndef GLWIDGET_H #define GLWIDGET_H #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(); }; #endif // GLWIDGET_H glwidget.cpp #include "glwidget.h" GLWidget GLWidget(QWidget *parent) QGLWidget(parent) { } GLWidget ~GLWidget() { } void GLWidget initializeGL() { glClearColor(0.3, 0.3, 0.3, 1.0); // 初期化処理 } void GLWidget resizeGL( int w, int h ) { glViewport(0, 0, w, h); // リサイズ時処理 } void GLWidget paintGL() { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //描画処理 } プロジェクトとmainの準備 GLWidgetクラスを作成しただけではプログラムは動きません。 あと、必要なのはmain関数とプロジェクトファイルです。 main関数は以下のように作ります。 main.cpp #include QtGui/QApplication #include "glwidget.h" int main(int argc, char *argv[]) { QApplication app(argc, argv); GLWidget w; w.setGeometry(100, 100, 400, 300); w.show(); return app.exec(); } sample.pro QT += core gui opengl TARGET = samole TEMPLATE = app SOURCES += main.cpp \ glwidget.cpp HEADERS += glwidget.h ここで、 QT += opengl が必要です。 ビルドは、 % qmake % make です。
https://w.atwiki.jp/bambooflow/pages/86.html
Qtメモ Qtの使いかたをめも。 Qt3とQt4の開発スタイルはかなり変わってきます。 個人的にはQt4の方がやりやすいです。 項目 Qt3/ファイル読み込み Qt4 Qt4/Creator Qt4/Creator/OpenGLのはじめ Qt4/Creator/OpenGLのはじめ(v4.7対応) Qt4/Creator/バージョン管理ツールGitを使う Qt4/Creator/設定 Qt4/Designerを使う Qt4/OpenGL Qt4/OpenGL/OpenGLをQtで使うメリット Qt4/OpenGL/クラス QT4/OpenGL/タイマーを使ったアニメーション Qt4/OpenGL/テクスチャマッピング Qt4/OpenGL/バージョンの確認 Qt4/OpenGL/空のウィジェット Qt4/スレッドQthread Qt4/ファイル読み込み Qt4/外部コマンド実行 Qt4インストール 最初の一歩HelloWorld 参考 http //qt.linux-life.net/4/doc/ja/index.html 以上
https://w.atwiki.jp/bambooflow/pages/158.html
Qt4 Creator Creator/OpenGLのはじめ Creator/OpenGLのはじめ(v4.7対応) Creator/バージョン管理ツールGitを使う Creator/設定 Designerを使う OpenGL OpenGL/OpenGLをQtで使うメリット OpenGL/クラス OpenGL/タイマーを使ったアニメーション OpenGL/テクスチャマッピング OpenGL/バージョンの確認 OpenGL/空のウィジェット スレッドQthread ファイル読み込み 外部コマンド実行 リンク Qt4.6Document
https://w.atwiki.jp/bambooflow/pages/324.html
QtでOpenGL:テクスチャマッピング QtでOpenGL:テクスチャマッピング概要 画像をリソースに追加する手順 ソースコード まとめ 概要 Qtでのテクスチャマッピングは、簡単です。 Qtは標準クラスで画像を読み込むクラスを持っています。 また、併せてテクスチャをバインドする専用をメソッドを使うことで、テクスチャマッピングの手続きが簡略化することができます。 通常の手続きだと、 画像の読み込み ↓ glGenTextures(GL_TEXTURE_2D, texture); ↓ glBindTexture(GL_TEXTURE_2D, texture); ↓ glTexImage2D( .. ); となり、面倒です。 これがQtだと、 texture = bindTexture(QImage(" /image.jpg", GL_TEXTURE_2D)); なんと1つのメソッドでできてしまいます。 Qtでは、画像を扱うにあたってリソースを追加する作業が発生します。 以下にその方法を記載しますが、手順はそれほど難しくありません。 画像をリソースに追加する手順 Qt Creatorの操作方法について説明します。 メニュの ファイル→ファイル/プロジェクトの新規作成 を選択します。 Qt→Qtリソースファイル を選択します。 名前をここでは"textures"とします 「次へ」をクリックします。 そのまま「完了」をクリックします 「追加」をクリックし、「プレフィックス」を"/"とします さらに「追加」をクリックし、「ファイルの追加」でここでは"image.jpg"を選択します これで、画像がリソースとして追加されました。 追加が完了すると、 textures.qrc というリソースファイルが作成されます。 また、プロジェクト(.pro)内には RESOURCES += \ textures.qrc と追加されます。 ソースコード glwidget.h #ifndef GLWIDGET_H #define GLWIDGET_H #include QBasicTimer #include QGLWidget class GLWidget public QGLWidget { Q_OBJECT public GLWidget(QWidget *parent = 0); ~GLWidget(); protected void timerEvent(QTimerEvent *e); protected virtual void initializeGL(); virtual void resizeGL( int w, int h ); virtual void paintGL(); private QBasicTimer *timer; private GLfloat angle; GLuint texture; }; #endif // GLWIDGET_H glwidget.cpp #include "glwidget.h" GLWidget GLWidget(QWidget *parent) DrawStuff(parent), timer(new QBasicTimer) { } GLWidget ~GLWidget() { glDeleteTextures(1, texture); delete timer; timer = 0; } void GLWidget timerEvent(QTimerEvent *e) { Q_UNUSED(e); updateGL(); } void GLWidget initializeGL() { glClearColor(0.5, 0.5, 0.5, 1.0); glEnable(GL_DEPTH_TEST); //カリング:表面のみ表示 glEnable(GL_CULL_FACE); glCullFace(GL_BACK); //光源有効 glEnable(GL_LIGHTING); glEnable(GL_LIGHT0); //光源の設定 GLfloat light_position[] = { -50.0, 50.0, 50.0, 1.0 }; GLfloat light_ambient[] = { 0.2, 0.2, 0.2, 1.0 }; GLfloat light_diffuse[] = { 1.0, 1.0, 1.0, 1.0 }; GLfloat light_specular[] = { 1.0, 1.0, 1.0, 1.0 }; glLightfv( GL_LIGHT0, GL_POSITION, light_position ); glLightfv( GL_LIGHT0, GL_AMBIENT, light_ambient ); glLightfv( GL_LIGHT0, GL_DIFFUSE, light_diffuse ); glLightfv( GL_LIGHT0, GL_SPECULAR, light_specular ); //テクスチャ 初期化 texture = bindTexture(QImage(" /image.jpg")); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); timer- start(16, this); } void GLWidget resizeGL( int w, int h ) { glViewport(0, 0, w, h); //プロジェクション・マトリックス設定 glMatrixMode (GL_PROJECTION); glLoadIdentity(); gluPerspective(30.0, (double)w / (double)h, 1.0, 100.0); } void GLWidget paintGL() { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //モデル・ビュー・マトリックス設定 glMatrixMode (GL_MODELVIEW); glLoadIdentity(); //カメラ設定 gluLookAt(3.0, 4.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0); glPushMatrix(); { // 平面表示 //材質設定 //GLfloat color[] = { 0.8, 0.2, 0.2, 1.0 }; GLfloat color[] = { 1.0, 1.0, 1.0, 1.0 }; glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, color); glRotatef(angle, 0.0, 1.0, 0.0); glEnable(GL_TEXTURE_2D); glBindTexture(GL_TEXTURE_2D, texture); glBegin(GL_QUADS); glNormal3f(0.0, 1.0, 0.0); glTexCoord2f(2.0, 0.0); glVertex3f(-1.0, 0.0, -1.0); glTexCoord2f(2.0, 2.0); glVertex3f(-1.0, 0.0, 1.0); glTexCoord2f(0.0, 2.0); glVertex3f( 1.0, 0.0, 1.0); glTexCoord2f(0.0, 0.0); glVertex3f( 1.0, 0.0, -1.0); glEnd(); glDisable(GL_TEXTURE_2D); glBindTexture(GL_TEXTURE_2D, 0); } glPopMatrix(); angle = (angle 360.0) ? angle-360.0 angle+1; } まとめ Qtを使うことでテクスチャマッピングがかなりハードルが下がった感じがします。 面倒な画像読み込み処理がなくなったことが大きいです。 ただ、Qtを使いこなすまでのハードルが高いですが。。。
https://w.atwiki.jp/bambooflow/pages/245.html
CreatorでOpenGLをはじめる方法メモ Qt4.6 Qt4.7の場合はこちら CreatorでOpenGLをはじめる方法メモはじめかた ソースコードの修正 コンパイル&実行 はじめかた プロジェクトの作成 ここではGUIアプリケーション作成を選択します。 プロジェクト名はhello_glとします。 パスは、ここでは"C \work"としました。 OpenGLを使用するので、QtOpenGLにチェックを入れます。 基本クラスは、QWdigetを選択します。(後にQGLWidgetを設定するために) これで、プロジェクト作成は完了です。 ソースコードの修正 次にソースコードを修正します。 下記のファイルは、自動で生成されると思います。 main.cpp widget.cpp widget.h widget.ui main.cppは変更しません。 widget.uiはQtのユーザフォーム設定なので変更しません。 変更するのは、widget.cppとwidget.hです。 widget.h #ifndef WIDGET_H #define WIDGET_H #include QWidget #include QGLWidget // = 追加 namespace Ui { class Widget; } class Widget public QGLWidget { // = QWidgetをQGLWdigetに変更 Q_OBJECT public Widget(QWidget *parent = 0); ~Widget(); protected void changeEvent(QEvent *e); virtual void initializeGL(); // = 追加 virtual void resizeGL( int w, int h ); // = 追加 virtual void paintGL(); // = 追加 private Ui Widget *ui; }; #endif // WIDGET_H widget.cpp #include "widget.h" #include "ui_widget.h" Widget Widget(QWidget *parent) QGLWidget(parent), // = QWidgetをQGLWdigetに変更 ui(new Ui Widget) { ui- setupUi(this); } Widget ~Widget() { delete ui; } void Widget changeEvent(QEvent *e) { QWidget changeEvent(e); switch (e- type()) { case QEvent LanguageChange ui- retranslateUi(this); break; default break; } } void Widget initializeGL() // = 追加 { glClearColor(0.3, 0.3, 0.3, 1.0); } void Widget resizeGL( int w, int h ) // = 追加 { glViewport(0, 0, w, h); glLoadIdentity(); glOrtho( -w/200.0, w/200.0, -h/200.0, h/200.0, -1.0, 1.0); } void Widget paintGL() // = 追加 { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glColor3d(1.0, 0.0, 0.0); glBegin(GL_POLYGON); glVertex2d(-0.5, -0.5); glVertex2d(0.5, -0.5); glVertex2d(0.5, 0.5); glVertex2d(-0.5, 0.5); glEnd(); //glFlush(); } コンパイル&実行 デバッグを実行(F5)します。
https://w.atwiki.jp/ppnlab/pages/17.html
最終更新:2013年06月11日 (火) 17時40分31秒 Qtのビルドメモです.現在,OpenCVビルドのためのビルド方法となっています.デモ・Qtを使ったプログラムのためのビルドになっているかわかりません. Note VisualStudio2012導入により,msvc2010でコンパイルエラー → 解決 32bit nmake 成功.デモはWebkit,OpenGL等のdll不足により動かず.ビルドしたい. 64bit ビルド時に,マルチコアビルド試してみたい. ビルド ソースのダウンロード ソースを.zipなどでダウンロードします. 展開先のフォルダは次がおすすめです.どちらでビルドしたか忘れられません. また,Tools内にOpenCVなどをまとめると,移動・バックアップにも便利です. c \Tools\Qt\Qt4.8.4x86_msvc2010 c \Tools\Qt\Qt4.8.4x64_msvc2010 ビルド方法 参考元は以下3つです. ※ 基本的な流れは公式に沿います(ソース付属のINSTALL リンク先).参考先によると,基本的な流れに以下を+するといいのでしょうか. 基本的な流れ:http //blog.metaseq.net/2012/09/qt32bit64bit.html nmake clean:http //www.soramimi.jp/qt/build.html OpenCV向:http //docs.opencv.org/doc/tutorials/introduction/windows_install/windows_install.html 手順 1. ソースの訂正2箇所(msvcとのエンコードの問題?訂正しないとコンパイルエラー?) 次のファイルをメモ帳か何かで開き,文字を置換します. Qtソースフォルダ\src\3rdparty\webkit\Source\WebCore\platform\DefaultLocalizationStrategy.cpp 325行目と327行目 全角文字“, ”→半角文字 もしくは \" と置換. 手順 2. msvcコマンドプロンプト msvc2008/2010いずれかのコマンドプロンプトを開き,カレントディレクトリを移動します. cd Qtのソースフォルダパス 64bitでコンパイルする際は以下を実行してください. ※ Express版の方ははじめ,64bitコンパイルできません. s こちら /s を参照してください vcvars64.bat. 手順 3. コンフィグ時のオプション 下記いずれかのオプションでconfigureしてください. 標準(?) scanfの警告対策:-D _CRT_SECURE_NO_WARNINGS コンパイルするのmsvcバージョン(適宜変えて下さい):-platform win32-msvc2010 MSVC2008の場合:configure -debug-and-release -D _CRT_SECURE_NO_WARNINGS -platform win32-msvc2008 MSVC2010の場合:configure -debug-and-release -D _CRT_SECURE_NO_WARNINGS -platform win32-msvc2010 OpenCV用にビルドする際は以下のようにすることで,OpenCVのビルドに不要なQtビルドの一部を省くことができます.※opencvをdebugでビルドする際は,Qtのdebugも必要なのかもしれません. リリース版のみビルド:-release -no-:省く対象 MSVC2008の場合:configure.exe -debug-and-release -D _CRT_SECURE_NO_WARNINGS -platform win32-msvc2008 -no-webkit -no-phonon -no-phonon-backend -no-script -no-scripttools -no-qt3support -no-multimedia -no-ltcg MSVC2010の場合:configure.exe -debug-and-release -D _CRT_SECURE_NO_WARNINGS -platform win32-msvc2010 -no-webkit -no-phonon -no-phonon-backend -no-script -no-scripttools -no-qt3support -no-multimedia -no-ltcg 手順 4.コンパイル 下記どちらかのコンパイルを実行してください. マルチコアでQtをビルドする場合,あらかじめQtCreatorをインストールしておきます. QtCreator binまでのパス\jom.exe -j 4 通常のコンパイルを行う場合(遅い) nmake ※ マルチコアビルドは64bitコンパイル時に試します. ほか Qtのビルドはmsvc2008/2010どちらかで行います. ビルド後,Qtを使う際にどちらのバージョンを使ってもいいのであれば, どちらでもよいのですが...確かめたいところです. どちらにしても,OpenCVのビルドが左右されることはないと思っていますが. ないとは思いますが,左右されるとすれば,Qtの開発を行う際かな、と思います. けれど,OpenCVのplatformはvc09/10で分かれていますが...
https://w.atwiki.jp/bambooflow/pages/83.html
Qt4インストール Vineはapt-getでQt3は入れられるが、Qt4はvine-plusに含まれていないのでapt-getじゃ入れられないみたい。 直接ダウンロードしてきてインストールする方法をメモる。 Pen1MHzでコンパイルに2〜3時間かかった。 ダウンロード http //trolltech.com/downloads - Go to Open Source Downloads -- Qt Open Source Edition for C++ Developers X11 Download インストール # apt-get install XOrg-devel XOrg-gl XOrg-gl-devel $ cd /tmp $ gunzip qt-x11-opensource-desktop-4.3.3.tar.gz $ tar xvf qt-x11-opensource-desktop-4.3.3.tar $ cd /tmp/qt-x11-opensource-desktop-4.3.3 $ ./configure This is the Qt/X11 Open Source Edition. You are licensed to use this software under the terms of either the Q Public License (QPL) or the GNU General Public License (GPL). Type Q to view the Q Public License. Type G to view the GNU General Public License. Type yes to accept this license offer. Type no to decline this license offer. Do you accept the terms of either license? yes $ gmake $ su -c "gmake install" 設定 .bash_profileに以下を追加する。 PATH=/usr/local/Trolltech/Qt-4.3.3/bin $PATH export PATH 設定反映。 $ source ~/.bash_profile インストールが完了したら、Online Reference Ddocumentationでお勉強。 参考ページ http //doc.trolltech.com/4.3/install-x11.html 以上