1

何が起こっているのかわかりません!私はこのメッシュ ローダーを持っており、小さなメッシュをロードすると、プログラムは正常に動作し、メッシュ全体が描画されます。しかし、大きなメッシュ (頂点が 100,000 以上) でプログラムをテストしたところ、ごく一部しか描画されませんでした。それは私のグラフィックカードに何かあるのですか?

LWJGL を使用して、チュートリアルからいくつかのコードをピックアップしました。

private ByteBuffer indexBuffer;

...

// Create a new VBO for the indices and select it (bind)
indxBufId = glGenBuffers();
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indxBufId);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, indexBuffer, GL_STATIC_DRAW);

...

// Bind to the index VBO that has all the information about the order of the vertices
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indxBufId);

// Draw the vertices
glDrawElements(GL_TRIANGLES, indexCount, GL_UNSIGNED_BYTE, 0);

// Put everything back to default (deselect)
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
4

1 に答える 1

11

いいえ、過去の自分、グラフィック カードなどの問題ではなく、インデックスの問題です。インデックス バッファーに BYTES を使用していますが、12 個の三角形の立方体のような小さなモデルを扱う場合は、サイズが小さいため、それで十分です。

しかし、モデルが 256 を超えるインデックスを頂点配列に実行すると、ラップ アラウンドが発生します。多くの。特に、インデックス 125,647 を要求している場合。

モデルが 256 頂点よりも大きい場合、その時間は short または int までです。次のことを忘れずに変更してください。

private ByteBuffer indexBuffer; //change to
private ShortBuffer indexBuffer; //or
private IntBuffer indexBuffer;

そしてこれら:

glDrawElements(GL_TRIANGLES, indexCount, GL_UNSIGNED_BYTE, 0); //fine for up to 256
glDrawElements(GL_TRIANGLES, indexCount, GL_UNSIGNED_SHORT, 0); //up to 65535
glDrawElements(GL_TRIANGLES, indexCount, GL_UNSIGNED_INT, 0); //up to 4294967295

Java の int、short、および bytes はすべて符号付きですが、OpenGL は unsigned で動作し、それに応じてバッファ内のものを変換することを覚えておいてください。

(これらの例は LWJGL ですが、これは C 言語の通常の OpenGL にも当てはまります。)

于 2012-11-27T04:53:02.793 に答える