06-OpenGL字体显示

合集下载

基于OpenGL-ES的中文字符显示

基于OpenGL-ES的中文字符显示

① 对 于单 字节 的符号 , 字节 的 第 1位设 为 0 后 面 ,
7位 为这 个 符 号 的 Uncd i e码 。 因此 对 于英 语 字母 , o
UT 一 F 8编码 和 AS I 码是 相 同的 。 CI
可 以生成 用 户 给定 字 符 的 点 阵位 图数 据 , 并定 义 了数
人 机 界 面是 用 户 和机 器 之 间 的一 种交 互 手 段 , 是
图 形 处 理 模 块 ) 硬 件 平 台 , l u . . 4 7r2 为 在 i x 2 6 2 . -t 1 n
使 用者 与 机 器之 间 沟通 、 送 与 接 收信 息 的 一个 重 要 传 途径 。随着 嵌入 式 系统硬 件 资源 的不断 升级 和 图形 用
摘 要 : 中文显示功能可 以为汉语用户提供更加 友好 的用 户体 验 , 针对嵌 入式 Ln x系统 , iu 介绍 了中文点 阵图像和纹理数 据的
获取 , UTF 8编 码 转 换 技 术 , 及 Op n L E 一 以 e G — S纹 理 映 射 技 术 , 通 过 这 些 技 术设 计 实 现 了 图 形 用 户 界 面 的彩 色 中 文 点 阵 字 符 显 示 并 功 能 , 得 了较 好 的 界 面 显 示 效 果 。 取

