OpenGL进行文字显示的方法

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就是用这个的。NEHE教程中作为首次出现的字体显示方法,介绍应该比较全面,大家想仔细了解的话请务必从上面网址进入学习(当然还有因为我理解不透不敢乱讲的缘由)。

1..)

2.chartext[256];

3.va_listpArguments;

4.

5.if(string==NULL)

6.return;

7.

8.va_start(pArguments,string);

9.vsprintf(text,string,pArguments);

10.va_end(pArguments);

11.

12.

13.glPushAttrib(GL_LIST_BIT|GL_CURRENT_BIT|GL_ENABLE_BIT|GL_LIGHTING_BIT);

14.glDisable(GL_DEPTH_TEST);

15.glDisable(GL_LIGHTING);

16.glDisable(GL_TEXTURE_2D);

17.glColor4f(mColor[0],mColor[1],mColor[2],mColor[3]);

18.

19.glWindowPos2i(x,y);

20.

21.glListBase(NormalFontBase-32);

22.glCallLists(strlen(text),GL_UNSIGNED_BYTE,text);

23.glPopAttrib();

24.}

首先看函数形式——printf形式,若想有个详细了解,可到。简单来说,就是C时代的可变参数列。va_start-vsprintf-(va_arg)-va_end这套机制就是为了把可变参数列的内容,通过va_list(char*指针)一个一个从栈中取出来赋予他者——我们的glCallLists所要接受的所有“具体字符”,通过base为基础的索引快速寻觅而取得对应ASCII字符的字体信息(实际是位图字体),并依照期望使其形成为“具体字符串”印入屏幕。

另外着重介绍的是我所添加的两个优化——它们贯穿三种文字显示方法之中。

其一是glPushAttrib,它与glPopAttrib配合,保证了其之间的OPENGL状态设置的独立性,使其不影响该代码逻辑的前后的具体渲染状态。当然参数取GL_ALL_ATTRIB_BITS是保险点,但只要你弄清楚自己的需要,像上面这样给予特定的状态作为参数效率会更高。恩,颜色,光照,深度测试,混合……选择与当前方法最匹配的状态而没有对状态机的后顾之忧,如同文字本身一样——作为对象完全独立于图形渲染“模块”。

另一是glWindowPos2i(x,y),按所说,它取代我们以前用的glRasterPos2i,不再让作为描绘对象的物体承受模型-视图-投影变换之苦[],而是直接独立到OPENGL世界的出口——屏幕坐标系,如GDI般用窗口坐标(根据屏幕像素数)来描述文字的起点位置。这同样是赋予文字的独立性,而且意义重大——可知道,当时我用glRasterPos2i多么狼狈,好难才让文字不在场景“里面”乱窜。

在具体应用中,在初始化调用BuildGLFont.,在渲染阶段调用PrintGLText。譬如:

(2009-4-522:18:52)

2009-8-610:22:27|发布:zwqxin

本篇紧随上篇,继续说一下鄙人所了解的在OpenGL进行文字显示的方法,也方便不知从哪个次元来到这里的学习者提供一点这方面的信息。上一篇见:[]——

本文来源于ZwqXin(),转载请注明

原文地址:

2.纹理字体

最近接触Irrlicht引擎,里面的GUI模块涉及的字体设置就是用了这种纹理字体的方法。

事实上,上篇的方法最后多少了涉及到了位图字体,但是这里所说的,是直接从一张“写着各个英文字符和其他常用字符”的纹理上,按对此纹理上的图案“结构”的先验知识而获取字符对应的“纹理部分”,显示到屏幕上。

换句话来说,这就是真正的纹理贴图了,因此必须结合一张特定设计的“字体纹理”。要显示一个字符,需要你绘制一个一定大小的矩形(这个长度值相当于之前的字体高度——它控制最后出来的文字的大小),然后找到你所需字符在该纹理上的纹理坐标,作为索引检索出纹理上的对应字符部分的小纹理,贴到该矩形上。

1.

......求指教!

效果(分别上到下对应方法1,3,2):

最后是MyFont类了,加上纹理字体的那张特制字体纹理.结构更新ZWFont)。阁下若有更好的改进,........求指教!

本文来源于ZwqXin(),转载请注明

原文地址:

Tags: 分类:|评论:5|引用:0|浏览:

?

?相关文章:

?(2009-8-51:32:13)

(2009-6-1423:3:8)

(2009-6-1316:54:2)

(2009-6-823:18:32)

