OpenGL介绍

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

//首先定义像素存储格式 PIXELFORMATDESCRIPTOR pfd= { sizeof(PIXELFORMATDESCRIPTOR), // pfd的大小 1, //结构的版本号 PFD_DRAW_TO_WINDOW| //支持window PFD_SUPPORT_OPENGL, //支持OpenGL PFD_TYPE_RGBA, //RGBA颜色模式 24, //24位颜色深度缓存 0,0,0,0,0,0, //color bits ignored 0, //no alpha buffer 0, //shift bit ignored 0, //不使用累积缓存 0,0,0,0, //accum bits ignored 32, //32位z缓冲 0, //不使用模板缓存 0, //no auxiliary buffer
特 别 需 要 指 出 的 是 , 由 于 Microsoft 公 司 在 其 Windows95 或更高版本的操作系统和 Visual 系列高 级 语 言 开 发 环 境 中 捆 绑 了 OpenGL 标 准 , 使 得 OpenGL在微机中得到了更为普遍的应用。
OpenGL可以与各种编程语言紧密接口。各种流 行的编程语言如 C 、 C++ 、 Fortran 、 Ada 、 Java 等都可以调用OpenGL中的库函数。
glColor3f(0.0,0.0,1.0);//蓝色
glVertex3f(1.0,0.0,0.0); glEnd();
2.3.5 OpenGL的缓冲区
OpenGL进行图形显示需要四个缓冲区:颜色缓存、深 度缓存、模板缓存和累计缓存。
颜色缓存:由红、绿、蓝、Alpha位等位平面 (Bitplane)组成的,有前缓存(Front Buffer)、后缓存 (Back Buffer)、左前(Front_Left)和右前(Front_Right)缓 存、左后(Back_Left)和右后(Back_Right)缓存。左前缓 存是必须的颜色缓存。前缓存是可见缓存,后缓存是 不可见缓存。前后缓存技术可以实现动画操作。
此外, OpenGL 还提供了反走样技术,能够实现深度暗示 (Depth Cue)、运动模糊(Motion Blur)、雾化(Fog)等特殊效果。
2.3.3 OpenGL的绘制流程和原理
点数据 评价器 逐点操作 基元匹配 基片 操作
显示 列表
像素 数据 像素操作
光栅化
帧缓冲区
纹理存储器
OpenGL 指令从左侧进入 OpenGL ,有两类数据,分别是由顶点描述的几何模 型和由像素描述的位图、影像等模型,其中后者经过像素操作后直接进入光栅 化。评价器(Evaluator)用于处理输入的模型数据,例如对顶点进行转换、光照, 并把图元剪切到视景体中,为下一步光栅化做好准备。显示列表(Display List) 用于存储一部分指令,留待合适时间以便于快速处理。光栅化将图元转化成二 维操作,并计算结果图像中每个点的颜色和深度等信息,产生一系列图像的帧 缓存描述值,其生成结果称为基片(Fragment)。基片操作主要的有帧缓存的更 新、测试、融合和屏蔽操作,以及基片之间的逻辑操作和抖动(Dithering)。
2.3.2 OpenGL的主要功能
绘制模型:提供了绘制点、线、多边形、球、锥、多面体、茶壶 等复杂的三维物体以及贝塞尔、NURBS等复杂曲线或曲面的绘制 函数。 各种变换:提供了平移、旋转、变比和镜像四种基本变换以及平 行投影和透视投影两种投影变换。通过变换实现三维的物体在二 维的显示设备上显示。 着色模式:提供了RGBA模式和颜色索引两种颜色的显示方式。
PFD_MAIN_PLANE, 0, //保留 0,0,0 //layer masks ignored };
CClientDC dc(this);
//选择主层面
int pixelFormat=ChoosePixelFormat(dc.m_hDC,&pfd); BOOL success=SetPixelFormat(dc.m_hDC,pixelFormat,&pfd);
由于OpenGL的广泛应用,它已经成为一个工业标准。
OpenGL独立于硬件设备、窗口系统和操作系统, 使得以OpenGL为基础开发的应用程序可以在各 种平台间移植。
OpenGL可以运行在当前各种流行操作系统之上,如 Windows95/98 、 Windows NT/2000 、 Linux 、 Mac OS、Unix、OS/2等。
Байду номын сангаас
光照处理:在自然界我们所见到的物体都是由其材质和光照相互 作 用 的 结 果 , OpenGL 提 供 了 辐 射 光 (Emitted Light) 、 环 境 光 (Ambient Light)、漫反射光(Diffuse Light)和镜面光(Specular Light)。 材质是指物体表面对光的反射特性,在OpenGL中用光的反射率来 表示材质。
与颜色缓存相关的主要函数有:
清除颜色缓存:glClear(GL_COLOR_BUFFER_BIT),用 于清除当前显示缓冲区内容,为开始新的绘制做好准 备。 设置清除颜色:glClearColor(red , green , blue , alpha), 用当前颜色(red, green, blue, alpha)清除当前显示缓冲 区内容,为开始新的绘制做好准备。 屏蔽颜色缓存:glColorMask(),分别设置红、绿、蓝、 alpha的可写属性。 选择颜色缓存: glDrawBuffer(),用于对双缓存中一个 进行选择。 交换颜色缓存:swapBuffer(),交换前后缓存中的颜色, 以实现动画
在DrawScene( )函数中编写具体的绘图程序。首先需要设 置视点、视距和观看方向等场景参数,然后绘制图元。
glClearColor(0.0, 0.0, 0.0, 0.0);
glClear(GL_COLOR_BUFFER_BIT); glBegin(GL_LINES); //OpenGL绘制直线命令 glColor3f(1.0,0.0,0.0); //设置当前颜色为红色 glVertex2f(0,0);
深度缓存:也叫Z-buffer,它记录每个像素点所对应的 物体点到视点的距离,由此决定表面的可见性。在进行 消隐的时候,OpenGL必须知道各物体间的相对位置关系, 从而模拟出物体相互遮挡得效果,因此,需要进行深度 测试。而深度测试的结果就生成了深度缓存。 与深度缓存相关的OpenGL操作主要有: 清除深度缓存:glClear(GL_DEPTH_BUFFER_BIT), 用于清除当前显示缓冲区内容,为开始新的绘制做好准 备; 设置清除值:glClearDepth(1.0);
2.3 OpenGL介绍
2.3.1 背景
OpenGL(Open Graphics Library,开放式图形库)
是以SGI的GL三维图形库为基础制定的一个开放式三维 图形标准。SGI在1992年7月发布了1.0版。
OpenGL 规 范 由 ARB(OpenGL Architecture Review Board , OpenGL结构评审委员会)负责管理,目前加入OpenGL ARB的 成员有 SGI 、 Microsoft 、 Intel 、 IBM 、 SUN 、 Compaq 、 HP 等 公司,它们均采用了 OpenGL 图形标准,许多软件厂商以 OpenGL为基础开发自己的产品,硬件厂商提供对 OpenGL的 支持。
然后改造 OnCreate 函数:定义像素存储格式 , 并创建一个 OpenGL 操作所必须的绘图上下文 RC(Rendering Context) 。使 用一个 PIXELFORMATDESCRIPTOR 结构来指定像素格式, 使用wglCreateContext()函数创建绘图上下文RC。
具体添加代码如下:

接下来, 在 Visual C++ 中,修改视图类成员函数代码实现 OpenGL绘图的过程如下: ①改造PreCreateWindow函数:将窗口的客户区设置为OpenGL 能够支持的风格。具体添加代码如下:
cs.style|=WS_CLIPCHILDREN|WS_CLIPSIBLINGS;
②在视图类,添加一个成员变量HGLRC m_hRC ;
⑥改造OnDraw:根据当前的视点、视距、观看方向等参数, 设置合适的OpenGL视景体属性,使用户能够看到预期的 场景外观。添加的代码如下: wglMakeCurrent(pDC->m_hDC,m_hRC); DrawScene(); //用户自定义函数,用来编写OpenGL绘制 语句的 wglMakeCurrent(pDC->m_hDC,NULL);
2.3.4 VC++开发OpenGL绘图程序
第一步:向项目文件中添加OpenGL的绘图函数 Project || Settings || Link在Object/library modules:中输 入 opengl32.lib glu32.lib glaux.lib 第二步:添加头文件 在项目工作区的FileView中找到StdAfx.h,添加下面的代码: #include <GL/gl.h> #include <GL/glu.h> #include <GL/glaux.h>
纹理映射(Texture Mapping): 将真实感的纹理粘贴在物体表面, 使物体逼真生动。纹理是数据的简单矩阵排列,数据有颜色数据 、亮度数据和alpha数据。 位图和图像:提供了一系列函数来实现位图和图像的操作。位 图和图像数据均采用像素的矩阵形式表示。
制作动画:提供了双缓存(Double Buffering)技术来实现动画绘制。 双缓存即前台缓存和后台缓存,后台缓存用来计算场景、生成画 面,前台缓存用来显示后台缓存已经画好的画面。当画完一帧时, 交互两个缓存,这样循环交替以产生平滑动画。 选择和反馈:OpenGL为支持交互式应用程序设计了选择操作模 式和反馈模式。在选择模式下,则可以确定用户鼠标指定或拾取 的是哪一个物体,可以决定将把哪些图元绘入窗口的某个区域。 而反馈模式,OpenGL把即将光栅化的图元信息反馈给应用程序, 而不是用于绘图。
glVertex2f(1,1);
glColor3f(0.0,1.0,0.0); //设置当前颜色为绿色 glVertex2f(0.2,0);//(书中程序有误!) glVertex2f(1.20,1); glEnd();
glClearColor(0.0, 0.0, 0.0, 0.0); glClear(GL_COLOR_BUFFER_BIT); glBegin(GL_TRIANGLES); glColor3f(1.0,0.0,0.0);//红色 glVertex3f(-1.0,0.0,0.0); glColor3f(0.0,1.0,0.0);//绿色 glVertex3f(0.0,1.0,0.0);
//创建绘图上下文RC m_hRC=wglCreateContext(dc.m_hDC);
③改造OnSize 函数:当视图尺寸变化是,应及时将新的客户区尺 寸通知OpenGL,方能够正确在窗口客户区域显示二维场景,通过 命令glViewPort完成这项工作。
④改造OnEraseBkgnd函数:重载视图类的OnEraseBkgnd成员,使 之返回 TRUE 值可以阻止 Windows 重画窗口背景,因为 OpenGL 自 己会设置窗口背景,这样可以防止窗口频繁刷新 ( 如移动窗口 ) 时 产生的闪烁现象。 ⑤改造OnDestroy函数:在OnDestroy成员中需要释放OnCreate成员 中RC所占用的资源,命令wglDeleteContext可以完成这个工作,但 在释放RC之前,还需要使用命令 wglMakeCurrent()断开RC与设备 描述表DC的连接。具体代码如下: wglMakeCurrent(NULL,NULL); wglDeleteContext(m_hRC);
相关文档
最新文档