2009-04-09 69 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后面。