質問
openGLとPythonをいじくり回そうとしていますが、PyOpenGlとpygletを使用する理由を見つけることができませんでした
どのお勧めとその理由を教えてください
解決
トニーが言ったように、これは本当にあなたの目標に依存するでしょう。 「いじくり回している」場合OpenGLまたは3Dレンダリング全般について学び、すべての楽しいことを省き、PyOpenGLで作業を開始します。これは、「生」に近づきつつあります。 Pythonを使用した3Dプログラミング。
一方、「いじくり回している」場合は、ゲームやマルチメディアアプリケーションのモックアップ、またはPygletより一般的なプログラミングの実践について学習しようとすると、入力イベント、サウンド、テキスト/ビルボードなどのフックを提供することで、開発時間を大幅に節約できます。先行投資は、人々がプロジェクトを完了できないようにするものです。したがって、あなたのためにそれを行うことは、無視すべきものではありません。 (また、車輪の再発明を避けるために非常にPythonicです。)
何らかの種類の頑丈なリフティング(通常、「いじくり回し」の定義から外れますが、3Dエンジンの設計をいじくり回している場合はそうではないかもしれません)を実行する場合は、 Python-Ogreで、フル機能の堅牢な OGRE 3D をラップする very グラフィックエンジン。
他のヒント
pygletから始めます。ウィンドウを開くことから、フレンドリーで強力なSpriteクラスとBatchクラスを使用してスプライトとOpenGLプリミティブを描画するまで、必要なすべてを含む最高の高レベルAPIが含まれています。
後で、glDrawArraysなどのOpenGL関数を直接呼び出す独自の低レベルコードを記述することもできます。これは、pygletのOpenGLバインディングまたはPyOpenGLを使用して行うことができます。良いニュースは、どちらを使用しても、そのような呼び出しを既存のpygletアプリケーションの真ん中に挿入することができ、それらが「機能する」ことです。コードをPygletからPyOpenGLに移行するのは非常に簡単なので、これはあまりにも多くのことを事前に心配する必要がある決定ではありません。 2つの間のトレードオフは次のとおりです。
PyOpenGLのバインディングにより、OpenGLインターフェースがより使いやすく、Python的になります。たとえば、頂点配列をさまざまな形式、ctypes配列、numpy配列、プレーンリストなどで渡すことができ、PyOpenGLはそれらをOpenGLが使用できるものに変換します。このようなことにより、PyOpenGLは本当に簡単で便利になります。
pygletのOpenGLバインディングは自動的に生成され、PyOpenGLほど使いやすいものではありません。たとえば、「Cポインタ」の種類の引数をOpenGLに渡すために、ctypesオブジェクトを手動で作成する必要がある場合があります。これは面倒です。プラス面は、pygletのバインディングが大幅に高速化される傾向があることです。
これは、ウィンドウ、マウスイベント、サウンドなどにpygletを使用するという最適な妥協点があることを意味します。次に、直接OpenGL関数呼び出しを行う場合は、PyOpenGLの使いやすいAPIを使用します。次に、最適化するときに、内部レンダーループ内にあるパフォーマンスクリティカルなPyOpenGL呼び出しのごく一部を、同等のpygletに置き換えます。私にとっては、これにより2〜4倍のフレームレートが得られ、PyOpenGLのコードの90%が便利になります。
ModernGL をお試しください。
pip install ModernGL
-
PyOpenGL は、元のOpenGL API(SWIGで生成)の自動生成バージョンです。元のOpenGL APIはpythonフレンドリーではありません。生成されたpythonバインディングは使いにくいです。
-
pyglet は主にウィンドウの作成とイベント処理用ですが、APIのようなPyOpenGLを使用できます(たとえば、
>pyglet.gl.glClearColor
) -
pygame は、PyOpenGLを使用してレンダリングを実行できるウィンドウを提供します。
-
ModernGL は、PyOpenGLに代わる優れた選択肢です。より少ないコードで最新のOpenGL APIを使用できます。 ModernGLはそれ自体ではウィンドウを作成しませんが、 pyglet 、 pygame 、< a href = "https://github.com/cprogrammer1994/ModernGL/blob/master/examples/PyQt5/01_hello_world.py" rel = "nofollow noreferrer"> PyQt5 および GLUT 。
ModernGLでは、1回の呼び出しで簡単なシェーダープログラムを作成できます。
prog = ctx.program(
vertex_shader='''
#version 330
in vec2 in_vert;
void main() {
gl_Position = vec4(in_vert, 0.0, 1.0);
}
''',
fragment_shader='''
#version 330
out vec4 f_color;
void main() {
f_color = vec4(0.3, 0.5, 1.0, 1.0);
}
''',
)
ModernGLを使用すると、OpenGL APIを完全に制御できます。
Pygletは実際にはPyOpenGLよりも進化していると思います。独自の素晴らしいAPIを持ち、pyglet.glモジュールを介してアクセスされるOpenGLの完全なラッパーを持っています! PyOpenGLは、OpenGLが持つすべての機能をラップするわけでもありません。 Pygletには、OpenGLを介したハードウェアアクセラレーションで2Dをレンダリングするための優れたライブラリもあり、非常によくできています。
強力な既製の3Dエンジンが必要な場合は、 Ogre など
があります。pygletには、画像の読み込みや音声など、多くの素晴らしい追加機能が含まれています。あなたが始めている場合、私は最初にpygletを試し、それから金属に近づきたいと思うならPyOpenGLに切り替えます。
しかし、本当に重要な質問は次のとおりです。あなたは何を達成しようとしていますか?
pygletを宣伝しています
Pygletにはopengl APIもあります。しかし、最近追加された頂点リストのサポートを使用する方が良い場合がよくあります。
pyglet.gl
うーん、pygletをお勧めします。ゲームやアプリケーションに必要なものすべてを提供します。
覚えておいてください、pygletがPyOpenGLで行う多くのことを行うことができます。たとえば、ウィンドウを作成するために必要なことは、
glutInitWindow(title)
glutInitDisplayModeはその前に呼び出す必要があると思いますが。
簡単な要約:泣くまでコードを書きたくない場合は、pygletを選択しますが、マスターになりたい場合はPyOpenGLを選択します。 http://pyopengl.sourcefourge.net にアクセスして、PyOpenGLのドキュメントと http://pyglet.org でpygletのドキュメントを読んでください。これがお役に立てば幸いです!
Pygletをお勧めします。Pygletを開始するのは非常に簡単で、基本的な何かを実行できます。その後、自分のペースでより高度なテクニックを追加できます。
pygletのGL APIはPyOpenGLほど優れていません-pygletは未加工のctypes層にあるため、ctypesも学ぶ必要があります。多数のOpenGLプログラミングを行うことを計画している場合は、PyOpenGLを使用することをお勧めします。
良い点は、この2つをうまく混合できることです。 pygletを使用して、GLコンテキスト、サウンド、イベント、画像の読み込みとテクスチャ管理、テキストレンダリングなどを提供します。必要な実際のOpenGLプログラミングにはPyOpenGLを使用します。