2013-06-01 67 views
2

我打算用freeglut函数glutBitmapString在屏幕上显示FPS,但它什么也没有显示。这是我的代码。有没有人可以找出问题所在?glutBitmapString不显示任何东西

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在屏幕

+0

没有真正涉及到企业的实际问题,但'字符*总分=新的char [30]; '不会被删除,所以你会漏掉每一帧。在堆栈上分配数组可能会更好。 – Grimmy

+0

谢谢。当我在调试过程中跟踪out的值时,这个值是完全正确的。它不能被打印在屏幕上。我也尝试使用glutBitmapCharacter,但它仍然没有工作 – Aaron

+0

没有足够的代码来真正说明。发布[SSCCE](http://sscce.org/)。 – genpfault

回答

3

该真实由glRasterPos提供被处理就像一个顶点,并转化通过当前模型视图矩阵和投影矩阵的位置的左上角。在你的例子中,你指定的文本位置在(20,20),我猜应​​该是屏幕(视口,真的)坐标。

如果您正在渲染3D几何图形,尤其是使用透视投影,则可能会裁剪掉文本。但是,也有(至少)两个简单的解决方案(在代码简单顺序呈现):

  1. 使用的glWindowPos功能之一,而不是glRasterPos。此功能绕过模型视图和投影转换。

  2. 使用glMatrixModeglPushMatrix,并glPopMatrix暂时切换到窗口坐标渲染:

    // 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(); 
    
+0

哇,如果我们可以停止发布不推荐使用的代码,那就太好了。 –

+0

@DavidLively虽然我不反对,但这是海报问到的。我猜如果OpenGL ARB真的想摆脱已弃用的代码,他们将不会提供兼容性配置文件以及核心配置文件。 – radical7

+0

我的评论并不是要批评你的答案,只是“时代正是它”的总体状况。我遇到了几个试图进入图形的人,他们花了几个月的时间冲出即时模式代码,然后不得不重新开始。我希望API将默认为核心配置文件。 :) –