1

(イミディエイト モード レンダリングを使用する代わりに) 頂点配列を使用して OpenGL で次のクワッドを描画しようとすると、下の 2 番目のリンクにある図に示されているグラフィカルな不具合 (線分) が表示されます。線は上に向かって無限に伸びているように見えます。

GLdouble vertices[] = {
    // back
    0.0, 0.0, 0.0,
    si,  0.0, 0.0,
    si,  -si, 0.0,
    0.0, -si, 0.0,

    // front
    0.0, 0.0, si,
    0.0, -si, si,
    si,  -si, si,
    si,  0.0, si,

    // left
    0.0, 0.0, 0.0,
    0.0, -si, 0.0,
    0.0, -si, si,
    0.0, 0.0, si,

    // right
    si, 0.0, 0.0,
    si, 0.0, si,
    si, -si, si,
    si, -si, 0.0,

    // top
    0.0, 0.0, 0.0,
    0.0, 0.0, si,
    si, 0.0, si,
    si, 0.0, 0.0,

    // bottom
    0.0, -si, 0.0,
    si, -si, 0.0,
    si, -si, si,
    0.0, -si, si,
};

即時描画:

 glBegin(GL_QUADS);
   for (int i = 0; i < sizeof(vertices)/sizeof(*vertices)/3; i++)
     glVertex3d(vertices[i * 3], vertices[i * 3 + 1], vertices[i * 3 + 2]);
 glEnd();

頂点配列による描画:

glVertexPointer(3, GL_DOUBLE, 0, vertices);
glDrawArrays(GL_QUADS, 0, sizeof(vertices)/sizeof(*vertices));

画像:

即時モードで描画された立方体を修正する

頂点配列で描画されたグリッチ キューブ

私は何を間違っていますか?

4

1 に答える 1

5

ドローを次のように変更してみてください

glVertexPointer(3, GL_DOUBLE, 0, vertices);
glDrawArrays(GL_QUADS, 0, 24);

sizeof() は、あなたが思っているようには機能しません。配列内の要素の数を返しません。その配列内の頂点の数をどうにかして追跡し、glDrawArrays 呼び出しでそのカウンターを使用する必要があります。

編集 - 詳細情報:

glDrawArrays の最後のパラメーターは、レンダリングする頂点の数です。sizeof(vertices) は GLdouble* のバイト数 (4 バイト) を返し、sizeof(vertices*) は GLdouble のバイト数 (8 バイト) を返す必要があります。次に、4 / 8 は整数であるため、技術的にはゼロに丸める必要があるため、実際に何かをレンダリングする理由がわかりません。

ただし、(頂点が正しく作成されていると仮定して) その数を 24 に変更すると、うまくいくと確信しています。

于 2011-04-16T16:13:48.380 に答える