glutBitmapString什么都没显示

时间:2013-06-01 14:08:18

标签: opengl freeglut

我将使用freeglut函数glutBitmapString在屏幕上显示FPS,但它没有显示任何内容。这是我的代码。有没有人可以找出问题所在?

void PrintFPS()
{
    frame++;
    time=glutGet(GLUT_ELAPSED_TIME);
    if (time - timebase > 100) {
        cout << "FPS:\t"<<frame*1000.0/(time-timebase)<<endl;
        char* out = new char[30];
        sprintf(out,"FPS:%4.2f",frame*1000.0f/(time-timebase));
        glColor3f(1.0f,1.0f,1.0f);
        glRasterPos2f(20,20);
        glutBitmapString(GLUT_BITMAP_TIMES_ROMAN_24,(unsigned char* )out);


        timebase = time;
        frame = 0;
    }
}

void RenderScene(void)
{
    // Clear the window with current clearing color
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);

    GLfloat vRed[] = { 1.0f, 0.0f, 0.0f, 0.5f };
    GLfloat vYellow[] = {1.0f,1.0f,0.0f,1.0f};
    shaderManager.UseStockShader(GLT_SHADER_IDENTITY, vYellow);
    //triangleBatch.Draw();
    squareBatch.Draw();
    PrintFPS();
    glutSwapBuffers();
}

它应该在屏幕的左上方显示FPS

1 个答案:

答案 0 :(得分:3)

glRasterPos提供的位置被视为顶点,并由当前模型视图和投影矩阵进行转换。在您的示例中,您将文本指定为位置(20,20),我猜测它应该是屏幕(视口,真的)坐标。

如果您正在渲染3D几何体,特别是使用透视投影,则可能会剪切出您的文本。但是,有(至少)两个简单的解决方案(按照代码简单的顺序呈现):

  1. 使用其中一个glWindowPos函数而不是glRasterPos。此功能绕过模型视图和投影变换。

  2. 使用glMatrixModeglPushMatrixglPopMatrix临时切换到窗口坐标进行渲染:

    // Switch to window coordinates to render
    glMatrixMode( GL_MODELVIEW );
    glPushMatrix();
    glLoadIdentity();    
    
    glMatrixMode( GL_PROJECTION );
    glPushMatrix();
    glLoadIdentity();
    gluOrtho2D( 0, windowWidth, 0, windowHeight );
    
    glRasterPos2i( 20, 20 );  // or wherever in window coordinates
    glutBitmapString( ... );
    
    glPopMatrix();
    glMatrixMode( GL_MODELVIEW );
    glPopMatrix();