PyCGを学んだ。更にPythonでOpenGLを扱う、より良い方法を模索するにあたりgithubで人気の moderngl/moderngl を動かして理解を深める。ライセンスはMIT(本稿執筆時点)
moderngl の README.md を一通り読み、内容をまとめた。
ModernGL
OpenGL 3.3+ のPythonラッパー。科学的なシミュレーション、ゲームやGUIのようなシンプルなCCアプリの作成を簡素化する。ModernGLは、学習して使用するのがかんたんで、より少ないコードで、高いパフォーマンスと品質でレンダリングすることができる。(Modernnglの大部分は、C++で書かれているため高速である)ドキュメント サンプル Windows, Linux, macに対応。
インストール
pip install moderngl
機能
- GPUを利用した高品質なグラフィックス
- 最新のOpenGLのレンダリング
- PyOpenGLよりもシンプルで高速
- ウィンドウなしでレンダリング可能
- 100% Pythonic
使用例
>>> import moderngl
>>> ctx = moderngl.create_standalone_context()
>>> buf = ctx.buffer(b'Hello World!') # allocated on the GPU
>>> buf.read()
b'Hello World!'
PyOpenGLとの比較
PyOpenGLでは、VBOのバインディングのような単純な作業のために3行書く。
vbo1 = glGenBuffers(1)
GL.glBindBuffer(GL_ARRAY_BUFFER, vbo1)
GL.glBufferData(GL_ARRAY_BUFFER, b'Hello World!', GL_STATIC_DRAW)
vbo2 = glGenBuffers(1)
GL.glBindBuffer(GL_ARRAY_BUFFER, vbo2)
GL.glBufferData(GL_ARRAY_BUFFER, b'\x00' * 1024, GL_DYNAMIC_DRAW)
ModernGLでは、同じ結果を得るために、VBOごとにシンプルに1行で書ける。
vbo1 = ctx.buffer(b'Hello World!')
vbo2 = ctx.buffer(reserve=1024, dynamic=True)
よくある質問
> ModernGLはPyOpenGLよりも高速化か?
多くの場合、高速。ModernGLのコア関数はC++で書かれており、OpenGLの関数は高速に連続して呼び出されるため、これらの呼び出しは1つのpython関数呼び出しとしてカウントされる。
> どのバージョンのOpenGLが使われてるか?
ほとんどの呼び出しはOpenGL 3.3だけを必要とする。サブルーチンと計算シェーダはOpenGL 4.0とOpenGL 4.3を必要とする。
> 古いPCはサポートされているか?
OpenGL 3.3は2010年2月にリリースされた。最新のドライバを使用すれば、統合グラフィックスカードでもModernGLのほとんどの機能を使用することができる。(Compute Shaderは、古さによっては動作しない可能性がある。)
> どこでModernGLを使用できるか?
OpenGLがサポートされていれば使用できる。ModernGLは、standalone_contextを使ってレンダリングすることもできる。ウィンドウへのレンダリングには、有効なOpenGLコンテキストのみが必要。
> ModernGLはウィンドウを作成できるか?
いいえ。ただし、ウィンドウの作成とリソースの読み込みをかんたんにするユーティリティライブラリ moderngl-window を提供している。
> PyOpenGLよりもModernGLを使うことに制限はあるか?
必要な呼び出しはすべてModernGLで実装されている。PyOpenGL からModernGL オブジェクトと対話することができる。足りないものがある場合は、issueを上げるか、PRを上げること。