1

私は3DSファイルを私のOpenGLプログラムにロードする機能を実装しましたが、わずかな問題が発生しました。すべての頂点が適切に配置され、面が描画されますが、問題は、ほとんど(またはすべて)の頂点が1つまたは2つの頂点への接続を保持しているように見え、多数の余分なエッジが作成されることです。誰かが以前にこの問題に遭遇したり、私がそれを修正する方法について提案がありますか?

次のコードブロックは、面を描画するために使用するループです。一度に1つの頂点をループし、未使用の面修飾子であるため、(理論的には)4つおきの値をスキップします。

glBegin(GL_TRIANGLES);
for(int x = 1; x < 4*numberOfTriangles+1; x++)
{
    //Face bit modifiers not needed, skip em.
    if(tLoop == 4)
    {
        tLoop = 0;
        continue;
    }
    else
    {
        glVertex3f(Vertices[Triangles[x]*3],Vertices[(Triangles[x]*3)+1],Vertices[(Triangles[x]*3)+2]);
        tLoop++;
    }
}
glEnd();

次は私が抱えている問題を表す画像です。 http://img.photobucket.com/albums/v298/Reaperc89/Pistol.jpg

4

2 に答える 2

3

glBeginとがループの外側にあるという事実はglEnd、まったく問題ありません。すべての頂点を次々に使用して三角形を描くのは、まさに正しい方法です。それはあなたが望むものである3つの連続した頂点ごとに三角形の形を構築します。

問題は、tLoopelseブロック内で増加したため、実際には4つおきではなく5つおきのインデックスをスキップしたことです。glBegin/glEndしたがって、展開はそれを防ぎましたが、ループの外側で動作しないこととは何の関係もありません。しかし、コメントで述べたように、代わりtLoopに使用できるので、とにかく必要はありません。x

glBegin(GL_TRIANGLES);
for(int x = 1; x < 4*numberOfTriangles+1; x++)
    if(x % 4)   //works if x starts at 1, though I don't know why x has to start at 1
        glVertex3f(Vertices[Triangles[x]*3],Vertices[(Triangles[x]*3)+1],Vertices[(Triangles[x]*3)+2]);
glEnd();

または、ループを展開する方がよいでしょう。

glBegin(GL_TRIANGLES);
for(int x = 1; x < 4*numberOfTriangles+1; x+=4) {
    glVertex3f(Vertices[Triangles[x]*3],Vertices[(Triangles[x]*3)+1],Vertices[(Triangles[x]*3)+2]);
    glVertex3f(Vertices[Triangles[x+1]*3],Vertices[(Triangles[x+1]*3)+1],Vertices[(Triangles[x+1]*3)+2]);
    glVertex3f(Vertices[Triangles[x+2]*3],Vertices[(Triangles[x+2]*3)+1],Vertices[(Triangles[x+2]*3)+2]);
}
glEnd();

しかしglBegin/glEnd、ループの内側に配置することは、あなたができる最も愚かなことです。実際、頂点/インデックス配列ベースの表現をすでに使用している場合は、レンダリングコードを頂点配列に移植するのは非常に簡単です。頂点配列は、即時モードよりもはるかに高速であり、VBOを使用する場合はさらに高速になります。

于 2011-10-25T15:15:48.743 に答える
0

私自身の問題を理解しました。begin ブロックと end ブロックがループの外側にどのように表示されるかに注目してください。プログラムは、メッシュ内のすべての頂点を使用して三角形を次々と描画しようとしていました。したがって、それは一種の巨大な混乱を引き起こしました。一度に 3 つの頂点 (1 つの面) を配置するように変更し、開始/終了ブロックをループ内に配置し、ループを 4 つずつインクリメントするように変更して、面データをスキップできるようにしました。

誰かが興味を持った場合に備えて。

于 2011-10-24T23:32:33.603 に答える