KDAB のブログで “OpenGL in Qt 5.1” というシリーズの記事が公開されています。
- OpenGL in Qt 5.1 – Part 1
- OpenGL in Qt 5.1 – Part 2
- OpenGL in Qt 5.1 – Part 3
- OpenGL in Qt 5.1 – Part 4
Qt 5.1 の OpenGL についての解説というタイトルになっていますが、Part 1 では Qt4 での OpenGL と Qt5 の違いなども記載されていますので、Qt で OpenGL を使っている人には Qt5 の現状を把握するにはちょうど良い記事になっていると思います。OpenGL 3 以降の機能を使うクラスの紹介などもあるので、若干デスクトップ寄りなスタンスではありますが。
Part 1
まずは 5.1 の話の前に、Qt4 から Qt5 の変化の解説から始まるのが Part 1 です。Qt4 の OpenGL モジュールと言えば、QGLWidget に代表される QGL から始まるクラス群でした。基本的には QWidget に OpenGL 用ウィンドウを埋め込んで使うためのもので、(QGLShaderProgram や QGLFunctions の用にクロスプラットフォーム向けのクラスも追加されてきましたが) OpenGL のコマンドをそのまま実行するため、OpenGL と OpenGL ES との差違などはユーザー側で吸収する必要がありました。
Qt 5.0 では QtOpenGL モジュールはそのままに、QWindow むけに QtGUi に QtOpenGL に合ったものとほぼ同等の QOpenGL で始まるクラス群が追加されました。QWindow がそのまま OpenGL の描画の対象となるため、QGLWidget に相当するクラスこそ有りませんが、Qt 5.0 の QOpenGL* クラスは QGL* とそれほど大きく異なるものではありません。
Qt 5.1 では OpenGL ES 2.0 との互換性だけを考えていた QOpenGLFunctions に加えて、OpenGL のバージョンやプロファイルを考慮して使用できる QAbstractOpenGLFunctions が追加されました。さらに OpenGL の Extension を扱う QtOpenGLExtensions モジュールも追加され、任意の OpenGL と Extension の組み合わせが使いやすくなりました。
Part 2
Part 2 は OpenGL の Vertex Array Objects (VAO) を扱うための QOpenGLVertexArrayObject に関する説明です。VAO を使用することで、OpenGL の描画コードの簡素化と高速化を図ることが出来ます。VAO は OpenGL 3 から導入された API ですが、OpenGL 2 や OpenGL ES 2 で GL_ARB_vertex_array_object や GL_OES_vertex_array_object などの Extension が利用できる場合にはそちらを使用して VAO への対応を行います。
Part 3
Part 3 では OpenGL 3.3 から追加された Timer Query 機能に関して説明しています。QOpenGLTimerQuery は OpenGL のタイマーにアクセスを提供し、QOpenGLTimeMonitor では計測に特化した機能を提供しています。OpenGL ES には無い機能なのが残念なところですが、OpenGL を用いたプログラムのパフォーマンスの確認などに役に立つでしょう。
Part 4
Part 4 はデバッグ用に導入された QOpenGLDebugLogger の説明です。GL_KHR_debug Extension を使って OpenGL のログを同期・非同期に取得することが出来ます。同期して使用する場合にはもちろんパフォーマンスへの影響も大きくはなりますが、デバッガのブレークポイント的に使用することが出来るため、エラーの原因解析などに大きく役立つことでしょう。
まとめ
以上のように Qt5 では OpenGL の最新バージョンへの対応もしたうえで、各バージョンの差違を Extension も活用して自動的に吸収できるようなクラスが追加されていっています。もちろん、OpenGL ES では対応できない機能などもありますが、Qt4 に比べると OpenGL と OpenGL ES の違いを意識しなくても済む場面が増えたのではないでしょうか。
なお、もっと簡単に 3D を扱いたい場合には Qt3D のリリースを待つことになります。こちらは Qt 5.2 あるいはそれ以降になります。