2012-06-14 40 views
2

我偶然發現了一個我無法解釋的OpenGL問題,除非我誤解了glPushMatrix()/glPopMatrix()的工作方式。是我對OpenGL push/pop矩陣的理解錯誤?

下面的兩段代碼不應該有完全相同的效果嗎?

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

VS

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

在我的應用程序,只有當我使用第二個做我看不到任何東西。我在代碼中完全相同的地方嘗試了兩段代碼,並沒有改變任何內容,而使用push/pop矩陣的代碼並沒有在屏幕上繪製任何東西。

回答

5

您不能在glBegin()/glEnd()區塊內撥打glPushMatrix()/PopMatrix()

glBegin()

只有GL命令的子集可以在glBegin和glEnd之間使用。這些命令是glVertex,glColor,glSecondaryColor,glIndex, glNormal,glFogCoord,glTexCoord,glMultiTexCoord,glVertexAttrib, glEvalCoord,glEvalPoint,glArrayElement,glMaterial和glEdgeFlag。 另外,可以使用glCallList或glCallLists來執行 只包含上述命令的顯示列表。如果在glBegin和glEnd之間執行任何其他的 GL命令,則錯誤標誌爲 set,並且該命令被忽略。

建議:使用vertex arraysvertex buffer objects代替經典的即時模式glBegin()/glEnd()塊。

-1

你很近,但我認爲你應該在你的第一個片段中交換glVertex/glTranslate的順序。

當您調用glVertex時,它使用堆棧頂部的當前矩陣繪製。調用只翻譯影響正在繪製的後續頂點;你不能移動已經提交的頂點。

2

這裏有幾個問題。首先,你不能混合矩陣操作和頂點操作 - 我認爲這是簡寫,你跳過了glBegin()/ glEnd()。但主要的問題是你在翻譯之前在原點發送了頂點。反過來這兩行,你應該得到所需的結果。

+0

是的,我想到了這一點,我嘗試了兩種方式(一種是翻譯第一種,另一種翻譯第二種)。問題在於這是在glBegin()/ glEnd()塊中。謝謝 – houbysoft