(2009-6-222:39:52)

(2009-5-3117:46:47)

(2009-5-61:21:55)

(2009-5-319:50:7)

(2009-5-216:21:56)

(2009-4-2723:53:18)

OpenGL一个简单的例子

先编译运行一个简单的例子,这样我们可以有一个直观的印象。从这个例子我们可以看到OpenGL可以做什么,当然这个例子只做了很简单的一件事--绘制一个彩色的三角形。除此以外,我们还可以看到典型的OpenGL程序结构及openGL的运行顺序。 例1:本例在黑色的背景下绘制一个彩色的三角形,如图一所示。

图一:一个彩色的三角形首先创建工程,其步骤如下:

1)创建一个Win32 Console Application。 2)链接OpenGL libraries。在Visual C++中先单击Project,再单击Settings,再找到Link单击,最后在Object/library modules 的最前面加上OpenGL32.lib GLu32.lib GLaux.lib 3)单击Project Settings中的C/C++标签,将Preprocessor definitions 中的_CONSOLE改为__WINDOWS。最后单击OK。 现在你可以把下面的例子拷贝到工程中去,编译运行。你可以看到一个彩色的三角形。 我们先看看main函数。函数中以glut开头的函数都包含在glut.h中。GLUT库的函数主要执行如处理多窗口绘制、处理回调驱动事件、生成层叠式弹出菜单、绘制位图字体和笔画字体,以及各种窗口管理等任务。 ·glutInit用来初始化GLUT库并同窗口系统对话协商。 ·glutInitDisplayMode用来确定所创建窗口的显示模式。本例中的参数GLUT_SINGLE 指定单缓存窗口,这也是缺省模式,对应的模式为GLUT_DOUBLE 双缓存窗口。参数GLUT_RGB指定颜色RGBA模式,这也是缺省模式,对应的模式为GLUT_INDEX 颜色索引模式窗口。 ·glutInitWindowSize初始化窗口的大小,第一个参数为窗口的宽度,第二个参数为窗口的高度,以像素为单位。 ·glutInitWindowPosition设置初始窗口的位置,第一个参数为窗口左上角x的坐标,第二个参数为窗口左上角y的坐标,以像素为单位。屏幕的左上角的坐标为(0,0),横坐标向右逐渐增加,纵坐标向下逐渐增加。 ·glutCreateWindow创建顶层窗口,窗口的名字为扩号中的参数。 ·background() 这是自己写的函数,设置背景。其实这个函数中的语句可以写在display 函数中,但为了使功能块更加清晰,所以把背景这一部分单独提出来。 ·glutReshapeFunc注册当前窗口的形状变化回调函数。当改变窗口大小时,该窗口的形状改变回调函数将被调用。在此例中就是myReshape指定形状变化函数。 ·glutDisplayFunc注册当前窗口的显示回调函数。当一个窗口的图像层需要重新绘制时,GLUT将调用该窗口的的显示回调函数。在此例中的mydisplay就是显示回调函数,显示回调函数不带任何参数,它负责整个图像层的绘制。我们的大部分工作将集中在这个函数中。 ·glutMainLoop进入GLUT事件处理循环。glutMainLoop函数在GLUT程序中最多只能调用一次,它一旦被调用就不再返回,并且调用注册过的回调函数。所以这个函数必须放在注册回调函数的后面,此例中为glutReshapeFunc,glutDisplayFunc。

OpenGL编程指南

? ? OpenGL基础图形编程- 总目录 出处:中国游戏开发者 [ 2001-09-20 ] 作者: 总目录 第一章OpenGL与三维图形世界 1.1 OpenGL使人们进入三维图形世界 1.2 OpenGL提供直观的三维图形开发环境 1.3 OpenGL称为目前三维图形开发标准 第二章OpenGL概念建立 2.1 OpenGL基本理解 2.2 OpenGL工作流程 2.3 OpenGL图形操作步骤 第三章Windows NT环境下的OpenGL 3.1 Windows NT下的OpenGL函数 3.2 OpenGL基本功能 3.3 Windows NT下OpenGL结构 第四章OpenGL基本程序结构 第五章OpenGL数据类型和函数名 第六章OpenGL辅助库的基本使用 6.1 辅助库函数分类 6.2 辅助库应用示例 第七章OpenGL建模 7.1 描述图元 7.1.1 齐次坐标

