2016-04-28 12 views
0

仮想世界を作成するには私はLightweight Java Game Library(LWJGL)(Java + OpenGL)を使用しています。私は自分の地形をワーカースレッドのグラフィックスカードメモリにロードしたいのですが、メインスレッドではこれらをロードし、すでにロードされている地形をレンダリングしてレンダリングします。これを行うには、Vertex Array Object(VAO)を作成し、Vertex Buffer Object(VBO)を作成し、VBOをVAO属性リストに追加し、最後にすべてをレンダリングする必要があります。これはシングルスレッドシステムではうまく動作しますが、マルチスレッドシステムで実装する際に問題があります。 VBOはOpenGLコンテキスト間で共有できますが、VAOは共有できません(reference1; reference2)。 ;VBOを別のJavaスレッドにロードする方法

GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER、ID):

  1. は、これらのメソッドを使用することにより、作業者のトレッドにVBOを作成し、メインスレッド上でVAOを作成します。したがって、私私の目標を達成するために、 int ID = GL15.glGenBuffers(); GL15.glBufferData(GL15.GL_ARRAY_BUFFER、バッファ、GL15.GL_STATIC_DRAW)。 GL20.glVertexAttribPointer(attributeNr、coordSize、GL11.GL_FLOAT、偽、0、0); GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER、0);スレッド「メイン」org.lwjgl.opengl.OpenGLExceptionで

例外:素子アレイバッファオブジェクトが無効になっているとき、オフセットを使用することはできません

  • は、しかし、私はこの 例外を取得するには、メインスレッド上で、それをレンダリング

    彼らはスコープをレンダリングの外にあるとき、私は地形をロードするので、私は、私がロードされていない地形をレンダリングしていないことを確信しています。私は、OpenGLの共有コンテキストと並行性に関する多くの記事、質問、ブログを読んだが、解決策を見つけることはできなかった。私はどんな助けにも非常に感謝しています。

  • +1

    は、我々は、特に1と3 – elect

    答えて

    2

    すでに述べたように、VAOはコンテキスト間で共有されるNOTなので、複数のスレッドから変更することもできません。

    GL20.glVertexAttribPointer(attributeNr, coordSize, GL11.GL_FLOAT, false, 0, 0); 
    

    はVAO状態を変更しているため、メインスレッドから呼び出す必要があります。

    データアップロード(glBufferData)を別のスレッドに入れても問題ありませんが、VAOの構築はメインスレッドからのみ行うことができます。

    +0

    あなたが正しいと思われ、より多くのコードが必要です。しかし、私はすべてのコードを再構築しなければならず、私はいくつかの他のエラー(うまくいけば非関連)を得ています。私はこれらのエラーに対処してすぐにあなたの答えを受け入れます。ありがとうございました。 – Fataho

    関連する問題