Используйте растровые шрифты OpenGL, чтобы поместить текст на экран - PullRequest
1 голос
/ 21 марта 2012

Сейчас я изучаю производство OpenGL NeHe. Когда я читаю уроки 13 «Растровые шрифты», я сталкиваюсь с проблемой. Я пишу свой код, используя glut. И моя система ПК - Windows7.Я запускаю свой код в Microsoft Visual Studio 2008 и ошибки нет. Но в окне ничего не появляется. Не знаю, что не так. Что может вызвать эту проблему вообще? Я пропустил некоторые настройки?

Вот мой код:

#pragma comment(lib,"GLAUX.LIB")

#include <GL/glut.h>
#include <windows.h>
#include <GL/glaux.h>
#include <stdio.h>
#include <stdarg.h>
#include <math.h>

HDC hDC = NULL;
GLuint base;//the first display list we create
GLfloat cnt1,cnt2;//move on the screen or set color

GLvoid buildFont()                              // Build Our Bitmap Font
{
HFONT   font;                                       // Windows Font ID
HFONT   oldfont;                                    // Used For Good House Keeping

base = glGenLists(96);                              // Storage For 96 Characters

font = CreateFont(  
    -24,                            // Height Of Font
    0,                              // Width Of Font
    0,                              // Angle Of Escapement
    0,                              // Orientation Angle
    FW_BOLD,                        // Font Weight
    FALSE,                          // Italic
    FALSE,                          // Underline
    FALSE,                          // Strikeout
    ANSI_CHARSET,                   // Character Set Identifier
    OUT_TT_PRECIS,                  // Output Precision
    CLIP_DEFAULT_PRECIS,            // Clipping Precision
    ANTIALIASED_QUALITY,            // Output Quality
    FF_DONTCARE|DEFAULT_PITCH,      // Family And Pitch
    "Times New Roman");                 // Font Name

oldfont = (HFONT)SelectObject(hDC, font);           // Selects The Font We Want
wglUseFontBitmaps(hDC, 32, 96, base);               // Builds 96 Characters Starting At Character 32
SelectObject(hDC, oldfont);                         // Selects The Font We Want
DeleteObject(font);                                 // Delete The Font
}

void killFont()
{
glDeleteLists(base,96);
}

void glPrint(const char *fmt, ...)                  // Custom GL "Print" Routine
{
char        text[256];                              // Holds Our String
va_list     ap;                                     // Pointer To List Of Arguments

if (fmt == NULL)    // If There's No Text
{
    printf("the string to print is NULL!\n");
    return;                                         // Do Nothing
}

va_start(ap, fmt);                                  // Parses The String For Variables
vsprintf(text, fmt, ap);                        // And Converts Symbols To Actual Numbers
va_end(ap);                                         // Results Are Stored In Text

glPushAttrib(GL_LIST_BIT);                          // Pushes The Display List Bits
glListBase(base - 32);                              // Sets The Base Character to 32
glCallLists(strlen(text), GL_UNSIGNED_BYTE, text);  // Draws The Display List Text
glPopAttrib();                                      // Pops The Display List Bits
}

int init(GLvoid)                                        // All Setup For OpenGL Goes Here
{
glShadeModel(GL_SMOOTH);                            // Enable Smooth Shading
glClearColor(0.0f, 0.0f, 0.0f, 0.5f);               // Black Background
glClearDepth(1.0f);                                 // Depth Buffer Setup
glEnable(GL_DEPTH_TEST);                            // Enables Depth Testing
glDepthFunc(GL_LEQUAL);                             // The Type Of Depth Testing To Do
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);  // Really Nice Perspective Calculations

buildFont();                                        // Build The Font

return TRUE;                                        // Initialization Went OK
}