7.1.2 点 7.1.3 线 7.1.4 多边形 7.2 绘制图元 7.2.1 定义顶点 7.2.2 构造几何图元 第八章OpenGL变换 8.1 从三维空间到二维平面 8.1.1 相机模拟 8.1.2 三维图形显示流程 8.1.3 基本变换简单分析 8.2 几何变换 8.2.1 两个矩阵函数解释 8.2.2 平移 8.2.3 旋转 8.2.4 缩放和反射 8.2.5 几何变换举例 8.3 投影变换 8.3.1 正射投影 8.3.2 透视投影 8.4 裁剪变换 8.5 视口变换 8.6 堆栈操作 第九章OpenGL颜色 9.1 计算机颜色 9.1.1 颜色生成原理 9.1.2 RGB色立体 9.2 颜色模式 9.2.1 RGBA模式 9.2.2 颜色表模式 9.2.3 两种模式应用场合 9.3 颜色应用举例 第十章OpenGL光照 10.1 真实感图形基本概念 10.2 光照模型 10.2.1 简单光照模型 10.2.2 OpenGL光组成 10.2.3 创建光源 10.2.4 启动光照 10.3 明暗处理 10.4 材质

_OpenGL入门教程

OpenGL入门教程 1.第一课: 说起编程作图,大概还有很多人想起TC的#include 吧? 但是各位是否想过,那些画面绚丽的PC游戏是如何编写出来的?就靠TC那可怜的640*480分辨率、16色来做吗?显然是不行的。 本帖的目的是让大家放弃TC的老旧图形接口,让大家接触一些新事物。 OpenGL作为当前主流的图形API之一,它在一些场合具有比DirectX更优越的特性。 1、与C语言紧密结合。 OpenGL命令最初就是用C语言函数来进行描述的,对于学习过C语言的人来讲,OpenGL是容易理解和学习的。如果你曾经接触过TC的graphics.h,你会发现,使用OpenGL作图甚至比TC更加简单。 2、强大的可移植性。 微软的Direct3D虽然也是十分优秀的图形API,但它只用于Windows系统(现在还要加上一个XBOX游戏机)。而OpenGL不仅用于Windows,还可以用于Unix/Linux等其它系统,它甚至在大型计算机、各种专业计算机(如:医疗用显示设备)上都有应用。并且,OpenGL的基本命令都做到了硬件无关,甚至是平台无关。 3、高性能的图形渲染。 OpenGL是一个工业标准,它的技术紧跟时代,现今各个显卡厂家无一不对OpenGL提供强力支持,激烈的竞争中使得OpenGL性能一直领先。 总之,OpenGL是一个很NB的图形软件接口。至于究竟有多NB,去看看DOOM3和QUAKE4等专业游戏就知道了。 OpenGL官方网站(英文) https://www.360docs.net/doc/6b5215512.html, 下面我将对Windows下的OpenGL编程进行简单介绍。 学习OpenGL前的准备工作 第一步,选择一个编译环境 现在Windows系统的主流编译环境有Visual Studio,Broland C++ Builder,Dev-C++等,它们都是支持OpenGL 的。但这里我们选择Visual Studio 2005作为学习OpenGL的环境。 第二步,安装GLUT工具包 GLUT不是OpenGL所必须的,但它会给我们的学习带来一定的方便,推荐安装。 Windows环境下的GLUT下载地址:(大小约为150k) https://www.360docs.net/doc/6b5215512.html,/resources/libraries/glut/glutdlls37beta.zip 无法从以上地址下载的话请使用下面的连接: https://www.360docs.net/doc/6b5215512.html,/upfile/200607311626279.zip Windows环境下安装GLUT的步骤: 1、将下载的压缩包解开,将得到5个文件

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 #include #include 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"); //′°?ú???a"rectangle" init(); glutDisplayFunc(display); glutReshapeFunc(Reshape);

OpenGL进行文字显示的方法