符 显 示在 屏 幕 上 , 际上是 将 该 字 符 的点 阵 图 像 通过 实
多 边形 ( P Y GL OL GONS 等 复杂 图元 。 )
以下 以 ADS 1 1 1开发 板 ( 成 P weVR MB 5 20 集 o r X
某 种 方法显 示 到屏 幕上 。
要获 得 某 一字 符 的点 阵 图像 , 先需 要 获 得 该 字 首

opengl汉字

opengl汉字

Opengl 汉字显示最近开始学习opengl,菜鸟将自己理解的东西在此放置,欢迎各位点评.或推荐些好的资料,谢谢目前本人所了解的opengl显示汉字的方式有几种了,什么位图显示等等,各有利弊,照本人理解,较能接受的就是初始化显示列表,然后显示,以下给出原代码.大多从其它文章copy的,但经过修改一些参数,利用Show2DText()也能显示出3D效果,是否有点蒙人的嫌疑,于是我将它们理解为两种构建显示列表的方式有所不同而已.以下是完整代码://GLFont.h#include<windows.h>#include"gl/gl.h"#include<string>#pragma warning(disable:4244)using namespace std;//OpenGL汉字显示类class GLfont{HFONT hFont;COLORREF cl;public:GLfont();virtual ~GLfont();void SetTextColor(COLORREF textcolor);//字体颜色设置void CreateFont(char *facename, int height, int weight, bool italic,bool underline,bool strikeout);void ShowText(int x, int y, LPCTSTR lpszText);//显示图象D汉字void Show2DText(char *str);//显示图形D汉字void Show3DText(unsigned char *str);//显示图形D汉字};GLfont::GLfont(){cl=RGB(255,255,255);}GLfont::~GLfont(){if(hFont) DeleteObject(hFont);}//只有关闭光照和纹理才能正确显示颜色void GLfont::SetTextColor(COLORREF textcolor)//字体颜色设置{cl=textcolor;}void GLfont::CreateFont(char*facename, int height, int weight, bool italic,bool underline,bool strikeout){LOGFONT lf;lf.lfHeight = height;lf.lfWidth = 0;lf.lfEscapement = 0;lf.lfOrientation = 0;lf.lfWeight = weight;lf.lfItalic = italic;lf.lfUnderline = underline;lf.lfStrikeOut = strikeout;lf.lfCharSet = DEFAULT_CHARSET;lf.lfOutPrecision = OUT_TT_PRECIS;lf.lfClipPrecision = CLIP_DEFAULT_PRECIS;lf.lfQuality = PROOF_QUALITY;lf.lfPitchAndFamily = VARIABLE_PITCH | TMPF_TRUETYPE | FF_MODERN;strcpy(lf.lfFaceName,facename);// 创建字体hFont = CreateFontIndirect(&lf);}//2D图像汉字只与屏幕相联系,与具体的变换矩阵无关,也就是说不能缩放旋转。

使用opengl程序在屏幕输出自己设定的字符

使用opengl程序在屏幕输出自己设定的字符

GIS专业实验报告(计算机图形学)实验7 使用opengl程序在屏幕输出自己设定的字符。

使用opengl程序在屏幕输出自己设定的字符。

二.理论基础1.ASCII:ASCII(American Standard Code for Information Interchange,美国信息互换标准代码)是基于拉丁字母的一套电脑编码系统。

它主要用于显示现代英语和其他西欧语言。

它是现今最通用的单字节编码系统,并等同于国际标准ISO/IEC 646。

2.GB2312:GB2312码是中华人民共和国国家汉字信息交换用编码,全称《信息交换用汉字编码字符集——基本集》,由国家标准总局发布,1981年5月1日实施,通行于大陆。

新加坡等地也使用此编码。

3.ANSI:unicode和ansi都是字符代码的一种表示形式。

为使计算机支持更多语言,通常使用0x80~0xFF 范围的2 个字节来表示1 个字符。

比如:汉字'中' 在中文操作系统中,使用[0xD6,0xD0] 这两个字节存储。

不同的国家和地区制定了不同的标准,由此产生了GB2312, BIG5, JIS 等各自的编码标准。

这些使用2 个字节来代表一个字符的各种汉字延伸编码方式,称为ANSI 编码。

在简体中文系统下,ANSI 编码代表GB2312 编码,在日文操作系统下,ANSI 编码代表JIS 编码。

不同ANSI 编码之间互不兼容,当信息在国际间交流时,无法将属于两种语言的文字,存储在同一段ANSI 编码的文本中。

4.MultiByteToWideChar:OpenGL的一个函数,该函数映射一个字符串到一个宽字符(unicode)的字符串。

由该函数映射的字符串没必要是多字节字符组。

三.算法设计与分析运行之前,在工程属性>>>参数中需要增加(libwinmm.a)和(libgdi32.a)引用,这样才能保证字体选择和字符绘制可以正常运行。

OpenGL进行文字显示的方法

OpenGL进行文字显示的方法

任何一个DEMO、仿真项目、游戏,都少不了文字这种媒体。

这不可不说是对图形视觉媒体的补充——我们还有一些无法超越文字来向观众表达的心事,或是补充说明,或是感悟,或是感激。

——一般的文字不属于图形渲染部分,而属于用户界面部分,这在游戏引擎中看或许一目了然,但是在底层的图形渲染API——OPENGL或D3D中,文字的显示“并不是必须”,但它是多么深深地被需要着口牙。

所以,把字体设置、文字显示作为一种图形学技术而非单纯的完全我属或他属,我是这么想的。

(同样,拾取也算是这样吧?[乱弹OpenGL选择-拾取机制Ⅰ])本文来源于ZwqXin(/), 转载请注明原文地址:/archives/opengl/opengl-font-setting-showing.html怎么表达文字呢?在OpenGL中,我们没有什么现成的东西可用,但确实有办法让我们“得到这种技术”。

让我最记忆深刻的是NEHE的两三篇教程(貌似都是十几课吧),讲述的就是今天的这个主题。

可以到NEHE网站或者在DANCINGWIND的中文翻译(见[搜集的优良OpenG L教程] )看看~。

而我所知道的这三种方法,前两种应该就是来自那里吧(记得~~),当时要努力完成课程DEMO,于是胡胡混混地就把相应的那两三课学了,而且把它的文字显示方法应用到自己的程序中(还经历了一段艰辛的探索史...连我当时的MyFont类也记录了这份小辛酸,现在看来,是因为当时的知识水平不够理解吧)。

然后后来又一个课程DEMO,老师后来觉得我应该“写中文”,于是我又去探索中文字体显示方法了,并在一个开源DEMO中找到,分析代码段后就拿来主义了,至昨不曾好好考究——这就是我所知的第三种方法。

三种方法都是三步曲:在初始化的时候“创建字体”[Build],在渲染阶段“应用字体”(显示文字)[Print],在程序结束或不再需要文字显示的时候“销毁字体”[kill]。

其中前两步比较重要,着重讨论讨论哈~1. 常规的屏幕字体打印(NormalFont)应用得比较广,大名鼎鼎的AZURE以前的DEMO就是用这个的。

OpenGL 设置

OpenGL 设置

OpenGL 设置单击opengl设置选项卡,您将可以对显示卡的opengl 性能进行设置。

1、性能和兼容性选项可以让您设定opengl 程序的相关性能和兼容性设置。

启用缓冲区扩展:该选项允许驱动程序使用opengl 扩展gl_ktx_buffer_region。

使双面扩展可以使用本机视频内存:当gl_ktx_buffer_region 功能被允许时,该选项允许使用本地显示内存。

使用快速线性mip映射线性过滤:使用该功能会以损失图象质量为代价提高应用程序的性能,通常情况下,这些损失并不太为人们所注意。

启用各向异性过滤:该功能允许opengl 使用各向异性过滤来提高图形质量。

启用其他深度缓冲:该功能让硬件为16 位应用使用不同的机制进行深度缓冲。

使用该功能会很大程度地提高3d 图形质量。

禁用对cpu增强指令集的支持:该功能会禁止某些cpu 的增强3d 指令功能支持。

2、用于纹理的默认颜色深度:决定opengl 应用采用哪种默认的色彩深度,可选项有:使用桌面颜色深度(默认值),始终使用16位颜色深度,始终使用32位颜色深度。

3、缓冲翻转模式:用来决定全屏幕opengl 应用采用哪种缓冲模式,可选项有:自动选择(默认),使用位块传输,使用页面翻转。

4、垂直同步:可以让您指定opengl 应用中垂直同步的处理模式,可选项有:默认设置为打开(默认值),默认设置位关闭,始终关闭。

5、全景平滑处理方法:该选项可以让您选择全景平滑处理方法,可选项有:未平滑处理,1.5×1.5,2×2【lod偏移】,2×2。

6、用于pci模式下纹理的系统内存容量:该选项可以让您决定使用多大的系统内存来进行纹理存储。

该选项仅适用于pci 显示卡或者agp 显示卡工作在pci兼容模式。

7、自定义opengl 设置:该选项可以让您按照自己的喜好或者不同的游戏定义多种opengl 设置方案,并保存和随时更改这些设置。

06-OpenGL字体显示

06-OpenGL字体显示

OpenGL 字体显示在OpenGL中,提供了预定义的字库,可以满足一般的需求,用户也可以自定义字库,OpenGL红宝书中有自定义字库的详细过程。

OpenGL预定义字库中提供了位图字符和矢量字符两种显示方式V oid glutBitmapCharacter(void *font,int character); //位图字符其中font是GLUT常量,指定点阵字库,如:GLUT_BITMAP_8_BY_13,GLUT_BITMAP_9_BY_15,V oid glutStrokeCharacter(void *font,int character); //矢量字符Font 的取值有glut_stroke_roman 等间距Roman Simplex 字体,glut_stroke_mono_roman 单一间距Roman Simplex 字体。

本例演示了矢量字符的两种间距以及24磅位图字符的显示。

显示效果:代码:#include <windows.h>#include <glut.h>#include <gl.h>int width = 200,height = 100;void init(){glClearColor(0,0,0,0);}void Reshape(int w,int h){width=w;height=h;glViewport(0,0,w,h);glMatrixMode(GL_PROJECTION);glLoadIdentity();gluOrtho2D(0.0,width,0.0,height);}void display(){glClear(GL_COLOR_BUFFER_BIT);glColor3f(1.0f,1.0f,0.0f);glLineWidth(2.0); //设置笔画的大小glTranslatef(0,250,0); //设置字符显示的位置,否则贴底显示不能完全显示部分字符glutStrokeCharacter(GLUT_STROKE_ROMAN,79); //输出字体为GLUT_STROKE_ROMAN的OpenGL,从大写O开始,ASSCI码为79glutStrokeCharacter(GLUT_STROKE_ROMAN,112);glutStrokeCharacter(GLUT_STROKE_ROMAN,101);glutStrokeCharacter(GLUT_STROKE_ROMAN,110);glutStrokeCharacter(GLUT_STROKE_ROMAN,71);glutStrokeCharacter(GLUT_STROKE_ROMAN,76);glTranslatef(-460,-150,0); //调整下一行显示的位置glutStrokeCharacter(GLUT_STROKE_MONO_ROMAN,79); //输出字体为GLUT_STROKE_MONO_ROMAN的OpenGL,从大写O开始,ASSCI码为79 glutStrokeCharacter(GLUT_STROKE_MONO_ROMAN,112);glutStrokeCharacter(GLUT_STROKE_MONO_ROMAN,101);glutStrokeCharacter(GLUT_STROKE_MONO_ROMAN,110);glutStrokeCharacter(GLUT_STROKE_MONO_ROMAN,71);glutStrokeCharacter(GLUT_STROKE_MONO_ROMAN,76);glutBitmapCharacter(GLUT_BITMAP_TIMES_ROMAN_24,'O'); //显示24磅的times Roman 点阵字体glutBitmapCharacter(GLUT_BITMAP_TIMES_ROMAN_24,'p');glutBitmapCharacter(GLUT_BITMAP_TIMES_ROMAN_24,'e');glutBitmapCharacter(GLUT_BITMAP_TIMES_ROMAN_24,'n');glutBitmapCharacter(GLUT_BITMAP_TIMES_ROMAN_24,'G');glutBitmapCharacter(GLUT_BITMAP_TIMES_ROMAN_24,'L');glutSwapBuffers();}int main(int argc, char* argv[]){glutInit(&argc,argv);glutInitDisplayMode( GLUT_DOUBLE | GLUT_RGB );glutInitWindowSize( 650, 400 );glutInitWindowPosition( 100,100 );glutCreateWindow("show OpenGL"); //´°¿ÚÃûΪ"rectangle"init();glutDisplayFunc(display);glutReshapeFunc(Reshape);glutMainLoop();return 0;}。

OpenGL进行文字显示的方法

OpenGL进行文字显示的方法

O p e n G L进行文字显示的方法Company Document number:WTUT-WT88Y-W8BBGB-BWYTT-19998任何一个DEMO、仿真项目、游戏,都少不了文字这种媒体。

这不可不说是对图形视觉媒体的补充——我们还有一些无法超越文字来向观众表达的心事,或是补充说明,或是感悟,或是感激。

——一般的文字不属于图形渲染部分,而属于用户界面部分,这在游戏引擎中看或许一目了然,但是在底层的图形渲染API——OPENGL或D3D中,文字的显示“并不是必须”,但它是多么深深地被需要着口牙。

所以,把字体设置、文字显示作为一种图形学技术而非单纯的完全我属或他属,我是这么想的。

(同样,拾取也算是这样吧[])本文来源于ZwqXin(),转载请注明原文地址:怎么表达文字呢在OpenGL中,我们没有什么现成的东西可用,但确实有办法让我们“得到这种技术”。

让我最记忆深刻的是NEHE的两三篇教程(貌似都是十几课吧),讲述的就是今天的这个主题。

可以到或者在DANCINGWIND的中文翻译(见[])看看~。

而我所知道的这三种方法,前两种应该就是来自那里吧(记得~~),当时要努力完成课程DEMO,于是胡胡混混地就把相应的那两三课学了,而且把它的文字显示方法应用到自己的程序中(还经历了一段艰辛的探索史...连我当时的MyFont类也记录了这份小辛酸,现在看来,是因为当时的知识水平不够理解吧)。

然后后来又一个课程DEMO,老师后来觉得我应该“写中文”,于是我又去探索中文字体显示方法了,并在一个开源DEMO中找到,分析代码段后就拿来主义了,至昨不曾好好考究——这就是我所知的第三种方法。

三种方法都是三步曲:在初始化的时候“创建字体”[Build],在渲染阶段“应用字体”(显示文字)[Print],在程序结束或不再需要文字显示的时候“销毁字体”[kill]。

其中前两步比较重要,着重讨论讨论哈~1.常规的屏幕字体打印(NormalFont)应用得比较广,大名鼎鼎的AZURE以前的DEMO就是用这个的。

C++下的OpenGL文字显示的完美解决方案

C++下的OpenGL文字显示的完美解决方案

C++下的OpenGL文字显示的完美解决方案C++下的OpenGL文字显示的完美解决方案以前一直用Delphi+OpenGL搞图形开发。

最近改用VC++了。

比起Delphi而言,VC++最大的不同就在于没有统一的封装库(在Delphi中一律是VCL),如果仅为一点东西就使用某个库会使整个程序看起来极不协调。

这里的介绍的方法原理跟我以前在Delphi中使用的方法是一致的。

只不过没有使用任何封装库而已。

我曾在网上看过许多文字的解决方案,它们大多不能让人满意。

有一种方法采用wgl函数生成某个具体的文字的显示列表,并在渲染时调用显示列表。

这种方法必须为每个文字创建显示列表,文字一多就显得不够灵活。

因此我采用的方法是先用GDI把指定的文字绘制到内存中的Bitmap中去,在把Bitmap转换成纹理送给OpenGL。

这里也顺便小结一下Windows GDI,如果你对Windows GDI已十分熟悉可以跳过此节。

一提到GDI,很多人肯定会认为这个方法很慢。

其实不尽然。

GDI 的绘图函数比起OpenGL来确实慢了许多,但如果用的好,并不会影响程序的效率。

因为大多数情况下,你并不需要在每一帧都要重复使用GDI来绘制文字。

在实际应用中,大多数文字是静态的,少数文字在某些帧会发生改变。

因此我们需要这样的一种方法,它不仅能绘制出高质量的字体,而且在需要时可以不影响系统效率地灵活地改变。

单击这里下载本文的代码概念介绍首先要解决的问题是如何使用Windows GDI创建位图,然后在位图中绘制文字,并把绘制后的位图读取出来。

这一部分跟OpenGL 没有任何关系,并且这一操作也无需在每一帧都执行。

这一部分概括如下:1. 创建Windows GDI 设备环境2. 创建一个内存中的位图对象,并把它指定到设备环境中去3. 为设备环境指定绘图参数,如笔的颜色,背景颜色等等4. 调用Windows GDI绘图函数在设备环境中绘图5. 把位图对象中的信息抓取出来先解释一下Windows GDI的一些概念。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

OpenGL 字体显示
在OpenGL中,提供了预定义的字库,可以满足一般的需求,用户也可以自定义字库,OpenGL红宝书中有自定义字库的详细过程。

OpenGL预定义字库中提供了位图字符和矢量字符两种显示方式
V oid glutBitmapCharacter(void *font,int character); //位图字符
其中font是GLUT常量,指定点阵字库,如:
GLUT_BITMAP_8_BY_13,GLUT_BITMAP_9_BY_15,
V oid glutStrokeCharacter(void *font,int character); //矢量字符
Font 的取值有glut_stroke_roman 等间距Roman Simplex 字体,glut_stroke_mono_roman 单一间距Roman Simplex 字体。

本例演示了矢量字符的两种间距以及24磅位图字符的显示。

显示效果:
代码:
#include <windows.h>
#include <glut.h>
#include <gl.h>
int width = 200,height = 100;
void init(){
glClearColor(0,0,0,0);
}
void Reshape(int w,int h){
width=w;
height=h;
glViewport(0,0,w,h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(0.0,width,0.0,height);
}
void display(){
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1.0f,1.0f,0.0f);
glLineWidth(2.0); //设置笔画的大小
glTranslatef(0,250,0); //设置字符显示的位置,否则贴底显示不能完全显示部分字符
glutStrokeCharacter(GLUT_STROKE_ROMAN,79); //输出字体为
GLUT_STROKE_ROMAN的OpenGL,从大写O开始,ASSCI码为79
glutStrokeCharacter(GLUT_STROKE_ROMAN,112);
glutStrokeCharacter(GLUT_STROKE_ROMAN,101);
glutStrokeCharacter(GLUT_STROKE_ROMAN,110);
glutStrokeCharacter(GLUT_STROKE_ROMAN,71);
glutStrokeCharacter(GLUT_STROKE_ROMAN,76);
glTranslatef(-460,-150,0); //调整下一行显示的位置
glutStrokeCharacter(GLUT_STROKE_MONO_ROMAN,79); //输出字体为
GLUT_STROKE_MONO_ROMAN的OpenGL,从大写O开始,ASSCI码为79 glutStrokeCharacter(GLUT_STROKE_MONO_ROMAN,112);
glutStrokeCharacter(GLUT_STROKE_MONO_ROMAN,101);
glutStrokeCharacter(GLUT_STROKE_MONO_ROMAN,110);
glutStrokeCharacter(GLUT_STROKE_MONO_ROMAN,71);
glutStrokeCharacter(GLUT_STROKE_MONO_ROMAN,76);
glutBitmapCharacter(GLUT_BITMAP_TIMES_ROMAN_24,'O'); //显示24磅的times Roman 点阵字体
glutBitmapCharacter(GLUT_BITMAP_TIMES_ROMAN_24,'p');
glutBitmapCharacter(GLUT_BITMAP_TIMES_ROMAN_24,'e');
glutBitmapCharacter(GLUT_BITMAP_TIMES_ROMAN_24,'n');
glutBitmapCharacter(GLUT_BITMAP_TIMES_ROMAN_24,'G');
glutBitmapCharacter(GLUT_BITMAP_TIMES_ROMAN_24,'L');
glutSwapBuffers();
}
int main(int argc, char* argv[])
{
glutInit(&argc,argv);
glutInitDisplayMode( GLUT_DOUBLE | GLUT_RGB );
glutInitWindowSize( 650, 400 );
glutInitWindowPosition( 100,100 );
glutCreateWindow("show OpenGL"); //´°¿ÚÃûΪ"rectangle"
init();
glutDisplayFunc(display);
glutReshapeFunc(Reshape);
glutMainLoop();
return 0;
}。

相关文档
最新文档