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的一些概念。

OpenGL功能简介

OpenGL功能简介
例如,调用 glColor3f(1.0, 1.0, 0.0) 设置当前 颜色为黄色之后,除非再次调用 glColor* 函 数,系统的当前颜色将一直保持为黄色
状态变量通过函数 glEnable() 和 glDisable() 进行激活或取消的设置
OpenGL状态机制(2/2)
每一个状态变量都有系统默认的缺省值 状态变量的当前值可以通过一系列函数查询
顶点数据 Vertex data
OpenGL渲染流水线(7/20)
求值器
参数化的曲面曲线(如贝塞尔,NURBS曲面曲线) 并不直接给出顶点,而是给出一系列控制点及其生成 曲面曲线的函数 求值器的功能就是,通过控制点和生成函数,得到实 际使用的顶点数据 对于非参数化曲面曲线,这一步是被忽略的
顶点数据 Vertex data 求值器 Evaluators
对每个顶点的操作和图元装配
对象坐标 Object 人眼坐标 Eye 裁剪 Clip 归一化 Normalize 窗口坐标 Window
顶点 Vertex
模型视图矩阵 Modelview matrix
投影矩阵 Project matrix
透视除法 Perspective division
视区变换 Viewport transform
OpenGL基本功能(5/11)
矩阵变换
无论多复杂的图形都是由基本图元组成并经 过一系列变换来实现的 OpenGL提供四种基本变换:平移、旋转、按 比例缩放、镜像 OpenGL提供两种投影变换:平行投影(正射 投影)、透视投影
OpenGL基本功能(6/11)
颜色管理
OpenGL提供了两种颜色模式:RGBA模式,颜色索 引模式(Color index) RGBA模式为每个像素点指定颜色,可提供丰富多彩 的色彩效果,其中A是混合因子,用于各种特效处理 对于显示能力不足的硬件,可采用颜色索引模式,系 统提供一个颜色表,通常有256或4096种颜色,各像 素点通过索引颜色表项得到颜色值

OpenGL状态下的字符串的显示

OpenGL状态下的字符串的显示

i+=2;
}else
{
nChar=str[i];
i++;
}
GLYPHMETRICSFLOAT agmf[1];
BOOL bOK=wglUseFontOutlines(hdc,nChar,1,m_iDisplayList+j,0.002f,0,WGL_FONT_POLYGONS,agmf);
strcpy( CLogFont.lfFaceName, LPCTSTR(strFontName) );
CLogFont.lfHeight=-10;
CLogFont.lfWidth=0;
hNewCFont=CreateFontIndirect(&CLogFont);
HFONT hOldFont=(HFONT)SelectObject(hdc,hNewCFont);
glNewList( m_iDisplayList, GL_COMPILE);
for(int i=1;i<=iNum;i++)
{
glPushMatrix();
//此处修改文字间距
glTranslated(m_dX+m_dHeight*(i-1),m_dY,0);
glScaled(m_dHeight,m_dHeight,1);
glCallList(m_iDisplayList+i);
glPopMatrix();
}
glEndList();
return TRUE;
}
void COpenGLText::Free()
2:wglUseFontOutlines函数的第五个参数表示文字的精度(弦偏差),一般设置成零,但这样缺省的做法会导致文字太粗糙,可以将它设置成一个比较小的数,以提高文字显示的精确度,但这样会增加内存的占用量。

OpenGL显示字体

OpenGL显示字体

OpenGL显示字体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。

OpenGL支持库及向导使用教程

OpenGL支持库及向导使用教程

OpenGL支持库及向导使用教程关键词:OpenGL、支持库、向导、3D、图形、编程前言当前OpenGL的应用已经相当广泛了,在各种操作系统上都能看到它在发挥作用。

使用Basic,C,C++、Pascal,Java等语言也都能进行OpenGL编程。

为了能让更多的易语言的爱好者能熟练地使用OpenGL支持库及向导,特编写了本教程。

