OpenGL并无直接提供显示文字的功能,而且,OpenGL也没有自带专门的字库。所以,要显示文字,就必须依赖操做系统所提供的功能了。
各类流行的图形操做系统,例如Windows系统和Linux系统,都提供了一些功能,以便可以在OpenGL程序中方便的显示文字。
最多见的方法就是,咱们给出一个字符,给出一个显示列表编号,而后操做系统由把绘制这个字符的OpenGL命令装到指定的显示列表中。当须要绘制字符的时候,咱们只须要调用这个显示列表便可。
不过,Windows系统和Linux系统,产生这个显示列表的方法是不一样的(虽然大同小异)。做为我我的,只在Windows系统中编程,没有使用Linux系统的相关经验,因此本课咱们仅针对Windows系统。
编程
OpenGL版的“Hello, World!” 写完了本课,个人感觉是:显示文字很简单,显示文字很复杂。看似简单的功能,背后却隐藏了深不可测的玄机。 呵呵,别一开始就被吓住了,让咱们先从“Hello, World!”开始。 前面已经说过了,要显示字符,就须要经过操做系统,把绘制字符的动做装到显示列表中,而后咱们调用显示列表便可绘制字符。 假如咱们要显示的文字所有是ASCII字符,则总共只有0到127这128种可能,所以能够预先把全部的字符分别装到对应的显示列表中,而后在须要时调用这些显示列表。 Windows系统中,可使用wglUseFontBitmaps函数来批量的产生显示字符用的显示列表。函数有四个参数: 第一个参数是HDC,学过Windows GDI的朋友应该会熟悉这个。若是没有学过,那也不要紧,只要知道调用wglGetCurrentDC函数,就能够获得一个HDC了。具体的状况能够看下面的代码。 第二个参数表示第一个要产生的字符,由于咱们要产生0到127的字符的显示列表,因此这里填0。 第三个参数表示要产生字符的总个数,由于咱们要产生0到127的字符的显示列表,总共有128个字符,因此这里填128。 第四个参数表示第一个字符所对应显示列表的编号。假如这里填1000,则第一个字符的绘制命令将被装到第1000号显示列表,第二个字符的绘制命令将被装到第1001号显示列表,依次类推。咱们能够先用glGenLists申请128个连续的显示列表编号,而后把第一个显示列表编号填在这里。 还要说明一下,由于wglUseFontBitmaps是Windows系统特有的函数,因此在使用前须要加入头文件:#include <windows.h>。 如今让咱们来看具体的代码: #include <windows.h> 显示列表一旦产生就一直存在(除非调用glDeleteLists销毁),因此咱们只须要在第一次调用的时候初始化,之后就能够很方便的调用这些显示列表来绘制字符了。 绘制字符的时候,能够先用glColor*等指定颜色,而后用glRasterPos*指定位置,最后调用显示列表来绘制。 void display(void) { 效果如图: ![]() |