OPENGL繪製文字

  OPENGL沒有提供直接繪製文字的功能,須要藉助於操做系統。windows

  用OPENGL繪製文字比較常見的方法是利用顯示列表。建立一系列顯示列表,每一個字符對應一個列表編號。例如,'A'對應列表編號1000+'A',‘B’對應列表編號1000+'B',以此類推。繪製一個字符串時,依次調用字符串中每一個字符所對應的列表編號。函數

  在Windows操做系統上,可使用wglUseFontBitmaps函數來批量的產生顯示字符用的顯示列表。oop

  下面給出一個示例代碼。該代碼時在OPENGL紅寶書示例程序的基礎上進行修改,只作示例之用。在實際的程序中使用時,須要根據具體的需求進行修改。ui

  運行此程序的環境配置參考OPENGL紅寶書中示例程序的環境配置。spa

 

#include <windows.h>
#include <GL/gl.h>
#include <GL/glu.h>
#include <GL/freeglut.h>

#define MAX_CHAR    128
GLuint TextFont;

void XPrintString(char *s)
{
    glPushAttrib (GL_LIST_BIT);

    //調用每一個字符對應的顯示列表,繪製每一個字符
    for(; *s!='\0'; ++s)
        glCallList(TextFont + *s);

    glPopAttrib ();    
}

void display(void)
{
    glClear(GL_COLOR_BUFFER_BIT);

    glColor3f(1.0, 1.0, 1.0);

    glRasterPos3f(0.5, 0.5, 0.0);
    XPrintString("hello!");

    glFlush();
}

void init(void)
{
    glClearColor(0.0, 0.0, 0.0, 0.0);

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(0.0, 1.0, 0.0, 1.0, -1.0, 1.0);

    //申請MAX_CHAR個連續的顯示列表編號
    TextFont = glGenLists(MAX_CHAR);
        
    //把每一個字符的繪製命令都裝到對應的顯示列表中
    wglUseFontBitmaps(wglGetCurrentDC(), 0, MAX_CHAR, TextFont);  
}

int main(int argc, char ** argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
    glutInitWindowSize(250, 250);
    glutInitWindowPosition(100, 100);
    glutCreateWindow("Hello ");
    init();
    glutDisplayFunc(display);
    glutMainLoop();
    return 0;
}
相關文章
相關標籤/搜索