Nehe OpenGL教程第十三课 位图字体

本教程介绍了如何在OpenGL程序中使用位图字体,实现类似Wordpad或Microsoft Word中的字体效果。通过创建和使用显示列表,可以轻松地在屏幕上显示文本,且能够动态改变文本位置和颜色。教程提供了Windows平台相关的代码示例,展示了如何创建、使用和销毁位图字体。
摘要由CSDN通过智能技术生成

13 位图字体(Bitmap Fonts)

欢迎进入新的一课。这次我将会教你们使用位图字体( Bitmap Fonts),你可能会对自己说过:“把文本输出到屏幕上好难啊”。如果你尝试过,就会知道那并不是想象中那么容易。

       当然,你可以运行一个图形编辑器,把文本输入并保存为图象,然后再把图象加载到OpenGL的程序中去,然后把混合打开,让文体输出到屏幕。但是这是非常耗时的,而且最后的结果可能看起来模糊或是成块,这取决于你使用哪种滤波,除非你的图象有alpha通道,一旦它被映射到屏幕上,你的文本就可以和屏幕上的物体混合起来。

       如果你使用过Wordpad, Microsoft Word或是其它文字处理软件,你会注意到各种不同的类型的字体(Fonts)都可以使用。这课就将教你怎样在你自己的OpenGL程序里使用这些字体。实际上,你在计算机中安装的任何一种字体都可以在你的demo中使用。

       Bitmap Font不仅可以比图形化后的纹理字体好100倍,而且你可以任意改变文本。而且不需要特地为每个词或字母产生对应的纹理。只要定位文本,使用我们新的方便的glPrint()命定就可以将文本显示在屏幕上。

       我尽量让这条命令简单易懂。所以你需要做的就是键入glPrint(“Hello”)。就是那么简单。你可以用很长的介绍来说你因为这份教程而非常开心,然而写这个程序花费我大约1.5个小时。为什么这么长呢?因为并没有任何可以得到的关于使用Bitmap Font的文字信息,当然,除非你喜欢MFC代码。为了让这代码简单,我决定用简单易懂的C代码来写程序。J

       小小的说明:这些代码是与windows相关的。它使用了Windowswgl函数来产生字体。显然,Appleagl来支持其平台,Xglx。不幸的是,我不能保证这些代码可以被移植的。如果任何人有平台无关的代码在屏幕上画字体,请将它发送给我,然后我将会写另一个教程。

       我们将从Lesson 1中的典型的代码开始。我们将添加stdio.h用于输入/输出操作;stdarg.h头文件用来编译文本和将变量转化成文本,最后math.h文件让我们可以用SINCOS来变化文本。

#include <windows.h>           // Windows头文件
#include <math.h>                 // Windows
数学库头文件(增加)
#include <stdio.h>                //
标准输入/输出头文件(增加)
#include <stdarg.h>               //
变量参数操作头文件(增加)
#include <gl/gl.h>                // OpenGL32
库头文件

#include <gl/glu.h>               // GLu32库头文件
#include <gl/glaux.h>             // GLaux
库头文件

HDC       hDC=NULL;               //
私有GDI设备环境
HGLRC     hRC=NULL;               //
长期渲染环境

HWND      hWnd=NULL;           // 记录windows handle变量
HINSTANCE hInstance;           //
记录instance handle变量

我们还将新增加3个变量。Base将会存储第一个显示列表的值.每个字母都需要其自己的显示列表。’A’字母的显示列表是65’B’的是66,’C’的是67等等。所以’A’应该被存在第base+65个显示列表里。

接下来,我们增加两个counter: cnt1,cnt2。这些计数器将会以不同的比率来计数,以用来让文本通过SINCOS在屏幕上移动。这将会产生在屏幕上产生一个伪随机运动。我们将会使用计数器来控制文体的颜色。(之后将会有更多关于这方面的内容)、

GLuint base;                      // 显示列表的第一个列表值
GLfloat   cnt1;                   //
计数器1:用来移动文本和改变颜色
GLfloat   cnt2;                   //
计数器2:用来移动文体和改变颜色

bool   keys[256];              // 用于处理键盘消息的数组
bool   active=TRUE;               //
窗口活动标记,默认为TRUE
bool   fullscreen=TRUE; //
全屏幕标记,默认为TRUE

LRESULT   CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);   // WndProc
函数声明

接下来的代码将产生真正的字体。这是最难写代码的部分。用简写的英文’HFONT’告诉Windows我们将要控制一个Windows字体。oldfont是用来保存之前的字体以便以后恢复。

下面我们将来定义基。我们首先通过glGenLists(96)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值