1

私は 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 上)。

4

3 に答える 3

1

OK、私は自分の問題を理解しました。それはかなりばかげて恥ずかしいです。WFObjectファイルには、0番目、1番目などではなく、1番目、2番目などのインデックスが格納されます。

はい、ディスプレイリストとVBOの両方でまったく同じ頂点をロードしましたが、違いは、DLで描画していたことです。m_Vertices[m_Vindices[i]-1]

明らかに、OpenGLは、格納されている各インデックスからマイナス1にする必要があることを認識していません。当然、そうです。それは私自身の問題でした。これで、インデックス配列に格納されているため、各インデックスから-1が得られます。問題が解決しました!

お時間を無駄にして申し訳ありませんが、ご覧いただきありがとうございます!

于 2011-09-14T03:05:38.167 に答える
1

1 つには、おわかりのように、STL ベクトルを使用することはまったく問題ありません。C++ は、std::vector<> が通常の配列としてメモリに格納されることを保証します。私は VBO で作業するときに std::vector を自分で使用しましたが、問題なく動作するので、ここで心配する必要はありません。

それ以外に良い提案はありません、ごめんなさい。ちょっとしたことですが、件名では三角形のストリップについて話していますが、コードでは GL_TRIANGLE_STRIP ではなく GL_TRIANGLES でレンダリングしています。それが意図ですか?これが問題だった場合、出力に大きな違いがあると思いますが、確認しても問題はないと思います。

于 2011-09-13T12:34:47.677 に答える
0

とはm_Vindices? コードコメントに整数であると述べています-そうあるべきですstd::vector<unsigned int>

于 2011-09-13T12:04:30.037 に答える