函数原型:void glListBase(GLuintbase);
函数功能:使得OpengL可以找到绘制对应字符的显示列表的位置。
函数参数介绍:
GLuint base 这个参数表示显示列表的基质。
关于使用glListBase(GLuint base)进行字体创建有几点说明:
void glListBase(GLuint base)的用法让人容易误解,还有为什么会使用glListBase(ListBase - 32)的情况;
现在做一个解释:
1 通过ListBase = glGenList(96);创建96个显示列表,从ListBase索引的位置开始的96个显示列表。
2 wglUseFrontBitmaps(hDC,32,96,ListBase);根据hDC中的字体属性从ASCII码32开始创建96个显示列表,(ASCII:32到127)而且这96个显示列表依次对应于显示列表从ListBase到ListBase+96.注意例如'A'的ASCII值是65那么对应的显示列表中位于ListBase+65。
3 glListBase(ListBase - 32);因为OpengL如果要寻找‘A’那么它会首先根据ListBase值+65得到‘A’的位置。但是wglUseFrontBitmaps()使得ListBase的值与ASCII为32的一样,所以就需要将ListBase的值减32与OpengL的查询方式保持一致。
特别说明
glListBase(ListBase - 32) 的说明 在没有这段命令之前ListBase的值对应着ASCII为32的显示列表
如果使用glCallListBase()来显示字符时 如要显示‘A’ 那么他会从ListBase开始向后推进56位找到A
也就是找到ListBase+56对应位置的字符 但是ListBase对应着ASCII为32 所以ListBase+56就不是
A 所以 需要将ListBase-32 得到正确的基值。
关于glListBase(GLuint base)的补充:
1、如果想要正确理解glListBase的用法请先理解函数glCallLists(GLsizei n,GLenum type,const GLvoid *lists)的用法:此函数执行n个显示列表,执行数由n决定,所执行的列表索引是由当前显示列表基(由glListBase函数指定)指明的偏移量,加上由lists指向的数组中的有符号整数之和。
2、正如上面glGenList(96)和wglUseFrontBitmap用法,但有点小错误(个人认为),即‘A'所对应的的显示列表中的位置应是ListBase+65-32,即ListBase+33,而不是ListBase+65。
3、因为’A'的ASCII为65,而glListBase(GLuint base)中,base的默认值为0,所以如果不调用glListBase(ListBase - 32),而直接调用glCallLists(GLsizei n,GLenum type,const GLvoid *lists),么那它在想显示'A'时,调用的显示列表的索引应为base+65,即为65,这显然不是在'A'在显示列表中对应的位置ListBase+33,而当调用glListBase(ListBas - 32)后,则调用的显示列表的索引应为:ListBas - 32+65,即ListBase+33,正好便是字符'A'在显示列表中对应的位置。