1

いくつかの立方体の表示リストがあります...非常に単純なものです。ここにスニペットがあります:

GL11.glPushMatrix
GL11.glRotatef(90,0,0,1)
cuboid(1,0.5,20) //just glVertex calls
GL11.glPopMatrix

これを使用して即時モードで描画すると、奇妙なことは何も起こりません。ただし、これを表示リストに入れると、最初に回転していない立方体が描画され、次に回転されます(または、glPushMatrix と glPopMatrix の間で行う変換)。さらに、glPush と glPop を使用しない場合、期待どおりに動作します。

ディスプレイ リストで glPush/PopMatrix を使用するときに知っておくべきことはありますか?

編集:ソースコードをさらに追加:

handle = GL11.glGenLists(1);
GL11.glNewList(handle,GL11.GL_COMPILE)
GL11.glBegin(GL11.GL_LINES);

GL11.glPushMatrix //if I don't use these it behaves as expected
GL11.glRotatef(90,0,0,1)
cuboid(1,0.5,20) //just glVertex calls
GL11.glPopMatrix

GL11.glEnd();
GL11.glEndList();

EDIT2: glBegin を glPushMatrix に、glEnd を glPopMatrix に交換することで動作するようにしました - 今の見た目は好きではありませんが、少なくとも動作します。私が知っていることから、これは正常ではなく、私がしたことは単なるトリックであるため、質問を開いたままにします.

GL11.glPushMatrix //everytime I want to push/pop I have to call glBegin and glEnd
GL11.glBegin(GL11.GL_LINES);
GL11.glRotatef(90,0,0,1)
cuboid(1,0.5,20) //just glVertex calls
GL11.glEnd();
GL11.glPopMatrix
4

1 に答える 1

5

glBegin/glEnd 内で glPushMatrix を呼び出すとエラーになります。glBegin/glEnd ペア内で使用できるコマンドの厳密なサブセットのみがあります。

glBegin の man ページから:

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

glPushMatrix のマニュアル ページ:

glBegin の実行と対応する glEnd の実行の間に glPushMatrix または glPopMatrix が実行されると、GL_INVALID_OPERATION が生成されます。

開発コードに glGetError を入れ始めると、この種の問題が指摘されます。

また、glRotatef は合法ではありません。

glBegin の実行と対応する glEnd の実行の間に glRotate が実行されると、GL_INVALID_OPERATION が生成されます。

于 2012-07-12T06:09:58.717 に答える