任何一个DEMO、仿真项目、游戏,都少不了文字这种媒体。这不可不说是对图形视觉媒体的补充——我们还有一些无法超越文字来向观众表达的心事,或是补充说明,或是感悟,或是感激。——https://www.360docs.net/doc/6b5215512.html, 一般的文字不属于图形渲染部分,而属于用户界面部分,这在游戏引擎中看或许一目了然,但是在底层的图形渲染API——OPENGL或D3D中,文字的显示“并不是必须”,但它是多么深深地被需要着口牙。所以,把字体设置、文字显示作为一种图形学技术而非单纯的完全我属或他属,我是这么想的。(同样,拾取也算是这样吧?[乱弹OpenGL选择-拾取机制Ⅰ]) 本文来源于ZwqXin(https://www.360docs.net/doc/6b5215512.html,/), 转载请注明 原文地址:https://www.360docs.net/doc/6b5215512.html,/archives/opengl/opengl-font-setting-showing.html 怎么表达文字呢?在OpenGL中,我们没有什么现成的东西可用,但确实有办法让我们“得到这种技术”。让我最记忆深刻的是NEHE的两三篇教程(貌似都是十几课吧),讲述的就是今天的这个主题。可以到NEHE网站或者在DANCINGWIND的中文翻译(见[搜集的优良OpenG L教程] )看看~。 而我所知道的这三种方法,前两种应该就是来自那里吧(记得~~),当时要努力完成课程DEMO,于是胡胡混混地就把相应的那两三课学了,而且把它的文字显示方法应用到自己的程序中(还经历了一段艰辛的探索史...连我当时的MyFont类也记录了这份小辛酸,现在看来,是因为当时的知识水平不够理解吧)。然后后来又一个课程DEMO,老师后来觉得我应该“写中文”,于是我又去探索中文字体显示方法了,并在一个开源DEMO中找到,分析代码段后就拿来主义了,至昨不曾好好考究——这就是我所知的第三种方法。 三种方法都是三步曲:在初始化的时候“创建字体”[Build],在渲染阶段“应用字体”(显示文字)[Print],在程序结束或不再需要文字显示的时候“销毁字体”[kill]。其中前两步比较重要,着重讨论讨论哈~ 1. 常规的屏幕字体打印(NormalFont) 应用得比较广,大名鼎鼎的AZURE以前的DEMO就是用这个的。NEHE教程中作为首次出现的字体显示方法,介绍应该比较全面,大家想仔细了解的话请务必从上面网址进入学习(当然还有因为我理解不透不敢乱讲的缘由)。 1. /////////一般的英语字体打印 2.void MyFont::BuildGLFont(int fontHeight) 3.{ 4. HDC hDC =::GetDC(HWND_DESKTOP); //////就是这里搞晕了半晚 5. 6. int tFontHeight = -1 * fontHeight; 7. 8. NormalFontBase = glGenLists(96); // Storage For 96 Characters 9. HFONT font = CreateFont( -tFontHeight, // Height Of Font 10. 0, // Width Of Font 11. 0, // Angle Of Escapement 12. 0, // Orientation Angle 13. FW_BOLD, // Font Weight 14. TRUE, // Italic 15. FALSE, // Underline

OpenGL期末复习资料

