本文转自:http://blog.sina.com.cn/s/blog_4ff085000100devp.html

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_COLOR_BUFFER_BIT);

glColor3f(1.0f, 0.0f, 0.0f);
     glRasterPos2f(0.0f, 0.0f);
     drawString("Hello, World!");

glutSwapBuffers();
}

OpenGL显示文字--显示英文相关推荐

  1. 打开html只能显示文字,显示文字-网页显示不正常网页的背景不显示,只显示文字 – 手机爱问...

    2007-04-07 修改背景音乐列表不能键入文字 只是显示一个橘黄色的长条 你好朋友,添加播放器设置(下面是两种方法,你可以任选一种):第一步.登录新浪博客,输入"登录名"&qu ...

  2. OpenGL显示文字

    阅读这篇文章前,可以先看一下这个文字显示系列的其他文章,了解一些字符编码,字体相关的知识:https://blog.csdn.net/wlk1229/article/category/9008450 ...

  3. 转载:OpenGL显示文字

    转载:OpenGL显示文字 2010年07月03日 本课我们来谈谈如何显示文字. OpenGL并没有直接提供显示文字的功能,并且,OpenGL也没有自带专门的字库.因此,要显示文字,就必须依赖操作系统 ...

  4. opengl学习之显示文字

    本课我们来谈谈如何显示文字. OpenGL并没有直接提供显示文字的功能,并且,OpenGL也没有自带专门的字库.因此,要显示文字,就必须依赖操作系统所提供的功能了. 各种流行的图形操作系统,例如Win ...

  5. Android的TextView在显示文字的时候,如果有段中文有英文,有中文,有中文标点符号,你会发现,当要换行的时候遇到中文标点, 这一行就会空出很多空格出来...

    一.问题描述: Android的TextView在显示文字的时候,如果有段中文有英文,有中文,有中文标点符号,你会发现,当要换行的时候遇到中文标点, 这一行就会空出很多空格出来.原因是: 1) Tex ...

  6. cocos2dx中的文字显示

    cocos2d-x 中添加显示文字的三种方式 LabelTTF .LabelBMFont 和 LabelAtlas 在 cocos2d-x 中有三个类可以在层或精灵中添加文字: LabelTTF La ...

  7. python+OpenCV图像处理(三)绘制简单的几何图形、显示文字

    绘制简单的几何图形.显示文字 (一)绘制直线和矩形 img = np.zeros([512, 512, 3]) # line函数用来画直线,第一个参数可以理解为画布矩阵, # 第二个参数pt1是直线的 ...

  8. cocos2d-x学习之添加显示文字

    cocos2d 中添加显示文字的三种方式(CCLabelTTF .CCLabelBMFont 和CCLabelAtlas) 在 cocos2d 中有三个类可以在层或精灵中添加文字: CCLabelTT ...

  9. 浅谈Unity中的文字显示

    以UGUI系统为例,字体分为内置字体.外部导入字体.自定义字体. 文字一般通过Text组件进行显示.目前Unity已经官方支持TextMeshPro,因此也有一些文字通过TextMeshPro-Tex ...

最新文章

  1. PL/SQL -- 函数
  2. 【论文阅读-Bidding】《Feedback Control of Real-Time Display Advertising》
  3. Kyma Application Connectivity 特性介绍
  4. python执行一段代码_我发现了个 Python 黑魔法,执行任意代码都会自动念上一段 『平安经』...
  5. vs2013使用记录
  6. mumu模拟器android调试,如何使用网易mumu模拟器调试安卓程序?
  7. springboot实现条形码_java生成条形码(多种条码类型生成)
  8. html逐字显示并停止,Pr字幕如何让他逐字出现逐字消失?
  9. 【创建FTP】如何在内网创建属于自己的FTP
  10. MT【305】丹德林双球
  11. python爬虫二:网易博客的图片
  12. 数据中心机房光纤综合布线
  13. GUEST帐号“反客为主”
  14. 原画师一般用什么软件画画?
  15. 版本管理工具 git和SVN 忽略文件和目录
  16. C语言中%s,%m.ns 和 %e,%m.ne 的意思
  17. 监控Windows服务器
  18. python求100内五的倍数_100一百以内5的倍数有哪些
  19. NLP标注工具Brat的简单使用
  20. 计算机硬件软件分析图,中国工业软件产业链全景图布局及企业分析

热门文章

  1. ✨数织游戏✨:Python 制作的成本一毛钱却诚意满满的小礼物!!
  2. HDoj 2604 queuing
  3. 一次Log4j2日志输出阻塞问题的定位
  4. 【饭谈】软素质怎么提高?(适合软件测试人的专用办法)
  5. 【Java】 8.7 使用红-黄-红色渐变来绘制一个填充矩形
  6. 关于Arista DCS 7048交换机不支持ECN功能的说明
  7. 微型linux系统测试网卡,自制一个小型Linux(附带网络功能)
  8. Java Swing实用小工具开发
  9. Augmented Dickey–Fuller (ADF)Test 详解
  10. win 10系统电脑键盘突然失灵