
分类: 电脑/网络 >> 软件
解析:
OpenGL三维图形标准是由AT&T公司UNIX软件实验室、IBM
、DEC、SUN、HP、Microsoft和SGI等多家公司在GL图形库标准的基础
上联合推出的开放式图形库,它使在微机上实现三维真实
感图形的生成与显示成为可能。由于OpenGL是开放的图形标
准,用户原先在UNIX下开发的OpenGL图形软件很容易移植到微
机上的WindowsNT/95上。笔者在VisualC++41(以下简称VC)集
成环境下,开发了基于OpenGL的三维真实感图形应用程序,现
介绍如下。
微机上的OpenGL开发环境
基于OpenGL标准开发的应用程序必须运行于32位Windows
平台下,如WindowsNT或Windows95环境;而且运行时还需有动态
链接库OpenGL32DLL、Glu32DLL,这两个文件在安装WindowsNT时已
自动装载到C:\WINNT\SYSTEM32目录下(这里假定用户将WindowsNT
安装在C盘上);而对于使用Windows95平台的用户,则需手工将
两个动态库复制到Windows95目录的SYSTEM子目录中。安装了
WindowsNT/95和VC41后,用户就具备了基于OpenGL开发三维图
形软件的基本条件。
OpenGL程序设计的基本步骤
1OpenGL在WindowsNT下的运行机制
OpenGL工作在客户机/服务器模式下,当客户方(即基
于OpenGL标准开发的应用程序)向服务器(OpenGL核心机制)发出
命令时,由服务器负责解释这些命令。通常情况下,客户方
和服务器是运行在同一台微机上的。由于OpenGL的运行机制
是客户机/服务器模式,这使得用户能够十分方便地在网
络环境下使用OpenGL,OpenGL在WindowsNT上的这种实现方式通常
称为网络透明性。
OpenGL的图形库函数封装在动态链接库OpenGL32DLL中,
客户机中的所有OpenGL函数调用,都被传送到服务器上,由
WinSrvDLL实现功能,再将经过处理的指令发送到Win32设备驱
动接口(DDI),从而实现在计算机屏幕上产生图像。
若使用OpenGL图形加速卡,则上述机制中将添加两个
驱动器:OpenGL可装载客户模块(OpenGLICD)将安装在客户端;硬
件指定DDI将安装在服务器端,与WinDDI同一级别。
2OpenGL的库函数
开发基于OpenGL的应用程序,必须先了解OpenGL的库函
数。OpenGL函数命令方式十分有规律,每个库函数均有前缀gl
、glu、aux,分别表示该函数属于OpenGL基本库、实用库或辅助
库。WindowsNT下的OpenGL包含了100多个核心函数,均以gl作为前
缀,同时还支持另外四类函数:
OpenGL实用库函数:43个,以glu作为前缀;
OpenGL辅助库函数:31个,以aux作为前缀;
Windows专用库函数(WGL):6个,以wgl作为前缀;
Win32API函数(WGL):5个,无前缀。
OpenGL的115个核心函数提供了最基本的功能,可以实
现三维建模、建立光照模型、反走样、纹理映射等;OpenGL实
用库函数在核心函数的上一层,这类函数提供了简单的调
用方法,其实质是调用核心函数,目的是减轻开发者的编程
工作量;OpenGL辅助库函数是一些特殊的函数,可以供初学者
熟悉OpenGL的编程机制,然而使用辅助库函数的应用程序只
能在Win32环境中使用,可移植性较差,所以开发者应尽量避
免使用辅助库函数;Windows专用库函数(WGL)主要针对WindowsNT
/95环境的OpenGL函数调用;Win32API函数用于处理像素存储格
式、双缓存等函数调用。
3VC环境下基于OpenGL的编程步骤
下面介绍在VC环境中建立基于Opeetting菜单选项,在Link栏的Lib输入域中
添加openg132lib、glu32lib,若需使用OpenGL的辅助库函数,则还
需添加glauxlib。
(3)选择View/ClassWizard菜单选项,打开MFC对话框,在
ClassName栏中选择CMyTestView类,进行以下 *** 作:
选择WM_CREATE消息,鼠标单击EditCode,将OpenGL初始化代码
添加到OnCreate()函数中:
/*定义像素存储格式*/
PIXELFORMATDESCRIPTORpfd=
{
sizeof(PIXELFORMATDESCRIPTOR),
1,
PFD_DRAW_TO_WINDOW|PFD_SUPPORT_OPENGL,
PFD_TYPE_RGBA,
24,
0,0,0,0,0,0,
0,0,0,0,0,0,0
32,
0,0,
PFD_MAIN_PLANE,
0,
0,0,0,
}
CCLientdc(this);
intpixelFormat=ChoosePixelFormat(dcm_hDC,&pfd);
BOOLsuccess=SetPixelFormat(dcm_hDC,pixelFormat,&pfd);
m_hRC=wglCreateContext(dcm_hDC);
选择WM_DESTORY消息,在OnDestory()中添加以下代码:
wglDeleteContext(m_hRC);
在MyTestViewcpp中,将以下代码添加到PreCreateWindows()函数中:
csstyle|=WS_CLIPCHILDREN|WS_CLIPSIBLINGS;
OpenGL只对WS_CLIPCHILDREN|WS_CLIPSIBLINGS类型窗口有效;
在MyTestViewcpp中,将以下代码添加到OnDraw()函数中:
wglMakeCurrent(pDC->m_hDC,m_hRC);
DrawScene();//用户自定义函数,用于绘制三维场景;
wglMakeCurrent(pDC->m_hDC,NULL);
在MyTestViewcpp中,添加成员函数DrawScene():
voidCMyTestView::DrawScene()
{/*绘制三维场景*/}
(4)在MyTestViewh中包含以下头文件并添加类成员说明:
#include
#include
#include
在CTestView类中的protected:段中添加成员变量声明:
HGLRCm_hRC;
同时添加成员函数声明:
DrawScene();
这样,一个基于OpenGL标准的程序框架已经构造好,用
户只需在DrawScene()函数中添加程序代码即可。
建立三维实体模型
三维实体建模是整个图形学的基础,要生成高逼真
度的图像,首先要生成高质量的三维实体模型。
OpenGL中提供了十几个生成三维实体模型的辅助库函
数,这些函数均以aux作为函数名的前缀。简单的模型,如球
体、立方体、圆柱等可以使用这些辅助函数来实现,如
auxWireSphere(GLdoubleradius)(绘制一半径为radius的网状球体)。
但是这些函数难以满足建立复杂三维实体的需要,所以用
户可以通过其它建模工具(如3DS等)来辅助建立三维实体模
型数据库。笔者在三维实体的建模过程中采用3DS提供的2D
Shape、3DLofter和3DEditor进行模型的编辑,最后通过将模型数
据以DXF文件格式输出存储供应用程序使用。
真实感图形的绘制
1定义光照模型和材质
(1)光源。OpenGL提供了一系列建立光照模型的库函
数,使用户可以十分方便地在三维场景中建立所需的光照
模型。OpenGL中的光照模型由环境光(AmbientLight)、漫射光
(DiffuseLight)、镜面反射光(SpecularLight)等组成,同时还可设
置光线衰减因子来模拟真实的光源效果。
例如,定义一个**光源如下:
GlfloatLight_position[]={10,10,10,00,};
GlfloatLight_diffuse[]={10,10,00,10,};
glLightfv(GL_LIGHT0,GL_POSTTION,light_position);//定义光源位置
glLightfv(GL_LIGHT0,GL_DIFFUSE,light_diffuse);//定义光源漫射光
光源必须经过启动后才会影响三维场景中的实体,可以通过以下指令使光源有效:<
glEnable(LIGHTING);//启动光照模型;
glEnable(GL_LIGHT0);//使光源GL_LIGHT0有效;
OpenGL中一共可以定义GL_LIGHT0~GL_LIGHT7八个光源。
(2)材质。OpenGL中的材质是指构成三维实体的材料在
光照模型中对于红、绿、蓝三原色的反射率。与光源的定义
类似,材质的定义分为环境、漫射、镜面反射成分,另外还
有镜面高光指数、辐射成分等。通过对三维实体的材质定义
可以大大提高应用程序所绘制的三维场景的逼真程度。例
如:
/*设置材质的反射成分*/
GLfloatmat_ambient[]={08,08,08,10};
GLfloatmat_diffuse[]={08,00,08,10};/*紫色*/
GLfloatmat_specular[]={10,00,10,10};/*镜面高光亮紫色*/
GLfloatmat_shiness[]={1000};/*高光指数*/
glMaterialfv(GL_FRONT,GL_AMBIENT,mat_ambient);/*定义环境光反射率*/
glMaterialfv(GL_FRONT,GL_DIFFUSE,mat_diffuse);/*定义漫射光反射率*/
glMaterialfv(GL_FRONT,GL_SPECULAR,mat_specular);/*定义镜面光反射率*/
glMaterialfv(GL_FRONT,GL_SHINESS,mat_shiness);/*定义高光指数*/
(3)材质RGB值与光源RGB值的关系。OpenGL中材质的颜色
与光照模型中光源的颜色含义略有不同。对于光源,R、G、B
值表示三原色在光源中所占有的比率;而对于材质定义,R、
G、B的值表示具有这种材质属性的物体对于三原色的反射
比率,场景中物体所呈现的颜色与光照模型、材质定义都相
关。例如,若定义的光源颜色是(Lr,Lg,Lb)=(10,10,10)(白光),
物体的材质颜色定义为(Mr,Mg,Mb)=(00,00,08),则最终到达人
眼的物体颜色应当是(Lr*Mr,Lg*Mg,Lb*Mb)=(00,00,08)(蓝色)。
2读取三维模型数据
为了绘制三维实体,我们首先必须将预先生成的三
维实体模型从三维实体模型库中读出。下图描述了读取三
维实体模型的流程。
3三维实体绘制
由于3DS的DXF文件中对于三维实体的描述是采用三角
形面片逼近的方法,而在OpenGL函数库中,提供了绘制三角形
面片的方法,所以为三维实体的绘制提供了方便。以下提供
了绘制三角形面片的方法:
glBegin(TRANGLES);//定义三角形绘制开始
glVertexf((GLfloat)x1,(GLfloat)y1,(GLfloat)z1);//第一个顶点
glVertexf((GLfloat)x2,(GLfloat)y2,(GLfloat)z2);//第二个顶点
glVertexf((GLfloat)x3,(GLfloat)y3,(GLfloat)z3);//第三个顶点
glEnd();//绘制结束
为了提高三维实时动画的显示速度,我们利用了
OpenGL库中的显示列表(DisplayList)的功能,将三维场景中的实
体分别定义为单独的显示列表,预先生成三维实体。在图形
显示时,只需调用所需的显示列表即可显示相应的三维实
体,而不需要重新计算实体在场景中的坐标,避免了大量的
浮点运算。在调用显示列表前所作的旋转、平移、光照、材
质的设定都将影响显示列表中的三维实体的显示效果。具
体实现算法如下:
for(ObjectNo=0;ObjectNo<实体个数;ObjectNo++)
{
glNewList(ObjectNo,GL_COMPILE);//创建第ObjectNo个实体的显示列表
for(Fac
强力推荐《OpenGL游戏程序设计》作者:K霍金 D阿斯特第1篇 OpenGL和DirectX的介绍
第1章 而今迈步从头越--OpenGL和Directx
11 开发游戏需要理由吗
12 3D游戏世界
13 游戏的元素
14 开发工具
15 什么是openGL
151 OpenGL的历史
152 OpenGL的体系结构
153 OpenGL实用库
154 什么是GLUT
155 轻松一瞥
16 什么是DirectX
161 DirectX的历史
162 DirectX体系结构
17 0penGL与DirectX
本章小结
第2章 Windows *** 作系统平台上的OpenGL编程
21 Windows编程介绍
211 Windows应用程序基础
212从WinMain()开始
213 Windows Procedure
214 窗口类
215 窗口类的注册
216 窗口的创建
217 消息循环
218 一个完整的Windows应用程序
22 WGL介绍
221 绘制环境
222 WGL的使用
23 像素格式
231 nSize
232 dwFlag
233 iPixel lype
234 cColorBits
24 0penGL windOWS应用程序
25 全屏OpenGL
本章小结
第3章 3D图形学理论概览
31 标量、点和矢量
311 矢量的大小
312 矢量的归一化
313 矢量加法运算
314 矢量与标量的乘法运算
315 点积运算
316 叉积运算
32 矩阵
321 单位矩阵
322 零矩阵
323 矩阵加法和减法运算
324 矩阵乘法运算
325 矩阵的总体实现
33 变换
331 平移变换
332 旋转变换
333 缩放变换
34 投影
341 平行投影
342 透视投影
35 3D剪裁
36 光照
361 环境光
362 散射光
363 镜面反射光
37 纹理映射
本章小结
第2篇 使用OpenGL
第4章 OpenGL状态和图元
41 状态函数
42 图元的处理
421 3D空间中点的绘制
422 3D空间中线的绘制
423 3D空间中的多边形的绘制
424 图元的使用
本章小结
第5章 坐标变换和OpenGL矩阵
51 理解坐标变换
511 视点和眼坐标
512 视图变换
513 模型变换
514 投影变换
515 视区变换
52 OpenGL和矩阵
521 模型视图矩阵
522 平移变换
523 旋转变换
524 缩放变换
525 矩阵堆栈
526 机器人例程
53 投影变换
531 正交投影变换
532 透视投影变换
533 视区的设置
534 投影变换实例
54 白定义矩阵的使用
541 自定义矩阵的载入
542 矩阵的乘法运算
543 自定义矩阵的实例
本章小结
第6章 添加颜色、混合与光照
61 颜色是如何工作的
62 在OpenGL中使用颜色
621 颜色深度
622 颜色立方体模型
623 OpenGL中的RGBA模式
624 OpenGL中的颜色索引模式
63 明暗处理
64 OpenGL中的光照
641 OpenGL光照和现实世界
642 材质
643 法线
644 OpenGL光照的使用
65 颜色混合
透明度
本章小结
第7章 位图、图像与OpenG L
71 0penGL位图
711 位图的定位
712 位图的绘制
713 一个OpenGL位图例程
72 图像的使用
721 图像数据的绘制
722 屏幕的读取
723 屏幕数据的复制
724 放大、缩小和翻转
73 像素存储的管理
74 WindOWS位图
741 BMP文件格式
742 BMP文件的载入
743 BMP文件的输
75 Targa图像文件
751 Targa文件格式
752 Targa文件的载入
753 Targa文件的输出
本章小结
第8章 纹理映射
81 纹理映射的概览
82 纹理图的应用
821 2D纹理
822 lD纹理
823 3D纹理
83 纹理对象
831 纹理名字的生成
832 纹理对象的创建和使用
84 纹理的过滤处理
85 纹理模式
86 纹理坐标
861 重复和夹持纹理
862 mipmap和细节层次
863 mipmap的自动牛成
87 例程--飘动的旗帜
871 例程的解释说明
872 例程的实现
88 例程--高程纹理地形
881 例程的解释说明
882 例程的实现
本章小结
第9章 高级纹理映射
91 多纹理映射
911 多纹理支持的验证
912 扩展函数的访问
913 纹理单元的建市
914 纹理坐标的设置(指定)
915 综合应用
92 环境映射
93 纹理矩阵
94 光照映射
95 多通道多纹理映射
本章小结
第1O章 显示列表与顶点数组
lO1 显示列表
1011 显示列表的创建
1012 向显示列表中填充命令
1013 显示列表的执行
1014 显示列表的注意事项
1015 显示列表的销毁
1016 显示列表与纹理
1017 例程:使用显示列表的机器人演示程序
lO2 顶点数组
1021 顶点数组的启用
1022 数组的使用
1023 顶点数组与多纹理映射
1024 数组的锁定
1025 例程:再建地形演示程序
本章小结
第11章 文本的显示
111 位图字体
l12 轮廓字体
ll3 纹理映射字体
本章小结
第12章 OpenGL缓存
121 什么是OpenGL缓存
1211 像素格式的设置
1212 缓存的清理
122 颜色缓存
1221 双缓存系统
1222 立体缓存
123 深度缓存
1231 深度比较程序
1232 深度缓存的使用
l24 模板缓存
l25 累积缓存
本章小结
第13章 OpenGL二次曲面
131 OpenGL二次曲面的基础
l311 绘制风格
1312 法线
1313 指向
1314 纹理坐标
1315 清理
132 圆盘
l33 圆柱
l34 球
135 例程:飞掠一个二次世界
本章小结
第14章 曲线与曲面
141 曲线与曲面的描述
1411 参数方程
1412 控制点与连续性
l42 求值程序
143 曲面
144 NURBS
本章小结
第15章 特殊效果
l51 标志板
152 粒子系统的使用
1521 粒子
l522 粒子系统
1523 粒子系统管理器
1524 实例
l525 粒子系统的效果
1526 例程:暴风雪
l53 雾
1531 OpenGL的雾
1532 体积雾
l 54 镜像
1541 光照的镜像
1542 深度缓存的处理
1543 使用模板缓存来处理有限的平面
1544 对于非常规镜像表而的处理
1545 对任意指向的平面的处理
l55 阴影
1551 静态阴影
1552 投射阴影
1553 模板阴影体
1554 其他的方法
1555 例程:镜像与阴影
本章小结
第3篇 建立一个游戏
第16章 DirectX的使用:DirectInput
161 为什么要使用DirectInput
1611 Windows消息
1612 Win32
1613 Directlnput
162 DirectInput的初始化
163 DirectInput的使用
1631 设备的添加
1632 输入的获取
l633 关闭
164 动作映射
165 输入子系统的建立
l66 输入系统例程
本章小结
第17章 Directx Audio的使用
l71 声音的基础
l72 什么是DiteetX Audio
1721 DirecIX Audio的功能部件
l722 音频数据流
173 使用DirectMusic加载和演奏音频
1731 初始化COM
1732 创建与初始化演奏对象
1733 创建loader对象
1734 载入一个segment对象
1735 下载波段
1736 演奏segment
1737 停止一个segment的播放
1738 segment是甭止在播放
1739 segment循环的控制
17310 清理
l74 一个简单的例程
l75 Audiopath的使用
1751 默认的Audiopath
l752 标准Audiopath
1753 在Audiopath上播放声音
1754 从Audiopath获取对象
176 3D声音
l761 3D声音坐标
1762 感知
1763 DirectSound 3D缓存
1764 3D参数的设置
1765 DirectSound 3D听者
1766 3D音效文本例程
本章小结
第18章 3D模型的处理
181 3D模型文件格式
182 MD2文件格式
1821 MD2的实现
1822 MD2的载入
1823 MD2的显示
1824 添加纹理
1825 模型的动画
1826 开发一个CMD2Model类
1827 模型动画的控制
183 最后的一点小资料
本章小结
第19章 OpenGL物理建模
191 物理学的回顾
1911 时间
1912 距离、位移和位置
1913 速度
l914 加速度
1915 作用力
1916 动量
1917 摩擦力
192 真实世界的模拟
1921 任务的分解
1922 定时
1923 矢量
l924 平面
1925 物体
l926 物体碰撞的处理
1927 一个例程:空中曲棍球
本章小结
第20章 建立一个游戏引擎
201 SimpEngine的设计
2011 利用CNode管理数据
2012 对象的处胖:CObiect
202 引擎核
2021 输入系统
2022 CEngine类
2023 游戏循环
2024 输入的处理
2025 SimpEngine
203 视点
204 场景
205 模型的添加
206 音频系统
207 粒子系统
本章小结
第21章 创建一个游戏:杀戮时刻
2l1 初始设计
212 游戏场景
213 敌人
214 火箭与爆炸
215 用户的交互
216 运行游戏
217 建EXE可执行文件
本章小结
第4篇 附录
附录A 在线资源
A1 游戏开发
A2 OpenGL
A3 DirectX
A4 其他的资源
附录B 随书所附资料的使用
B1 用户界面
B2 文件结构
B3 系统要求
B4 安装
B5 其他相关问题与疑难解答信息
B6 是否仍旧需要帮助
以上就是关于openGL 是什么软件全部的内容,包括:openGL 是什么软件、推荐一些学习OpenGL的资料、等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)