2013-06-01 5 views
2

Я собираюсь показать FPS на экране функцией glutBitmapString с функцией freeglut, но он ничего не показывает. Вот мой код. Кто-нибудь может понять, где проблема?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

не очень связано с актуальной проблемой, но 'символ * из = новый символ [30]; 'никогда не удаляется, поэтому вы пропускаете каждый кадр. Может быть, лучше просто выделить этот массив в стеке. – Grimmy

+0

Спасибо. Когда я отслеживаю значение out во время отладки, значение было полностью правильным. Его просто нельзя напечатать на экране. Я также пытался использовать glutBitmapCharacter, но он все еще не работал – Aaron

+0

Недостаточно кода, чтобы действительно рассказать. Отправьте сообщение [SSCCE] (http://sscce.org/). – genpfault

ответ

3

Положение, которая обеспечивается glRasterPos обрабатывают так же, как вершины, и трансформирована текущей модели ракурса и проекционных матриц. В вашем примере вы указываете, что текст должен находиться в позиции (20,20), который, как я предполагаю, должен быть координатами экрана (viewport, really).

Если это так, что вы визуализируете 3D-геометрию, особенно с перспективной проекцией, ваш текст может быть вырезан. Тем не менее, есть (по крайней мере) два простых решения (представленные в порядке кода простоты):

  1. использовать одну из функций glWindowPos вместо glRasterPos. Эта функция обходит преобразования модели и проекции.

  2. использование glMatrixMode, glPushMatrix и 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

Мой комментарий не был предназначен для того, чтобы критиковать ваш ответ, просто общее состояние Times Being What They Are. Я познакомился с несколькими парнями, которые пытались попасть в графику, потратив несколько месяцев на то, чтобы перенести код немедленного режима, а затем начать сначала. Я бы хотел, чтобы API по умолчанию имел основной профиль. :) –

Смежные вопросы