2009-04-09 70 views
3

我試圖用gluOrtho2D與glutBitmapCharacter,以便我可以在屏幕上呈現文本以及我的3D對象。但是,當我使用glOrtho2D時,我的3D對象消失了;我認爲這是因爲我沒有將投影設置回OpenGL/GLUT默認值,但我不確定那是什麼。使用OpenGL,我怎樣才能在默認投影中正確使用gluOrtho2D?

無論如何,這是我使用呈現文本的功能:

void GlutApplication::RenderString(Point2f point, void* font, string s) 
{ 
    glMatrixMode(GL_PROJECTION); 
    glPushMatrix(); 
    glLoadIdentity(); 
    gluOrtho2D(0.0, WindowWidth, 0.0, WindowHeight); 

    glMatrixMode(GL_MODELVIEW); 
    glPushMatrix(); 
    glLoadIdentity(); 

    glDisable(GL_TEXTURE); 
    glDisable(GL_TEXTURE_2D); 

    glRasterPos2f(point.X, point.Y); 
    for (string::iterator i = s.begin(); i != s.end(); ++i) 
    { 
     glutBitmapCharacter(font, *i); 
    } 

    glEnable(GL_TEXTURE); 
    glEnable(GL_TEXTURE_2D); 

    glMatrixMode(GL_MODELVIEW); 
    glPopMatrix(); 

    glMatrixMode(GL_PROJECTION); 
    glPopMatrix(); 
} 

而且,渲染功能類似於此:

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

glPushMatrix(); 
glLoadIdentity(); 

// Do some translation here. 

// Draw some 3D objects. 

glPopMatrix(); 

// For some reason, this stops the above from being rendered, 
// where the camera is facing (I assume they are still being rendered). 
Point2f statusPoint(10, 10); 
RenderString(statusPoint, GLUT_BITMAP_9_BY_15, "Loading..."); 

回答

1

Yo你的代碼看起來沒問題。很可能你已經把矩陣堆棧搞亂了。

我建議你檢查一下你是否忘記了glPopMatrix。爲此,您可以通過glGet(GL_MODELVIEW_STACK_DEPTH)獲得堆棧深度。其他矩陣堆棧的吸氣器也可以使用。

你也可以看看當前的矩陣。致電glGetFloatv(GL_MODELVIEW_MATRIX, Pointer_To_Some_Floats)得到它。每次設置模型視圖或投影矩陣時,都可以打印浮點數。這樣,你應該能夠找出哪個矩陣不規則地結束爲當前矩陣。

這應該給你足夠的線索來找到bug。

3

當我需要類似我沒有」的東西試着按下並彈出矩陣狀態,我只是每次都從零開始重新設置一切:

void set2DMode() 
{ 
     glMatrixMode(GL_PROJECTION); 
     glLoadIdentity(); 
     glOrtho(0, w, h, 0, -1, 1); 

     glMatrixMode(GL_MODELVIEW); 
     glLoadIdentity(); 
} 

void set3DMode() 
{ 
     glMatrixMode(GL_PROJECTION); 
     glLoadIdentity(); 
     gluPerspective(50.0, (float) w/h, 1, 1024); 
     gluLookAt(0, 0, 400, 0, 0, 0, 0.0, 1.0, 0.0); 

     glMatrixMode(GL_MODELVIEW); 
     glLoadIdentity(); 
} 

void cb_display(void) 
{ 
     set3DMode(); 
     // draw some stuff 

     set2DMode(); 
     // draw some text 
     // and some more 
} 
0

您在調用RenderString()函數後處於投影模式。不知道這是否會打破任何東西,但它突出了我。

0

我同意安德烈。 Basiaclly,你要做的是:在第二個和所有的下一幀你的glClear與投影矩陣工作,因爲最後的操作是glMatrixMode(GL_PROJECTION); 在RenderString的末尾。 (至少看看你發佈的代碼)。

試着把glMatrixMode(GL_MODELVIEW)放在glClear後面。