1

3D シーンを描画する 3D アプリケーションを作成しており、この 3D シーンにテキストを含むいくつかの UI 要素をオーバーレイしたいと考えています。そのために、私は Python とライブラリ PySide および PyOpenGL を使用しています。ubuntu Linux (専用ドライバー) で NVIDIA カードを使用しています。

私の paintGL 関数は大まかに次のようになります。

def paintGL(self):
    # Various clears...
    self.draw_3d_scene()
    self.draw_ui()

このdraw_3d_scene方法では、カスタム シェーダーを使用して 3D オブジェクト (主に球体) を表示します。シェーダーと頂点バッファー オブジェクトは、コードの別の部分で初期化され、それが重要な場合は initializeGL を呼び出した後に初期化されます。

私はdraw_uiこの方法でテキストを描画しようとしています:

def draw_ui(self):
    glUseProgram(0)
    glColor3f(0.0, 0.0, 0.0) # Black text
    self.renderText(100, 100, "Hello, World")

この方法でプログラムを実行すると、3D シーンは取得できますが、テキストは取得できません。シェーダー/頂点バッファーの初期化コード (そしてもちろん 3D シーンの描画) の両方にコメントを付けると、テキストが正しく取得されます。シェーダー/頂点バッファーの初期化コードを残して描画部分を削除すると、テキストが表示されません。

glUseProgram(0) を使用すると、修正されたパイプラインに戻り、テキストを正しく描画できると期待していました。

私が何か間違ったことをしているかどうか誰かが知っていますか?

編集1:

私はプログラムをさらに分離しようとしていますが、解決策を見つけたと思います(これがrenderTextに干渉する理由はまだわかりません):

これは glBindBuffer に関連しているようです。Vertex Buffers を使用したときに、アンバインドするのを忘れていました。今私が使用する場合:

glBindBuffer(GL_ARRAY_BUFFER, 0)

バッファをバインドした後、最終的にテキストが表示されるのを見ることができます

4

0 に答える 0