Windows GUI中的基本绘图工具包括: 画笔、画刷、位图、设备描述环境、调色板、字体OpenGL中的基本图元包括:点、线、三角形、四边形、多边形、位图或图像 OpenGL中基本变换函数为: 平移void glTranslated( GLdouble x, GLdouble y, GLdouble z ); 旋转void glRotated( GLdouble angle, GLdouble x, GLdouble y, GLdouble z ); 缩放void glScaled( GLdouble x, GLdouble y, GLdouble z ); OpenGL中设置颜色的函数为: void glColor3f( GLfloat red, GLfloat green, GLfloat blue ); OpenGL中设置法向量的函数为: void glNormal3i( GLint nx, GLint ny, GLint nz ); OpenGL中的透视投影和平行投影对应的函数分别是:glFrustum(); glOrtho(); OpenGL中各个模式(如灯光的启用或禁止)的启用和禁止的函数为:glEnable( GLenum cap )、glDisable (GLenum cap ); Windows对话框的分类:模态对话框,非模态对话框Windows对话框的控件包括:静态控件、按钮控件、滚动条控件、编辑控件、列表框类、组合框类 MFC框架包含的类有: 应用类、文档类、视图类、框架类 设置当前矩阵为单位矩阵的函数为:glLoadIdentity(void); 的功能是重置当前指定的矩阵为单位矩阵如何在OpenGL中绘制基本图元// glLineWidth(1.0f); glColor3f(1.0f,0.0f,0.0f); glBegin(GL_LINES); glVertex3f(0.0f,0.0f,0.0f); glVertex3f(20.0f,0.0f,0.0f); glEnd(); gluLookAt的作用及该函数各个参数的含义 void gluLookAt( GLdouble eyex, GLdouble eyey, GLdouble eyez, GLdouble centerx, GLdouble centery, GLdouble centerz, GLdouble upx, GLdouble upy, GLdouble upz ); eyex, eyey,eyez 指定视点的位置 centerx,centery,centerz 指定参考点的位置 upx,upy,upz 指定视点向上的方向 glLight()中各个参数的含义 void glLighti ( GLenum light, GLenum pname, GLint param ); 启用的灯光号, 光源光的参数 指向那个光源(灯光号)参数被设置 指向启用的灯光的指针 OpenGL中的光照设置方式 1.指明材质glMaterial()漫反射镜面反射 2.设置灯光glLight(Glenum light,Glenum pname,Glint param) 3.生效glEnable(GL_LIGHTING) 4指明打开的灯 glEnable(GL_LIGHT0) OpenGL中的绘制列表的设置方式 // listName = glGenLists (1); glNewList (listName, GL_COMPILE); Opengl函数(一般绘图函数) glEndList (); 显示glCallList(listName); ); Win32编程中镂空图的绘制方法 1、创建一张单色位图,将单色位图选到兼容设备环境 (dcMask),将原图选入令一设备兼容环境(dc)。 2、将dcMask的背景设为紫色,再将dc绘制到dcMask, 得到蒙板图。 3、设置原图所在dc的前景色为白色,背景色为黑色, 将蒙板图和dc中原图做AND运算,绘制到dc中。 hdc = GetDC(hWnd); mdc = CreateCompatibleDC(hdc); hbmp=(HBITMAP)LoadImage(NULL,"bg.bmp",IMAGE_BIT MAP,600,450,LR_LOADFROMFILE); SelectObject(mdc,hbmp); BitBlt(mdc,480,190,100,100,bufdc,100,0,SRCAND); //进行与运算 BitBlt(mdc,480,190,100,100,bufdc,0,0,SRCPAINT); //进行OR运算 ReleaseDC(hWnd,hdc); OpenGL中的透视投影和平行投影对应的函数中参数的 含义 void glFrustum ( GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble znear, GLdouble zfar ); void glOrtho( GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble near, GLdouble far ); left,right分别指的是左右截面到眼睛(在XY平面上) 的距离 top,bottom分别指的是上下截面到眼睛(在XY平面上) 的距离 zNear, zFar都是相对眼睛的(YZ平面)距离 OpenGL中矩阵堆栈操作的作用 glPushAttrib();glPopAttrib() 矩阵堆栈操作,为重复记录,平移与撤销的操作提供了 一种理想的机制。每次操作只需对当前栈顶矩阵进行操 作即可,glPushAttrib()就相当于记录每一次操作, glPopAttrib()就相当于恢复由glPushAttrib()最新记 录的操作。

基于opengl的三维场景漫游实现

基于opengl的三维场景漫游实现 摘要:本课题是关于opengl三维场景的实现,要求能够实现人机交互,具有缩放、旋转等基本的功能。 利用opengl创建三维模型的原理,本课题在理解opengl创建图形元的基础上,实现了简单三维场景模型的建立。通过建立全局Camera,实现了对场景全方位的观测,同时能够及时响应键盘和鼠标的操作。在此基础上,利用天空盒子和全局地形的方法,实现了三维场景的基本框架,能够在虚拟场景中任意角度的漫游。通过纹理贴图的方法,实现场景的创建,并对场景内部的事物进行碰撞检测,来实现简单的三维场景漫游。 关键词:三维建模; 全局Camera; 场景漫游; 纹理贴图; 碰撞检测

目录 1 课题论述 (1) 1.1选题背景简介 (1) 1.2系统开发平台及运行环境 (1) 1.2.1 开发环境的搭建 (1) 1.2.2 opengl绘图机制 (1) 2课题实现的关键技术 (2) 2.1 场景建模 (2) 2.2 场景渲染 (2) 2.3 纹理映射 (2) 2.4 碰撞检测 (3) 3漫游场景的实现 (4) 3.1 全局Camera的创建 (4) 3.2 地形和天空的绘制 (5) 3.3场景的绘制 (6) 3.4纹理和字体类的设计 (7) 4 总结 (8) 5 程序使用方法介绍 (8)

