1

LWJGL/OpenGL を使用して学習とプログラミングを行っています。マップをチャンクでレンダリングしたい。このために、チャンクごとに VAO と VBO を作成し、それらをアップロードしてリンクします。

問題は、最初のチャンクをレンダリングすると、次の 3 つのチャンクすべてがその上にレンダリングされることです。2 番目のチャンクをレンダリングすると、次の 2 つのチャンクが一番上にレンダリングされます。

これは私のアプリケーションのログで、VAO のセットアップ方法を説明しています。

Chunk: 0 0
Generate VBO: 1
Generate VAO: 1
Bind VAO: 1
Bind VBO: 1
Enable and set VertexAttribPointer
Bufferdata (Buffersize: 36864)
Bind VAO: 0

Chunk: 0 1
Generate VBO: 2
Generate VAO: 2
Bind VAO: 2
Bind VBO: 2
Enable and set VertexAttribPointer
Bufferdata (Buffersize: 1536)
Bind VAO: 0

Chunk: 1 0
Generate VBO: 3
Generate VAO: 3
Bind VAO: 3
Bind VBO: 3
Enable and set VertexAttribPointer
Bufferdata (Buffersize: 1536)
Bind VAO: 0

Chunk: 1 1
Generate VBO: 4
Generate VAO: 4
Bind VAO: 4
Bind VBO: 4
Enable and set VertexAttribPointer
Bufferdata (Buffersize: 64)
Bind VAO: 0

Draw
Bind VAO: 1
Set Unifoms
Draw Arrays

バッファサイズは予想どおりです。

バインディングには、glBindVertexArray() と glBindBuffer(GL_ARRAY_BUFFER, ) を使用します。

描画には glDrawArrays() を使用します

VAO の設定方法が間違っているのでしょうか、それとも問題を解決するために私のコードが必要ですか?

4

1 に答える 1

1

を使用する場合glDrawArrays、 count パラメータは頂点の数を指定します。他の関数とは異なり、値 (float) やバイトの数ではありません。OpenGL は、カウントが VBO の容量を超えているかどうかをチェックしません。したがって、VBO 内のストレージよりも大きなカウント値を指定すると、OpenGL は隣接するメモリ (この場合は他の VBO を含む) から暗黙のうちに値を取得します。

float の数は 3 倍であり、1 つのチャンクのデータだけでなくすべてのデータを描画するため、必ず頂点の数を渡す必要があります。


元の投稿

深度テストが無効になっているようです。これは、既存のものよりも遠くにあるすべてのフラグメントを破棄して、遠いオブジェクトが近くのオブジェクトをカバーしないようにする手法です。

で有効にできます

glEnable(GL_DEPTH_TEST);

初期化中。

于 2015-08-07T14:11:53.820 に答える