使用OpenGL位图字体将文本放到屏幕上

时间:2012-03-21 07:52:43

标签: opengl graphics 3d glut

我正在学习OpenGL NeHe的制作。当我来阅读第13课的位图字体时,我遇到了一个问题。我使用过滤写我的代码。我的PC系统是Windows7.I我在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 个答案:

答案 0 :(得分:2)

你可以使用glRasterPosglutBitmapCharacter这是过剩的

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]);

答案 1 :(得分:2)

您的代码没有任何问题。

我正在使用过剩的OpenGL课程。我们在课堂上遇到了一个问题,即实验室计算机正确地以正确的颜色显示字符,但是一些学生的笔记本电脑只会显示黑色的字符。所有机器都运行Windows 7,因此我们怀疑它与机器上的OpenGL版本有关。 无论如何,将你的背景颜色改为白色(或者很容易显示黑色文字的东西)。如果你的定位是正确的,你应该看到你的文字。

答案 2 :(得分:1)

GLUT已过时,不再维护。也许这就是Win7问题的原因。最后一个GLUT版本(3.7)可以追溯到1998年8月。

您可以尝试 freeglut ,这是GLUT的完全兼容替代方案,可以在不更改源代码的情况下获得100%的替换。

我刚刚尝试过NeHe Lesson 13项目(基于GLUT)

  • 使用MS Visual Studio 2005 SP2的Vista x64 SP2
  • 带有MS Visual Studio 2010 SP1(32位调试应用程序)的Windows 7(64位)

他们两个都很好!但是在带有MS VS2010的Win7下,由于一些未解决的外部问题,无法构建64位调试版本。 你有没有构建32位或64位版本? 您是否已经尝试过没有GLUT的其他NeHe下载? (http://nehe.gamedev.net/data/lessons/vc/lesson13.zip

您可以尝试更新图形驱动程序并尝试打开/关闭Windows Aero Theme,因为不同的像素格式描述符,它经常有用。

我希望有所帮助。