1 课题论述 1.1选题背景简介 随着科技的发展,人们对视觉的需求也越来越高,这正好也促发了计算机图形学的快速发展:从简单的平面图形到3D空间的立体图形空间的一个转变,为opengl提供了广阔的应用和开发前景。随着opengl的越来越成熟,在各个领域的应用也变得广泛起来。从计算机、多媒体、影视到医学、工业等领域。Opengl开发的重心也有所转变,从普通的三维场景的建立,到现在的大型复杂场景的三维信息生成、实时三维场景光影效果的模拟和实时三维场景的内存使用控制,opengl的发展越来越成熟。 正是基于opengl目前广泛的应用,本课题从opengl基本的图形元的创建、渲染、视角的转换等方面,选择一些opengl的基本操作,实现简单的三维场景空间的漫游,促进对opengl进一步的了解,也为以后进一步的开发做准备。 1.2系统开发平台及运行环境 本设计是基于Opengl 1.0在windows7操作系统下使用Visual C++6.0集成开发环境开发并调试,设计中使用了基于Win Application的架构。 1.2.1 开发环境的搭建 本设计是在Visual C++ 6.0下使用Opengl1.0库开发的,开发环境搭建步骤详细如下:(1)安装Visual C++ 6.0。 (2)配置Opengl1.0 由于Visual C++ 6.0本身带有安装好的opengl1.0版本,所以一些头文件和bin路径的设置就不必要做了。但自带的opengl1.0 没有包含glut函数库,所以需要下载glut函数库,并正确的设置include和bin的路径,并把dll文件放到system32下。 1.2.2 opengl绘图机制 在Windows环境的绘图机制下使用图形设备接口GDI作图要通过设备上下文调用相应的函数,用opengl作图也是这样。Opengl通过“渲染上下文”即RC完成对三维图形的绘制。Windows下的设备上下文和窗口都支持“文图格式”属性,和RC在位图结构方面是一致的。因此只要在创建RC的同时与一个DC建立联系,opengl函数就可以通过对应的DC 绘制到相应的显示设备上面。

openGL输出简单文字

#include void Initial(void) { glClearColor(1.0f,1.0f,1.0f,1.0f);//设置窗口背景颜色为白色 glMatrixMode(GL_PROJECTION);//指定设置投影参数 gluOrtho2D(0.0,200.0,0.0,150.0);//设置投影参数 } void Display(void) { glClear(GL_COLOR_BUFFER_BIT);//用当前背景填充窗口 glColor3f(0.0f,0.0f,1.0f);//设置当前的绘图颜色为红色 glRasterPos3f(50.0,50.0,0.0); glutBitmapCharacter(GLUT_BITMAP_TIMES_ROMAN_24,'O'); 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'); glFlush();//清空OpenGL命令缓冲区,执行OpenGl程序 } int main(int argc,char*argv[]) { glutInit(&argc,argv); glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);//初始化窗口的显示模式 glutInitWindowSize(400,300);//设置窗口的尺寸 glutInitWindowPosition(100,120);//设置窗口的位置 glutCreateWindow("输出OpenGL文字");//创建一个名为输出OpenGL字符的窗口glutDisplayFunc(Display);//设置当前窗口的显示回调函数 Initial();//完成窗口初始化 glutMainLoop();//启动住GLUT事件处理循环 return 0; }

OpenGL中创建一个球体动画,使球体在窗口内做自由落体运动.(推荐文档)

计算机图形学实验报告 1、实验目的和要求 利用第七章所学的知识,试在OpenGL中创建一个球体动画,使球体在窗口内做自由落体运动,并在撞击地面后能够反弹回来。并用相应的代码表示出来。2、实验内容 利用glutSolidSphere函数等其它函数,在OpenGL中创建一个球体动画,使球体在窗口内做自由落体运动,并在撞击地面后能够反弹回来 3、实验步骤 1)相关算法及原理描述 我们所使用的glut实用工具中,正好就有一个绘制球体的现成函数:glutSolidSphere,这个函数在“原点”绘制出一个球体。由于坐标是可以通过glTranslate*和glRotate*两个函数进行随意变换的,所以我们就可以在任意位置绘制球体了。 2)运行结果 如下图,程序调试成功,并且能正常显示 4、实验总结 通过本次试验,进一步认识,感觉OpenGL的功能很强大,各种各样的物理模拟实验他都不在话下!!不得不说,这软件很好很强大!!由于自己不太擅长编程,所以有些功能还不能完全实现,但我会尽自己最大努力来克服自己的编程不足之