void display()                                  // Here's Where We Do All The Drawing
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Clear Screen And Depth Buffer
glLoadIdentity();                                   // Reset The Current Modelview Matrix
glTranslatef(0.0f,0.0f,-1.0f);                      // Move One Unit Into The Screen
// Pulsing Colors Based On Text Position
glColor3f(1.0f*float(cos(cnt1)),1.0f*float(sin(cnt2)),1.0f-0.5f*float(cos(cnt1+cnt2)));
// Position The Text On The Screen
glRasterPos2f(-0.45f+0.05f*float(cos(cnt1)), 0.32f*float(sin(cnt2)));
glPrint("Active OpenGL Text With NeHe - %7.2f", cnt1);  // Print GL Text To The Screen      

glutSwapBuffers();// Everything Went OK
}

void spinDisplay()
{
cnt1 += 0.051f;
cnt2 += 0.005f;
printf("cnt1: %f\n",cnt1);
printf("cnt2: %f\n",cnt2);
}

void reshape(int w,int h)
{
if (0 == h)
    h = 1;

glViewport(0,0,(GLsizei)w,(GLsizei)h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(60.0f,(GLfloat)w / (GLfloat)h,1,100);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}

int main(int argc,char** argv)
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
glutInitWindowSize(600,600);
glutInitWindowPosition(100,100);
glutCreateWindow("Bitmap Fonts");
init();
glutDisplayFunc(display);
glutReshapeFunc(reshape);
glutIdleFunc(spinDisplay);
//glutKeyboardFunc(keyboard);
glutMainLoop();
killFont();
return 0;
}

Это результат Visual Studio 2008: enter image description here

Ответы [ 3 ]

2 голосов
/ 23 марта 2012

вы можете использовать glRasterPos и glutBitmapCharacter это присутствует в glut

glRasterPos3f( 30.0f , 25.0f ,0.0f );
glutBitmapCharacter( GLUT_BITMAP_HELVETICA_18 , 'A');

или использовать glutBitmapString (поддерживается в токе freeglut).

glRasterPos3f(30.0f , 20.0f ,0.0f);
glutBitmapString( GLUT_BITMAP_HELVETICA_18 , "Hello World!" );

если вы не можете использовать glutBitmapString для печати строки, вы можете использовать цикл

char *a="Hello World!";
glRasterPos3f( 30.0f , 25.0f ,0.0f );
for(i = 0; a[i] != '\0'; i++)
    glutBitmapCharacter( GLUT_BITMAP_HELVETICA_18 , a[i]);
2 голосов
/ 19 сентября 2012

В вашем коде нет ничего плохого.

Я учусь в OpenGL с помощью перенасыщения.В классе мы столкнулись с проблемой, когда компьютеры лабораторий правильно отображали символы в правильных цветах, но некоторые ноутбуки учеников отображали символы только в черном цвете.Все машины работают под управлением Windows 7, поэтому мы подозреваем, что это связано с тем, какая версия OpenGL установлена ​​на машине.В любом случае измените цвет фона на белый (или что-то, что легко покажет черный текст).Вы должны увидеть свой текст, если ваше расположение правильное.

1 голос
/ 23 марта 2012

GLUT устарел и больше не поддерживается.Может быть, это причина проблемы на Win7.Последняя версия GLUT (3.7) датируется августом 1998 года.

Вы можете попробовать freeglut , полностью совместимую альтернативу GLUT, чтобы получить 100% замену без изменениячто-нибудь в источнике.

Я только что попробовал проект NeHe Lesson 13 (на основе GLUT) на

  • Vista x64 SP2 с MS Visual Studio 2005 SP2
  • Windows7 (64-разрядная версия) с MS Visual Studio 2010 SP1 (32-разрядное приложение для отладки)

Оба они отлично работают!Но под Win7 с MS VS2010 64-битная отладочная версия не может быть построена из-за некоторых нерешенных внешних проблем.Вы создали 32-битную или 64-битную версию?Вы уже пробовали другие загрузки NeHe без GLUT?(http://nehe.gamedev.net/data/lessons/vc/lesson13.zip)

Вы можете попробовать обновить графический драйвер и попробовать включить / выключить Windows Aero Theme, это часто помогает из-за разного дескриптора формата пикселей.

Надеюсь, это поможет.

...