资源预览内容
第1页 / 共15页
第2页 / 共15页
第3页 / 共15页
第4页 / 共15页
第5页 / 共15页
第6页 / 共15页
第7页 / 共15页
第8页 / 共15页
第9页 / 共15页
第10页 / 共15页
亲,该文档总共15页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
字体的绘制Bitmap Fonts位图字体的绘制1 在初始化场景函数(如Initialize)中调用CreateFont()建立位图字体由于还要用glGenLists()创建空显示列表以存储字符、用SelectObject()选进或恢复设备描述表、用DeleteObject()删除新建字体,所以实际上不是直接在初始化函数中调CreateFont,而是自定义一个函数BuildFont调用CreateFont()、glGenLists()、SelectObject()、DeleteObject()等,然后在初始化场景函数(如Initialize)中调用BuildFont。2 在退出前的扫尾函数(如Deinitialize)中调用glDeleteLists删除保存字体的显示列表该函数有参数:glDeleteLists(base,256)3 自定义函数Print用来在窗口中显示字符串,并在场景绘制函数(如DrawScene)中调用(1) 用glColor设置文字颜色;(2) 用glRasterPos设置文字显示的位置;(3) 调用Print显示文字附1 BuildFont的定义GLvoid BuildFont(GLvoid)/ 建立位图字体(Bitmap Fonts)HFONTnewFont;/ 用以保存新的字体对象HFONToldFont;/ 用以保存原字体对象base = glGenLists(256);/ 存储256个字符/上句需要定义GLuintbase;newFont = CreateFont(-18,/ 字体的高度0,/ 字体的宽度0,/ 旋转的角度0,/ 定位角度FW_THIN,/ 字体的粗细FALSE,/ 斜体?FALSE,/ 下划线?FALSE,/ 删除线?ANSI_CHARSET,/ 字符集OUT_TT_PRECIS,/ 输出精度CLIP_DEFAULT_PRECIS,/ 裁减精度ANTIALIASED_QUALITY,/ 输出质量FF_DONTCARE|DEFAULT_PITCH,/ 间距和字体族Tahoma);/ 字体名称oldFont = (HFONT)SelectObject(OGL_window-hDC, newFont); / 选进设备描述表 wglUseFontBitmaps(OGL_window-hDC, 0, 256, base);/ 建立256个字符SelectObject(OGL_window-hDC, oldFont);/ 恢复设备描述表DeleteObject(newFont);/ 删除新字体附2 Print的定义GLvoid Print(const char *fmt, .)/ 建立Print函数chartext256;/ 用以保存格式化后的字符串va_listap;/ 指向参数列表的指针if (fmt = NULL)/ 没有可输出的字符?return;/ 返回va_start(ap, fmt);/ 遍历字符串,查找变量vsprintf(text, fmt, ap);/ 将变量转换为显示的数字/上句需要添加#include / 标准输入/输出库va_end(ap);/ 结果保存在text内glPushAttrib(GL_LIST_BIT);/ 显示表状态入栈glListBase(base);/ 显示表偏移量glCallLists(int)strlen(text), GL_UNSIGNED_BYTE, text);/ 绘制字符串glPopAttrib();/ 显示表状态出栈附3 一个简单的完整例子(1) word.cpp/ 在此处引用程序要求的附加头文件:#include / 标准输入/输出库#include word.h/ 在此处加入程序要求的库到链接器中:#pragma comment(lib, opengl32.lib)#pragma comment(lib, glu32.lib)#pragma comment(lib, glaux.lib)/ 在此处定义全局变量:GL_Window*OGL_window;Keys*OGL_keys;GLuintbase;GLvoid BuildFont(GLvoid)/ 建立位图字体(Bitmap Fonts)HFONTnewFont;/ 用以保存新的字体对象HFONToldFont;/ 用以保存原字体对象base = glGenLists(256);/ 存储256个字符/上句需要定义GLuintbase;newFont = CreateFont(-18,/ 字体的高度0,/ 字体的宽度0,/ 旋转的角度0,/ 定位角度FW_THIN,/ 字体的粗细FALSE,/ 斜体?FALSE,/ 下划线?FALSE,/ 删除线?ANSI_CHARSET,/ 字符集OUT_TT_PRECIS,/ 输出精度CLIP_DEFAULT_PRECIS,/ 裁减精度ANTIALIASED_QUALITY,/ 输出质量FF_DONTCARE|DEFAULT_PITCH,/ 间距和字体族Tahoma);/ 字体名称oldFont = (HFONT)SelectObject(OGL_window-hDC, newFont); / 选进设备描述表 wglUseFontBitmaps(OGL_window-hDC, 0, 256, base);/ 建立256个字符SelectObject(OGL_window-hDC, oldFont);/ 恢复设备描述表DeleteObject(newFont);/ 删除新字体GLvoid Print(const char *fmt, .)/ 建立Print函数chartext256;/ 用以保存格式化后的字符串va_listap;/ 指向参数列表的指针if (fmt = NULL)/ 没有可输出的字符?return;/ 返回va_start(ap, fmt);/ 遍历字符串,查找变量vsprintf(text, fmt, ap);/ 将变量转换为显示的数字/上句需要添加#include / 标准输入/输出库va_end(ap);/ 结果保存在text内glPushAttrib(GL_LIST_BIT);/ 显示表状态入栈glListBase(base);/ 显示表偏移量glCallLists(int)strlen(text), GL_UNSIGNED_BYTE, text);/ 绘制字符串glPopAttrib();/ 显示表状态出栈BOOL Initialize(GL_Window* window, Keys* keys)/ 初始化场景/ 设置全局变量OGL_window= window;OGL_keys= keys;/在此处初始化绘制场景/ glClearColor(0.0f, 0.0f, 0.0f, 0.5f);/ 清屏为黑色/ glClearDepth(1.0f);/ 设置深度缓存/ glDepthFunc(GL_LEQUAL);/ 选择深度测试方式/ glEnable(GL_DEPTH_TEST);/ 开启深度测试/ glShadeModel(GL_SMOOTH);/ 阴暗处理采用平滑方式/ glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);/ 最精细的透视计算BuildFont();return TRUE;/ 初始化成功返回TRUEvoid DrawSceneGL(void)/ 绘制场景glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);/ 清除场景和深度缓存glLoadIdentity();/ 重置当前矩阵/ 在此处添加代码进行绘制:glColor3f(1.0f,0.0f,0.0f);glRasterPos3f(0.0f,0.0f,-3.0f);Print(hello world!);glFlush();/ 刷新GL命令队列void Update(void)/ 在此处更新对消息的动作if (OGL_keys-keyDownVK_ESCAPE = TRUE)/ 判断ESC键是否按下TerminateApplication(OGL_window);/ 结束程序if (OGL_keys-keyDownVK_F1 = TRUE)/ 判断F1是否按下PostMessage(OGL_window-hWnd, WM_TOGGLEFULLSCREEN, 0, 0);/ 在全屏窗口模式间切换void Deinitialize(void)/ 在此处做退出前扫尾工作glDeleteLists(base,256);(2) wordwindow.h#ifndef _WORD_WINDOW_H#define _WORD_WINDOW_H#include / Windows的头文件#include / OpenGL32库的头文件#include / Glu32库的头文件#define WM_TOGGLEFULLSCREEN (WM_USER + 1)/ 定义全屏/窗口模式切换消息#define TITLE5DGS Bitmapfonts/ 定义窗口标题#define CLASSNAME5DG_OPENGL/ 定义窗口类名#defineWIDTH640/ 定义窗口宽度#define HEIGHT480/ 定义窗口高度#define BPP16/ 定义每象素的位数/ 在此处定义与窗口相关的结构体:typedef struct / 定义处理键盘的结构体BOOL keyDown 256;/ 存储键盘按键状态的数组 Keys;typedef struct / 定义存储应用程序实例的结构体HINSTANCEhInstance;/ 应用程序实例const c
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号