openGL 是什么软件

openGL 是什么软件,第1张

分类: 电脑/网络 >> 软件

解析:

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的资料、等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zz/9861381.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-02
下一篇2023-05-02

发表评论

登录后才能评论

评论列表(0条)

    保存