2

lwjglを使用してテキストを動的にレンダリングするシステムを作成しています。レンダリングで使用するテクスチャを自動的に生成するようにシステムを設定していますが、画像は機能します。ここに問題があります。
2つのVBOとVAOを初期化するためのこのコードがあります。どちらも、1024テキスト文字相当のデータを処理できるように設定されています。

vbo = GL15.glGenBuffers(); //Main VBO to hold data
vao = GL30.glGenVertexArrays();

GL30.glBindVertexArray(vao);
GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo);
GL15.glBufferData(vbo, dataBuffer, GL15.GL_DYNAMIC_DRAW);
GL20.glVertexAttribPointer(0, 3, GL11.GL_FLOAT, false, 36, 0); //Position
GL20.glVertexAttribPointer(1, 4, GL11.GL_FLOAT, false, 36, 12); //Color
GL20.glVertexAttribPointer(3, 2, GL11.GL_FLOAT, false, 36, 28); //Texture Coordinates
GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
GL30.glBindVertexArray(0);

indvbo = GL15.glGenBuffers(); //VBO to hold indices
GL15.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, indvbo);
GL15.glBufferData(GL15.GL_ELEMENT_ARRAY_BUFFER, indices, GL15.GL_DYNAMIC_DRAW);
GL15.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, 0);

そして、私はこのコードを使用してvboのデータを更新しようとします

GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo);
dataBuffer.clear();
for(Vertex vert : vertices) { //Vertex is a custom class to hold vertex data.
    dataBuffer.put(new float[] { //Put position, color, and texture coordinates in buffer
        vert.x,
        vert.y,
        vert.z,
        vert.r,
        vert.g,
        vert.b,
        vert.a,
        vert.u,
        vert.v
    });
}
dataBuffer.flip();
GL15.glBufferSubData(GL15.GL_ARRAY_BUFFER, 0, dataBuffer);
GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);

GL15.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, indvbo);
indices.clear();
indices.put(indArray.getIndices());
indices.flip();
GL15.glBufferSubData(GL15.GL_ELEMENT_ARRAY_BUFFER, 0, indices);
GL15.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, 0);

ただし、画面には何も表示されません。glGetBufferSubDataを使用していずれかのvboからデータを取得すると、ゼロで満たされたバッファーが取得されます。しかし、私が変更した場合

GL15.glBufferSubData(GL15.GL_ARRAY_BUFFER, 0, dataBuffer);

することが

GL15.glBufferData(GL15.GL_ARRAY_BUFFER, dataBuffer, GL15.GL_DYNAMIC_DRAW);

そして私は変わります

GL15.glBufferSubData(GL15.GL_ELEMENT_ARRAY_BUFFER, 0, indices);

することが

GL15.glBufferData(GL15.GL_ELEMENT_ARRAY_BUFFER, indices, GL15.GL_DYNAMIC_DRAW);

すべてが画面に表示され、glGetBufferSubDataは最初に入力したものを返します。これはフレームごとに実行し、フレームごとにメモリを再割り当てしたくないため、glBufferDataを使用したくありません。glBufferSubDataが機能しなくなる原因は何ですか?

4

1 に答える 1

1
GL15.glBufferData(vbo, dataBuffer, GL15.GL_DYNAMIC_DRAW);

まず、最初のパラメータとしてバッファオブジェクトを渡さないでください。バッファオブジェクトをバインドしたターゲットを渡します。あなたはそれをにバインドしたGL15.GL_ARRAY_BUFFERので、あなたはそれを渡します。

次に、dataBufferこの時点でが空の場合、これglBufferDataは事実上0glBufferSubDataのサイズになります。バッファのサイズを再割り当てできません。glBufferDataを渡すのではなく、適切なサイズを使用して特定のサイズのバッファストレージを割り当てることをお勧めしdataBufferます。

また、後のglBufferSubData呼び出しでそのストレージの外部にメモリを設定しようとしないようにしてください。したがって、大量のメモリを割り当てます。

最後に、これに真剣に取り組んでいる場合は、いくつかのバッファオブジェクトストリーミング手法を調べてください。

于 2012-12-29T20:47:08.570 に答える