处,多加练习。 5、附录 带注释的源程序 #include "glut.h" #include #include #include #include #define PI 3.1415926 double move=20.0; int i=0; int down=1; int count=1; double timeSpan=0; //下降到底所需时间double movey=0.0; double duration=0.0; //持续时间 double length=0.0; clock_t start,end; void init(void) { GLfloat mat_specular[]={220.220,220.0,220.0,220.0}; GLfloat mat_shininess[]={100.0}; GLfloat light_position[]={0.0, 0.0, 0.0, -2.0}; //r-l u-d f-b GLfloat ambientLight[] = { 0.2f, 0.2f, 0.2f, 1.0f }; GLfloat diffuseLight[] = { 0.6f, 0.6f, 0.6f, 1.0f }; GLfloat specular[] = { 1.0f, 1.0f, 1.0f, 1.0f}; glClearColor(0.2,0.2,1.5,2.0); //bgc glColor3ub(100, 100, 215); glShadeModel(GL_SMOOTH); glMaterialfv(GL_FRONT,GL_SPECULAR,mat_specular); glMaterialfv(GL_FRONT,GL_SHININESS,mat_shininess); glLightfv(GL_LIGHT0,GL_AMBIENT,ambientLight); glLightfv(GL_LIGHT0,GL_DIFFUSE,diffuseLight); glLightfv(GL_LIGHT0,GL_SPECULAR,specular); glLightfv(GL_LIGHT0,GL_POSITION,light_position); glEnable(GL_LIGHTING); glEnable(GL_LIGHT0); glEnable(GL_DEPTH_TEST); }

计算机图形学 opengl 文字显示

#include #include #include #pragma comment(linker, "/subsystem:console") using namespace std; void myReshape(GLsizei w,GLsizei h) { glViewport(0,0,w,h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); if(w<=h) glOrtho(-20.0,20.0,-20.0*(GLfloat)h/(GLfloat)w, 20.0*(GLfloat)h/(GLfloat)w,-50.0,50.0); else glOrtho(-20.0*(GLfloat)h/(GLfloat)w, 20.0*(GLfloat)h/(GLfloat)w,-20.0,20.0,-50.0,50.0); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); } void drawCNString(const char* str) { int len=0, i; wchar_t* wstring; HDC hDC = wglGetCurrentDC(); GLuint list = glGenLists(1); for(i=0; str[i]!='\0'; ++i) { if( IsDBCSLeadByte(str[i]) ) ++i; ++len; } wstring = (wchar_t*)malloc((len+1) * sizeof(wchar_t)); MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, str, -1, wstring, len); wstring[len] = L'\0'; for(i=0; i

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就是用这个的。NEHE教程中作为首次出现的字体显示方法,介绍应该比较全面,大家想仔细了解的话请务必从上面网址进入学习(当然还有因为我理解不透不敢乱讲的缘由)。 1..) 2.chartext[256]; 3.va_listpArguments; 4. 5.if(string==NULL) 6.return; 7. 8.va_start(pArguments,string); 9.vsprintf(text,string,pArguments); 10.va_end(pArguments); 11. 12. 13.glPushAttrib(GL_LIST_BIT|GL_CURRENT_BIT|GL_ENABLE_BIT|GL_LIGHTING_BIT);

OpenGL程序,输出 学号、姓名、照片等信息。直线、线型、字体程序

作业1 一:作业目的及要求: 采用OpenGL程序,输出学号、姓名、照片等信息。直线、线型、字体程序。 二:理论基础: 1.使用GLUT进行窗口管理: (1)与大小有关的 glutInitWindowSize(800,600); //用来定义显示窗口的初始化宽度和高度的像素数glutInitWindowPosition(200,200); //显示窗口左上角应该在屏幕左边界向右50个像素、屏幕上边界100像素的位置上。 gluOrth02D(0.0,200.0,0.0,150.0); //这表示使用正投影将世界坐标系二维矩形区域的内容映射到屏幕上。 以上三个概念需要弄清,其中gluOrtho2D是指屏幕区域对应的模型坐标范围,比如横向范围是0到200米,纵向是0到150米,而后面的glutInitWindowSize是指glut的窗口弹出来后相对于你电脑屏幕的位置和大小,单位是像素。 (2)窗口颜色设置 glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); //指出显示窗口使用单个缓存且使用RGB (红绿蓝)颜色模型来设置颜色值 glClearColor(1.0,1.0,1.0,0.0) //设置窗口背景颜色为白色,前三个变量为红绿蓝分量,最后一个为调和参数,相当于透明度。 glClear(GL_COLOR_BUFFER_BIT); //让赋予窗口的颜色在屏幕上显示。 Glcolor3f(1.0,0.0,0.0); //显示场景中各种对象的颜色,左边的简单的设置为红色(3)其他 glutInit(&argc, argv); //GLUT初始化函数 glutCreateWindow(" "); //显示窗口创建定一个标题 glutDisplayFunc(Display); //将创建的图形的定义传递给GLUT函数 glutMainLoop(); //创建的窗口及其中的图形内容激活 2.输出图元 (1)OpenGL画点函数 OpenGL中定义的点放在函数glBegin()和glEnd()之间,有函数glBegin()的参数指定绘制图元的类型。 在OpenGL中绘制一个点时,点大小的默认值是一个像素。可以用函数glPointSize(GLfloat size)修改这个值。这个函数采用一个参数来指定画点时以像素为单位的近似直径。但是不是任意大小点都支持,通常使用下面的代码来获取点大小的范围和他们的之间最小的中间值:GLfloat sizes[2];//保存绘制点的尺寸范围

