2013-06-01 141 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將默認爲核心配置文件。 :) –