本教程为易语言的OpenGL支持库及向导的使用教程,是一篇面向OpenGL初学者的基础教程。

希望能为广大的初学者提供一种学习的方向和捷径。

在第二章里具体介绍了支持库中涉及到的各种命令和OpenGL的使用的经验。

教程内没有过多地涉及OpenGL内部结构和运行机制,可能不适合使用其他编程语言的用户和OpenGL的高级用户。

由于作者水平有限,教程中难免有不妥甚至错误之处,希望读者不吝指正。

编者2013年5月目录第一章、OPENGL支持库的基本介绍1第二章、OPENGL的应用2第一节、建立使用O PEN GL的组件2第二节、空间定位7第三节、基础建模9第四节、绚丽的颜色11第五节、显示列表14第六节、光照、材质16第七节、光栅位图20第八节、纹理贴图23第九节、矩阵变换27第十节、混合效果31第十一节、雾化效果35第十二节、裁剪操作36第十三节、文本操作38第十四节、缓存40第三章、使用OPENGL向导44第四章、附录47第一章、OpenGL支持库的基本介绍OPenGL是“图形硬件和软件接口”。

它并不是什么编程语言,而是一组API函数,你可以使用其中的一些函数来处理图形。

OPenGL包含了从2D到3D的各种图形、图像的功能,因此它的应用非常广泛了。

常见的就有游戏的制作、电影的特效、图像处理、医疗仪器的显示、机械的模拟等等。

可能你的电脑中就有这样的一些应用软件。

通常大家的系统已经集成了OpenGL,不再需要复杂地安装。

而且硬件厂商都会提供相应的显卡驱动。

如果出现OPenGL不能显示的状况,你应该考虑升级一下显卡的驱动程序,然后看看系统是否需要更新一下,那些API的版本是否已经过时了,当然还有可能是软件的故障。

OpenGL使用

OpenGL使用

第一讲:基本概念前言随着计算机多媒体技术、可视化技术及图形学技术的发展,我们可以使用计算机来精确地再现现实世界中的绚丽多彩的三维物体,并充分发挥自身的创造性思维,通过人机交互来模拟、改造现实世界,这就是目前最为时髦的虚拟现实技术。

通过这种技术,建筑工程师可以直接设计出美观的楼房模型;军事指挥员可以模拟战场进行军事推演,网民可以足不出户游览故宫博物馆等名胜古迹等。

而虚拟现实技术最重要的一部分内容就是三维图形编程。

当前,三维图形编程工具中最为突出的是SGI公司的OpenGL(Open Graphics Language,开放式的图形语言),它已经成为一个工业标准的计算机三维图形软件开发接口,并广泛应用于游戏开发、建筑、产品设计、医学、地球科学、流体力学等领域。

值得一提的是,虽然微软有自己的三维编程开发工具DirectX,但它也提供OpenGL图形标准,因此,OpenGL 可以在微机中广泛应用。

目前,OpenGL在国内外都掀起了热潮,但国内对这一领域介绍的资料并不是很多,特别是有志于在图形图像方面进行深入研究的读者朋友,常常苦于不掌握OpenGL编程接口技术,无法向纵深领域扩展。

为了开启三维图形编程这扇神秘大门,本讲座在结合OpenGL 有关理论知识的基础上,着重介绍Visual C++6.0开发环境中的编程实现,由于水平有限,本讲座可能无法面面俱到,存在一些疏漏,但相信它可以将开启"神秘大门"的钥匙交给读者朋友们。

一、OpenGL的特点及功能OpenGL是用于开发简捷的交互式二维和三维图形应用程序的最佳环境,任何高性能的图形应用程序,从3D动画、CAD辅助设计到可视化访真,都可以利用OpenGL高质量、高性能的特点。

OpenGL自1992年出现以来,逐渐发展完善,已成为一个唯一开放的,独立于应用平台的图形标准,一个典型的OpenGL应用程序可以在任何平台上运行--只需要使用目标系统的OpenGL库重新编译一下。

  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;
}。

相关文档
最新文档