资源描述:
《第七章opengl文字显示》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、OpenGL文字显示(一)显示英文OpenGL并没有直接提供显示文字的功能,并且,OpenGL也没有自带专门的字库。因此,要显示文字,就必须依赖操作系统所提供的功能了。各种流行的图形操作系统,例如Windows系统和Linux系统,都提供了一些功能,以便能够在OpenGL程序中方便的显示文字。最常见的方法就是,我们给出一个字符,给出一个显示列表编号,然后操作系统由把绘制这个字符的OpenGL命令装到指定的显示列表中。当需要绘制字符的时候,我们只需要调用这个显示列表即可。假如我们要显示的文字全部是ASCII字符
2、,则总共只有0到127这128种可能,因此可以预先把所有的字符分别装到对应的显示列表中,然后在需要时调用这些显示列表。Windows系统中,可以使用wglUseFontBitmaps函数来批量的产生显示字符用的显示列表。函数有四个参数:第一个参数是HDC,这是Windows GDI的里的东西,调用wglGetCurrentDC函数,就可以得到一个HDC了。第二个参数表示第一个要产生的字符,因为我们要产生0到127的字符的显示列表,所以这里填0。第三个参数表示要产生字符的总个数,因为我们要产生0到127的字符的
3、显示列表,总共有128个字符,所以这里填128。第四个参数表示第一个字符所对应显示列表的编号。假如这里填1000,则第一个字符的绘制命令将被装到第1000号显示列表,第二个字符的绘制命令将被装到第1001号显示列表,依次类推。我们可以先用glGenLists申请128个连续的显示列表编号,然后把第一个显示列表编号填在这里。我们为了简化view中的代码,特建立字符显示类COpenGLFont(后面给出):#define MAX_CHAR 128 wglUseFontBitmaps(wglGetCur
4、rentDC(), 0, MAX_CHAR, lists);在字符类中添加显示字符函数:voidCOpenGLFont::drawString(constchar*str){staticintisFirstCall=1;staticGLuintlists;if(isFirstCall){//如果是第一次调用,执行初始化//为每一个ASCII字符产生一个显示列表isFirstCall=0;//申请MAX_CHAR个连续的显示列表编号lists=glGenLists(MAX_CHAR);//编号分别是lists,
5、lists+1,lists+2,lists+MAX_CHAR-1//把每个字符的绘制命令都装到对应的显示列表中wglUseFontBitmaps(wglGetCurrentDC(),0,MAX_CHAR,lists);//从基数lists开始依次显示各个字符}//调用每个字符对应的显示列表,绘制每个字符for(;*str!=' ';++str)glCallList(lists+*str);}显示列表一旦产生就一直存在(除非调用glDeleteLists销毁),所以我们只需要在第一次调用的时候初始化,以后就可
6、以很方便的调用这些显示列表来绘制字符了。绘制字符的时候,可以先用glColor*等指定颜色,然后用glRasterPos*指定位置,最后调用显示列表来绘制。#include"OpenGLFont.h"voidCMFCOpenGLView::OnDraw(CDC*/*pDC*/){CMFCOpenGLDoc*pDoc=GetDocument();ASSERT_VALID(pDoc);if(!pDoc)return;//TODO:在此处为本机数据添加绘制代码glClearColor(0.0f,0.0f,0.7f,
7、1.0f);//背景设置glClear(GL_COLOR_BUFFER_BIT
8、GL_DEPTH_BUFFER_BIT);glMatrixMode(GL_MODELVIEW);glLoadIdentity();gluLookAt(0,0,10,0,0,0,0,1,0);glColor3f(1,0,0);glRasterPos4s(-2,0,0,1);//指定位置COpenGLFontfont;font.drawString("chinesecharactershowtest!12345");glFinish(
9、);SwapBuffers(wglGetCurrentDC());}指定字体:在产生显示列表前,Windows允许选择字体。在COpenGLFont类中定义一个selectFont函数来实现它,大家可以看看代码。voidCOpenGLFont::selectFont(intsize,intcharset,constchar*face){HFONThFont=CreateFontA(size,//指定