网站大量收购独家精品文档,联系QQ:2885784924

OpenGL入门学习之十六——在Windows系统中显示文字.pdfVIP

OpenGL入门学习之十六——在Windows系统中显示文字.pdf

  1. 1、本文档共18页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
OpenGL入门学习之十六——在Windows系统中显示文字

OpenGL 入门学习之十六——在Windows 系统中显示文字 2009-01-07 13:34 本课我们来谈谈如何显示文字。 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 // ASCII 字符总共只有0 到 127,一共128 种字符 #define MAX_CHAR 128 void drawString(const char* str) { static int isFirstCall = 1; static GLuint lists; if( isFirstCall ) { // 如果是第一次调用,执行初始化 // 为每一个ASCII 字符产生一个显示列表 isFirstCall = 0; // 申请MAX_CHAR 个连续的显示列表编号 lists = glGenLists(MAX_CHAR); // 把每个字符的绘制命令都装到对应的显示列表中 wglUseFontBitmaps(wglGetCurrentDC(), 0, MAX_CHAR, lists); } // 调用每个字符对应的显示列表,绘制每个字符 for(; *str!=\0; ++str) glCallList(lists + *str); } 显示列表一旦产生就一直存在(除非调用glDeleteLists 销毁),所以我们只需要在第 一次调用的时候初始化,以后就可以很方便的调用这些显示列表来绘制字符了。 绘制字符的时候,可以先用glColor*等指定颜色,然后用glRasterPos*指定位置,最后 调用显示列表来绘制。 void display(void) { glClear(GL_COL

文档评论(0)

wnqwwy20 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

版权声明书
用户编号:7014141164000003

1亿VIP精品文档

相关文档