OpenGL简单例子

在黑色的背景下绘制一个彩色的三角形,如图一所示。 #include #include void background(void) { glClearColor(0.0,0.0,0.0,0.0);//设置背景颜色为黑色 } void myDisplay(void) { glClear(GL_COLOR_BUFFER_BIT);//buffer设置为颜色可写 glBegin(GL_TRIANGLES);//开始画三角形 glShadeModel(GL_SMOOTH);//设置为光滑明暗模式 glColor3f(1.0,0.0,0.0);//设置第一个顶点为红色 glVertex2f(-1.0,-1.0);//设置第一个顶点的坐标为(-1.0,-1.0) glColor3f(0.0,1.0,0.0);//设置第二个顶点为绿色 glVertex2f(0.0,-1.0);//设置第二个顶点的坐标为(0.0,-1.0) glColor3f(0.0,0.0,1.0);//设置第三个顶点为蓝色 glVertex2f(-0.5,1.0);//设置第三个顶点的坐标为(-0.5,1.0) glEnd();//三角形结束 glFlush();//强制OpenGL函数在有限时间内运行 } void myReshape(GLsizei w,GLsizei h) { glViewport(0,0,w,h);//设置视口 glMatrixMode(GL_PROJECTION);//指明当前矩阵为GL_PROJECTION glLoadIdentity();//将当前矩阵置换为单位阵 if(w <= h) gluOrtho2D(-1.0,1.5,-1.5,1.5*(GLfloat)h/(GLfloat)w);//定义二维正视投影矩阵

Qt+OpenGL中文教程

Qt OpenGL教程 最近一段时间除了学习Qt,翻译Qt文档之外,由于工作和兴趣的原因,开始着手看Qt OpenGL编程。在网上搜索了有关OpenGL的教程,发现NeHe的OpenGL 教程的还很不错,作者是NeHe。上面有很多种语言的实现,但是没有Qt和Gtk 的,所以我就想着手写这个Qt OpenGL教程,每课的内容和NeHe是一样的。另外,介绍NeHe的一个中文翻译站点CSDN-CKer翻译的NeHe的OpenGL教程,翻译人是CKer,在我学习这个教程的过程中,给了我很大的帮助。 下面就是Qt OpenGL教程的内容: Qt OpenGL的准备工作 第一课:创建一个OpenGL窗口 第二课:你的第一个多边形 第三课:上色 第四课:旋转 第五课:向三维进军 第六课:纹理映射 第七课:纹理滤波、光源和键盘控制 第八课:融合 第九课:在三维空间中移动位图 第十课:载入一个三维世界并在其中移动

第十一课:旗的效果(波动纹理) 第十二课:显示列表 第十三课:位图字体 第十四课:轮廓字体 第十五课:使用纹理映射的轮廓字体 第十六课:看起来很棒的雾 因为本教程是从NeHe的OpenGL教程迁移过来的,代码变为Qt实现的。所以有的课程一时还没有实现成功,所以可能有些教程是跳跃的。 因本人时间有限,所以难免有错误出现,如果您发现了这些错误,或者有什么建议,请来信指教,谢谢。 Qt OpenGL的准备工作 因为Qt存在很多版本,另外它支持的平台也很多,到目前为止我只实验了几个组合,所以就先把这些列出来吧,欢迎大家补充。 Unix/X11 Linux Qt:自由版或者企业版都支持OpenGL模块,而专业版则不能。我现在使用的是3.1.0自由版和企业版。 gcc:编译器。我现在使用的是3.2。 X:Linux下的图形环境。我现在使用的是4.2.0。 Mesa:自由的OpenGL。我现在使用的是5.0。

相关文档
最新文档