OpenGL讲座
- 格式:doc
- 大小:175.50 KB
- 文档页数:12
前言随着计算机多媒体技术、可视化技术及图形学技术的发展,我们可以使用计算机来精确地再现现实世界中的绚丽多彩的三维物体,并充分发挥自身的创造性思维,通过人机交互来模拟、改造现实世界,这就是目前最为时髦的虚拟现实技术。
通过这种技术,建筑工程师可以直接设计出美观的楼房模型;军事指挥员可以模拟战场进行军事推演,网民可以足不出户游览故宫博物馆等名胜古迹等。
而虚拟现实技术最重要的一部分内容就是三维图形编程。
当前,三维图形编程工具中最为突出的是SGI公司的OpenGL(Open Graphics Language,开放式的图形语言),它已经成为一个工业标准的计算机三维图形软件开发接口,并广泛应用于游戏开发、建筑、产品设计、医学、地球科学、流体力学等领域。
值得一提的是,虽然微软有自己的三维编程开发工具DirectX,但它也提供OpenGL图形标准,因此,OpenGL可以在微机中广泛应用。
目前,OpenGL在国内外都掀起了热潮,但国内对这一领域介绍的资料并不是很多,特别是有志于在图形图像方面进行深入研究的读者朋友,常常苦于不掌握OpenGL编程接口技术,无法向纵深领域扩展。
为了开启三维图形编程这扇神秘大门,本讲座在结合OpenGL有关理论知识的基础上,着重介绍Visual C++6.0开发环境中的编程实现,由于水平有限,本讲座可能无法面面俱到,存在一些疏漏,但相信它可以将开启"神秘大门"的钥匙交给读者朋友们。
第一章概述一、OpenGL的特点及功能OpenGL是用于开发简捷的交互式二维和三维图形应用程序的最佳环境,任何高性能的图形应用程序,从3D动画、CAD辅助设计到可视化访真,都可以利用OpenGL高质量、高性能的特点。
OpenGL自1992年出现以来,逐渐发展完善,已成为一个唯一开放的,独立于应用平台的图形标准,一个典型的OpenGL 应用程序可以在任何平台上运行--只需要使用目标系统的OpenGL库重新编译一下。
OpenGL第一课--中文版第一课中文版第01课创建一个OpenGL窗口:在这个教程里,我将教你在Windows环境中创建OpenGL程序.它将显示一个空的OpenGL窗口,可以在窗口和全屏模式下切换,按ESC退出.它是我们以后应用程序的框架.理解OpenGL如何工作非常重要,你可以在教程的末尾下载源程序,但我强烈建议你至少读一遍教程,然后再开始编程.欢迎来到我的OpenGL教程。
我是个对OpenGL充满激情的普通男孩!我第一次听说OpenGL是3Dfx 发布Voodoo1 卡的OpenGL硬件加速驱动的时候。
我立刻意识到OpenGL是那种必须学习的东西。
不幸的是当时很难从书本或网络上找到关于OpenGL的讯息。
我花了N 个小时来调试自己书写的代码,甚至在IRC和EMail 上花更多的时间来恳求别人帮忙。
但我发现那些懂得OpenGL 高手们保留了他们的精华,对共享知识也不感兴趣。
实在让人灰心!我创建这个网站的目的是为了帮助那些对OpenGL有兴趣却又需要帮助的人。
在我的每个教程中,我都会尽可能详细的来解释每一行代码的作用。
我会努力让我的代码更简单(您无需学习MFC代码)!就算您是个VC 、OPENGL 的绝对新手也应该可以读通代码,并清楚的知道发生了什么。
我的站点只是许多提供OpenGL 教程的站点中的一个。
如果您是OpenGL的高级程序员的话,我的站点可能太简单了,但如果您才开始的话,我想这个站点会教会您许多东西!教程的这一节在2000年一月彻底重写了一遍。
将会教您如何设置一个OpenGL窗口。
它可以只是一个窗口或是全屏幕的、可以任意大小、任意色彩深度。
此处的代码很稳定且很强大,您可以在您所有的OpenGL项目中使用。
我所有的教程都将基于此节的代码!所有的错误都有被报告。
所以应该没有内存泄漏,代码也很容易阅读和修改。
感谢Fredric Echols对代码所做的修改!现在就让我们直接从代码开始吧。
OpenGL讲座纲领:1,简介2,简单概念性教程3,实例1,OpenGL简介简介:OpenGL - 高性能图形算法行业标准OpenGL(全写Open Graphics Library)是个定义了一个跨编程语言、跨平台的编程接口的规格,它用于三维图象(二维的亦可)。
OpenGL是个专业的图形程序接口,是一个功能强大,调用方便的底层图形库。
支持主流系统平台。
一般由硬件平台直接支持。
对比:对比DirectXOpenGL 只是图形函数库。
DirectX 包含图形, 声音, 输入, 网络等模块。
OpenGL稳定,可跨平台使用。
DirectX仅能用于Windows系列平台,包括Windows Mobile/CE系列以及XBOX/XBOX360。
OpenGL与DirectX之争微软,推行Direct3D,冻结OpenGL!两大显示芯片厂商:Ati和nVIDIA(英伟达)。
2,OpenGL SE简介:OpenGL ES是专为内嵌和移动设备设计的一个2D/3D轻量图形库,它是基于OpenGL API设计的。
OpenGL ES 1.0版基于OpenGL 1.3,而OpenGL ES 1.1则是基于OpenGL 1.5的。
现在主要由Khronos Group来负责管理OpenGL ES的开发维护。
OpenGL ES目前主要有两个版本:OpenGL ES 1.X和OpenGL ES 2.X 。
OpenGL|ES的官方组织是:/ 该组织关注于手持和移动平台上的动态媒体编著、播放所需的API,并致力于为这些API建立无限权费用的开放标准。
OpenGL|ES是根据手持及移动平台的特点,对OpenGL 3D图形API标准进行裁剪定制而形成的,因此大多数OpenGL方面的知识都是可以借鉴的。
嵌入式硬件芯片支持,或软件模拟。
区别OpenGL:OpenGL ES相对OpenGL删减了一切低效能的操作方式,有高性能的决不留低效能的。
具体区别列表:数据类型:(数据类型简化)1: i GLint 整数型2: f GLfixed 定点小数3: x GLclampx 限定型定点小数删除的功能:(舍弃了部分类似功能及复杂功能函数)1.glBegin/glEnd2.glArrayElement3.显示列表4.求值器5.索引色模式6.自定义裁剪平面7.glRect8.图像处理(这个一般显卡也没有,FireGL/Quadro显卡有)9.反馈缓冲10.选择缓冲11.累积缓冲12.边界标志13.glPolygonMode14.GL_QUADS,GL_QUAD_STRIP,GL_POL YGON15.glPushAttrib,glPopAttrib,glPushClientAttrib,glPopClientAttrib15.TEXTURE_1D、TEXTURE_3D、TEXTURE_RECT、TEXTURE_CUBE_MAP16.GL_COMBINE17.自动纹理坐标生成18.纹理边界19.GL_CLAMP、GL_CLAMP_TO_BORDER20.消失纹理代表21.纹理LOD限定22.纹理偏好限定23.纹理自动压缩、解压缩24.glDrawPixels,glPixelTransfer,glPixelZoom25.glReadBuffer,glDrawBuffer,glCopyPixels3,EGL简介OpenGL ES是一个平台中立的图形库,在它能够工作之前,需要与一个实际的窗口系统关联起来,这与OpenGL是一样的。
但不一样的是,这部份工作有标准,这个标准就是EGL。
而OpenGL时代在不同平台上有不同的机制以关联窗口系统,在Windows上是wgl,在X-Window上是xgl,在Apple OS上是agl等。
EGL的工作方式和部份术语都接近于xgl。
EGL是介于OpenGL ES和底层Native系统平台之间的函数接口,目的是让OpenGL ES与本地系统交互且平台无关性。
用于管理图形context,surface与buffer绑定和对渲染配置的控制。
OpenGL ES的初始化过程如下图所示意:Display →Config →Surface↑Context↑Application →OpenGL CommandEGL初始化:1. 获取Display。
Display代表显示器,在有些系统上可以有多个显示器,也就会有多个Display。
获得Display要调用EGLboolean eglGetDisplay(NativeDisplay dpy),参数一般为EGL_DEFAULT_DISPLAY 。
该参数实际的意义是平台实现相关的,在X-Window下是XDisplay ID,在MS Windows下是Window DC。
2. 初始化egl。
调用EGLboolean eglInitialize(EGLDisplay dpy, EGLint *major, EGLint *minor),该函数会进行一些内部初始化工作,并传回EGL版本号(major.minor)。
3. 选择Config。
所为Config实际指的是FrameBuffer的参数,在MS Windows下对应于PixelFormat,在X-Window下对应Visual。
一般用EGLboolean eglChooseConfig(EGLDisplay dpy, const EGLint * attr_list, EGLConfig * config, EGLint config_size, EGLint *num_config),其中attr_list是以EGL_NONE结束的参数数组,通常以id,value依次存放,对于个别标识性的属性可以只有id,没有value。
另一个办法是用EGLboolean eglGetConfigs(EGLDisplay dpy, EGLConfig * config, EGLint config_size, EGLint *num_config)来获得所有config。
这两个函数都会返回不多于config_size个Config,结果保存在config[]中,系统的总Config个数保存在num_config中。
可以利用eglGetConfig()中间两个参数为0来查询系统支持的Config总个数。
Config有众多的Attribute,这些Attribute决定FrameBuffer的格式和能力,通过eglGetConfigAttrib ()来读取,但不能修改。
4. 构造Surface。
Surface实际上就是一个FrameBuffer,通过EGLSurface eglCreateWindowSurface(EGLDisplay dpy, EGLConfig confg,NativeWindow win, EGLint *cfg_attr) 来创建一个可实际显示的Surface。
系统通常还支持另外两种Surface:PixmapSurface 和PBufferSurface,这两种都不是可显示的Surface,PixmapSurface是保存在系统内存中的位图,PBuffer则是保存在显存中的帧。
Surface也有一些attribute,基本上都可以故名思意,EGL_HEIGHT EGL_WIDTH EGL_LARGEST_PBUFFER EGL_TEXTURE_FORMAT EGL_TEXTURE_TARGET EGL_MIPMAP_TEXTURE EGL_MIPMAP_LEVEL,通过eglSurfaceAttrib()设置、eglQuerySurface()读取。
5. 创建Context。
OpenGL的pipeline从程序的角度看就是一个状态机,有当前的颜色、纹理坐标、变换矩阵、绚染模式等一大堆状态,这些状态作用于程序提交的顶点坐标等图元从而形成帧缓冲内的像素。
在OpenGL的编程接口中,Context就代表这个状态机,程序的主要工作就是向Context提供图元、设置状态,偶尔也从Context里获取一些信息。
{ME:状态机绘图最终作用到BF上,而Context关联BF,所以设置状态机即设置Context!}用来创建一个Context。
EGLContext eglCreateContext(EGLDisplay dpy, EGLSurface write, EGLSurface read, EGLContext * share_list)6. 绘制。
应用程序通过OpenGL API进行绘制,一帧完成之后,调用eglSwapBuffers(EGLDisplay dpy, EGLContext ctx)来显示。
//其它:ST_EGLAPI EGLBoolean ST_EGLAPIENTRY eglMakeCurrent(EGLDisplay dpy,EGLSurface draw, EGLSurface read, EGLContext ctx);实例:RWindow iWindow;EGLDisplay iEglDisplay;EGLConfig iEglConfig;EGLContext iEglContext;EGLSurface iEglSurface;iEglDisplay = eglGetDisplay (EGL_DEFAULT_DISPLAY);if(iEglDisplay == EGL_NO_DISPLAY)User::Panic(_L("Unable to find a suitable EGLDisplay"), 0);这里EGL_DEFAULT_DISPLAY指向缺省的手机屏幕(一般来说只有一个),如果程序运行失败,那么该函数将会返回EGL_NO_DISPLAY.if(!eglInitialize (iEglDisplay, 0, 0))User::Panic(_L("Unable to initialize EGL"), 0);最后两个参数是EGL完成的版本。
如果你对此不需要,可以传递0进去。
EGLint numConfigs;if(!eglChooseConfig (iEglDisplay, attribList, &iEglConfig, 1, &numConfigs)) User::Panic(_L("Unable to choose EGL config"), 0);这里attribList参数指明了程序运行所需的属性列表,该函数将在iEglConfig参数中返回一个与属性列表配套的可用配置。