私は C++ も OpenGL も初めてではありませんが、VBO の使用は初めてです。今まで、私は怠け者で、ほとんどすべてにディスプレイ リストを使用していました。
私の問題はおそらく非常に単純ですが、面倒です!三角形の最初と最後のリストが正しく表示されていないようです。この例では、単純な波面モデルの obj ファイルから球を読み込んでいます。表示リストと VBO の両方でまったく同じ方法で obj ファイルからロードし、obj ファイルからまったく同じ数値を取得していることを確認しました。
この例では、頂点と頂点インデックスを格納するために STL ベクトルを使用しました。ただし、以前にも float* と int* を使用してみましたが、まったく同じ結果が得られました。
これは、VBO から描画された球体の画面です。
編集:私のアカウントはまだ新しいので、2つ以上投稿できないため、このハイパーリンクを削除しました... ご覧のとおり、球の真ん中に入る向こう側から巨大な円錐が描かれています。見にくいですが、最も近い側から最も遠い側への三角形のストリップも間違っています。これは、次のいくつかの画面のいずれかで明らかになります。これは、DL から描画されたまったく同じ球です。
編集:私のアカウントはまだ新しいので、2つ以上投稿できないため、このハイパーリンクを削除しました...
DL が正しく描画されていることがわかります。ここでは、両方が同時に描画されています。線が緑色になっているところに最大の違いが見られます。これが本来あるべき姿です。
編集:私のアカウントはまだ新しいので、2つ以上投稿できないため、このハイパーリンクを削除しました...
ここでは、トップ ストリップが VBO から間違って描画されていることがより明らかです。
次に、各頂点の y 値に大きな数値を追加してみました。これは、球内の円錐の頂点が決して動かないため、VBO に間違いなく何か問題があることを示しています。
さて、問題の視覚的なアイデアが得られたので、ここにコードを挿入すると思いましたが、おそらくステップを見逃したか、番号が間違っているだけです。ご覧ください
これが私がvboを作成する方法です
void VBOWFModel::Create_VBO()
{
// Vertex Array VBO handle
glGenBuffers(1, &m_VAVBO_handle);
glBindBuffer(GL_ARRAY_BUFFER, m_VAVBO_handle);
glBufferData(GL_ARRAY_BUFFER,
m_vertices.size()*sizeof(Vec3f),
&m_vertices[0].x, GL_STATIC_DRAW);
}
m_vertices は、単純に x、y、z を保持する Vec3f の STL ベクトルです。これをベクターとしても試してみましたが、同じ問題が発生したため、ベクターまたは float* に変更しても問題はありません。
わかりました、今、私がそれを描いているところに来ました。
void VBOWFModel::Render()
{
glEnableClientState(GL_VERTEX_ARRAY);
glBindBuffer(GL_ARRAY_BUFFER, m_VAVBO_handle);
glVertexPointer(3, GL_FLOAT, sizeof(Vec3f), (float*) NULL);
glPolygonMode( GL_FRONT_AND_BACK, GL_LINE );
// m_Vindices are the vertex indices, not the greatest naming convention but hey...
// it is an STL vector of integers
glDrawElements(GL_TRIANGLES, m_Vindices.size(), GL_UNSIGNED_INT, &m_Vindices[0]);
glPolygonMode( GL_FRONT_AND_BACK, GL_FILL );
glDisableClientState(GL_VERTEX_ARRAY);
}
glPolygonMode( GL_FRONT_AND_BACK, GL_LINE ); を使用して描画しています。間違った三角形の問題を最もよく示しているため、単にデバッグ目的のためです。
私が何か間違ったことをしたかどうか、誰でも見ることができますか? 何かを間違って初期化しましたか? 手順がありませんか?私はさまざまなチュートリアルを見て、これをかなりグーグルで検索しましたが、他の人と大きな違いはないようです。ほとんどのチュートリアルでは、stl ベクトルの代わりに float* を使用しましたが、繰り返しますが、既にそれを行っており、まったく同じ結果が得られました。
私が提供しなければならない情報が他にあるかどうかはわかりませんが、glew と freeglut を含めています (両方の最新版.. Windows 上)。