3DCG

Python3で「OpenGL」を学ぶ 「ModernGL」

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を上げること。