約 2,353,464 件
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/197.html
OpenGLのメモ書き OpenGLは世代(バージョン)によってコーディング方法に互換性がありません。 そのため世代に合わせたコーディングスタイルを身につけなければなりません。 大きく分類と、次の2つに分けられます。 固定機能シェーダ プログラマブルシェーダ ここでは、 OpenGL2.xまでは主に固定機能シェーダについて、 OpenGL3.x以上からは主にプログラマブルシェーダについて述べたいと思います。 OpenGL1.x OpenGL2.x (OpenGL ES1) OpenGL3.x - core profile (OpenGL ES2) History QtでOpenGL OpenGLツール glut glew - OpenGL4.xを試すには必須 gl3w - OpenGL3.x 4.x core profile GLM - OpenGL Mathematics SDL デバッグツール glslDevil gDEBuggerに似たGUIデバッグツール,GLSL対応 gDEBugger freeになったようです。 BuGLe (OpenGLデバッガ) 参考 http //www.opengl.org/wiki/
https://w.atwiki.jp/opengl/pages/14.html
なぜ、DirectXではなくOpenGLなのか? 最新のグラフィックス、最速の描画を行うのであれば間違いなくDirectXがベストですが、 3Dを勉強したい、ころころ変わるDirectXにはついて行けないという方、いろんなOSで シェーダーモデル5.0を使いたいという方にはOpenGLをおススメします。 OpenGL 4.0 OpenGL4.0を駆使すれば、MacOSやLinux、Windows XP、Vista、7、8の4世代のWindowsに渡って DirectX 11世代のシェーダーモデル5.0を使う事ができます。 DirectXより簡単 当サイト管理人の感想ですが、DirectXに比べてOpenGLは割と簡単な印象を受けます。 業界標準となる可能性 OpenGLが右手座標系、DirectXが左手座標系を採用しているのは大きな明暗。 数学やほとんどの3Dアプリでは右手座標系を使用しています。 ODEやOpenALなども、そうです。つまり右手座標系が業界標準だったのです。 最近ではDirectXも左手座標系と右手座標系を選べるようになったのですが、 統一されていないのは混乱を招く種です。 また、OpenGLはプレイステーション1,2,3、iphoneアプリなどのSDKとして 採用されています。 C/C++を使う理由 言うまでもなく、豊富な各種ライブラリと過去の遺産を無駄にする事なく プログラミングするためです。 実行速度という点では、アセンブラに劣るでしょうが、VisualC++の場合、 MASMがインラインアセンブラで使えます。 GUIに関してはC#、VisualBasic、JAVA + Swingに、分があるように感じるかも しれませんが、.NET Frameworkでしたら、C++/CLIを用いる事でC#と同等の GUIができます。 さらに、C++/CLIの言語仕様もJAVAのような完全なオブジェクト指向ではないため、 オブジェクトが存在しなかった時の例外処理等を記述しなくても良く、 非常に楽をする事ができます。 C#で追加されたガベージコレクションやファイナライザといった機能も併せ持って いる上に、単純に同じようなアプリケーションを作成した場合、C#製の物よりも C++/CLI製の.NETアプリの方が速いようです。 つまり、現時点でWindows環境下において、究極の開発言語という事になります。 freeglutを使う理由 これも言うまでもなく、圧倒的にプログラムコード量を減らし楽をするためです。 また、単純にOpenGLの使い方を覚える点で面倒な初期化関連やウインドウの 作成などの手間を省くためです。 「こんなに簡単にOpenGLプログラミングできるんだ」という事を体験するには freeglutが1番適していると思ったからです。 var so = new SWFObject( http //chuka-tube.com/wp-content/themes/141210_pc/jw/player.swf , mpl , 426 , 320 , 9 ); so.addParam( allowfullscreen , true ); so.addParam( allowscriptaccess , always ); so.addParam( wmode , opaque ); so.addVariable( file , http //dd.yinyuetai.com/uploads/videos/common/F25901494A27F1964FD2A25634ABD357.mp4?sc=dac1ced33549d3a4 ); so.addVariable( image , http //img.chuka-tube.com/music/26/2164508.jpg ); so.addVariable( provider , http ); so.addVariable( autostart , false ); so.addVariable( backcolor , EEEEEE ); so.addVariable( frontcolor , 666666 ); so.addVariable( lightcolor , 888888 ); so.addVariable( screencolor , 000000 ); so.addVariable( volume , 100 ); so.write( mediaspace );
https://w.atwiki.jp/opengles/pages/23.html
OpenGL® ES is a software interface to graphics hardware. The interface consists of a set of procedures and functions that allow a programmer to specify the objects and operations involved in producing high-quality graphical images, specifically color images of three-dimensional objects. [n.n.n] refers to sections and tables in the OpenGL ES 2.0 specification. [n.n.n] refers to sections in the OpenGL ES Shading Language 1.0 specification. Specifications are available at www.opengl.org/registry/gles
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/cglab/pages/22.html
初心者向けチュートリアル 筑波大学岩田研究室 OpenGLのゼミの資料を公開なさっています。 ◆◇ 高速OpenGL講座 ◇◆ 九州大学 大学院 のOpenGL講座 内容を絞ってあるので、コストパフォーマンスに優れます。しかし、auxライブラリを使用しているのでglutへの修正が必要です。ちなみにauxライブラリはglutライブラリの1世代前のライブラリです。 ピックアップ処理 ピックアップ処理とは、マウスで3Dオブジェクトを選択することです。これを行うことによりドラッグで移動、スケーリング、回転といった操作が可能になります。 OpenGL de プログラミング ピックアップ処理 マウスでクリックした場所の3次元位置を求めるには? 和歌山大学床井研究室
https://w.atwiki.jp/opengl/pages/186.html
OpenGLのバージョンとGPUの情報を取得します。 ファイル main.cpp main.cpp #include stdio.h #include GL/freeglut/freeglut.h int main(int argc, char *argv[]) { glutInitWindowPosition(10, 10); glutInitWindowSize(10, 10); glutInit( argc, argv); glutCreateWindow( Check OpenGL ); printf( OpenGLのバージョン %s\n ,glGetString(GL_VERSION)); printf( ハードウェアベンダー %s\n ,glGetString(GL_VENDOR)); printf( GPU %s\n ,glGetString(GL_RENDERER)); getchar(); return 0; }
https://w.atwiki.jp/mypad/pages/23.html
openFrameworksを使っているとopenGLの知識が必要になってくる ofxARToolkitPlusという拡張現実の描画をしているのもOPENGL。 どうも座標があわないなと思っていたら ただし、OpenGLでは、座標の原点(0,0)は左下です。 とのこと。y座標が上下逆で、デカルト座標系なんですね。 http //sky.geocities.jp/freakish_osprey/opengl/opengl_viewport.htm