OPENGL沒有提供直接繪制文字的功能,需要借助於操作系統。
用OPENGL繪制文字比較常見的方法是利用顯示列表。創建一系列顯示列表,每個字符對應一個列表編號。例如,'A'對應列表編號1000+'A',‘B’對應列表編號1000+'B',以此類推。繪制一個字符串時,依次調用字符串中每個字符所對應的列表編號。
在Windows操作系統上,可以使用wglUseFontBitmaps函數來批量的產生顯示字符用的顯示列表。
下面給出一個示例代碼。該代碼時在OPENGL紅寶書示例程序的基礎上進行修改,只做示例之用。在實際的程序中使用時,需要根據具體的需求進行修改。
運行此程序的環境配置參考OPENGL紅寶書中示例程序的環境配置。
#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; }