2

glPushMatrix()/の仕組みを何らかの形で誤解しない限り、説明できない OpenGL の問題に出くわしましたglPopMatrix()

以下の 2 つのコードの効果はまったく同じではないでしょうか。

  glPushMatrix();
  glVertex3f(0,0,0);
  glTranslatef(c->e->coords[0], c->e->coords[1], c->e->coords[2]);
  glPopMatrix();

  glVertex3f(c->e->coords[0], c->e->coords[1], c->e->coords[2]);

私のアプリケーションでは、2 番目のものを使用した場合にのみ、何も表示されません。コードのまったく同じ場所で両方のコードを試してみましたが、他には何も変更していません。プッシュ/ポップ マトリックスを使用したものは画面に何も描画しません。

4

3 に答える 3

5

ブロックglPushMatrix()/PopMatrix()内で呼び出すことはできません。glBegin()/glEnd()

glBegin():

glBegin と glEnd の間で使用できるのは、GL コマンドのサブセットのみです。コマンドは、glVertex、glColor、glSecondaryColor、glIndex、glNormal、glFogCoord、glTexCoord、glMultiTexCoord、glVertexAttrib、glEvalCoord、glEvalPoint、glArrayElement、glMaterial、および glEdgeFlag です。また、glCallList または glCallLists を使用して、上記のコマンドのみを含む表示リストを実行することもできます。glBegin と glEnd の間に他の GL コマンドが実行された場合、エラー フラグが設定され、コマンドは無視されます。

推奨事項:従来の即時モードブロックの代わりに、頂点配列または頂点バッファー オブジェクトを使用してください。glBegin()/glEnd()

于 2012-06-14T21:13:13.377 に答える
2

ここにはいくつかの問題があります。まず、行列演算と頂点演算を混在させることはできません。これは省略形であり、glBegin()/glEnd() をスキップしたと思います。しかし、主な問題は、変換する前に頂点を原点に送信したことです。これらの 2 行を逆にすると、目的の結果が得られるはずです。

于 2012-06-14T21:28:55.357 に答える
-1

あなたは近いですが、最初のスニペットで glVertex/glTranslate の順序を交換する必要があると思います。

glVertex を呼び出した瞬間に、スタックの一番上にある現在のマトリックスを使用して描画されます。translate を呼び出すと、後続の頂点が描画されるだけに影響します。すでに送信されている頂点を移動することはできません。

于 2012-06-14T21:12:18.780 に答える