当前位置:首页 » 编程软件 » opengl编程基础

opengl编程基础

发布时间: 2022-08-04 02:05:02

Ⅰ OpenGL怎么学就业能做啥呢

OpenGL就业主要能做3D游戏开发,学习需要一个系统的流程,如下:

openGL学习建议按照如下的步骤进行:

1、基本的线性代数知识,不需要很深入,大学时的线性代数拿出来复习一下足够用了,特别是矩阵变换部分。

2、C++开发语言,一定要非常熟练。

3、《计算机图形学》这个应该是高校教材了,这个也是所有图形学的基础知识。

4、《3D游戏编程大师技巧》等基础入门教材,这一类图书基本上是将基础知识和openGL API如何使用结合起来,使得读者可以开始上手开发。同样的还有 https://learnopengl-cn.github.io/ 这一类网站,都是比较好的入门资料。

5、《openGL编程指南》俗称“红宝书”,《OpenGL Super Bible 5th》俗称“蓝宝书”,不过这两本书更加适合作为查询手册,用到哪一块需要深入了解时进行查询。

6、再深入就是了解详细的管线处理流程、shader语言开发等。

openGL主要属于计算机图形学方面的内容,这一块属于比较专业的领域了。

目前主要做3D游戏开发这一块用得最多,大公司做游戏引擎开发主要以openGL为主,即便现在很多基于U3D开发的手游,至少也需要熟悉基本的openGL管线流程和一些shader知识。

其次,做一些专业领域的仿真会很多,再次在做各种滤镜、特效方面也需要用到openGL知识,不过这些方面还需要图像处理方面的一些知识。

PpenGL的设计

OpenGL规范描述了绘制2D和3D图形的抽象API。尽管这些API可以完全通过软件实现,但它是为大部分或者全部使用硬件加速而设计的。

OpenGL的API定义了若干可被客户端程序调用的函数,以及一些具名整型常量(例如,常量GL_TEXTURE_2D对应的十进制整数为3553)。

虽然这些函数的定义表面上类似于C编程语言,但它们是语言独立的。因此,OpenGL有许多语言绑定,值得一提的包括:JavaScript绑定的WebGL(基于OpenGL ES 2.0在Web浏览器中的进行3D渲染的API);C绑定的WGL、GLX和CGL;iOS提供的C绑定;Android提供的Java和C绑定。

OpenGL不仅语言无关,而且平台无关。规范只字未提获得和管理OpenGL上下文相关的内容,而是将这些作为细节交给底层的窗口系统。出于同样的原因,OpenGL纯粹专注于渲染,而不提供输入、音频以及窗口相关的API。

OpenGL是一个不断进化的API。新版OpenGL规范会定期由Khronos Group发布,新版本通过扩展API来支持各种新功能。每个版本的细节由Khronos Group的成员一致决定,包括显卡厂商、操作系统设计人员以及类似Mozilla和谷歌的一般性技术公司。

除了核心API要求的功能之外,GPU供应商可以通过扩展的形式提供额外功能。扩展可能会引入新功能和新常量,并且可能放松或取消现有的OpenGL函数的限制。

然后一个扩展就分成两部分发布:包含扩展函数原型的头文件和作为厂商的设备驱动。供应商使用扩展公开自定义的API而无需获得其他供应商或Khronos Group的支持,这大大增加了OpenGL的灵活性。OpenGL Registry负责所有扩展的收集和定义。

每个扩展都与一个简短的标识符关系,该标识符基于开发公司的名称。例如,英伟达(nVidia)的标识符是NV。如果多个供应商同意使用相同的API来实现相同的功能,那么就用EXT标志符。

这种情况更进一步,Khronos Group的架构评审委员(Architecture Review Board,ARB)正式批准该扩展,那么这就被称为一个“标准扩展”,标识符使用ARB。

第一个ARB扩展是GL_ARB_multitexture。

OpenGL每个新版本中引入的功能,特别是ARB和EXT类型的扩展,通常由数个被广泛实现的扩展功能组合而成。

Ⅱ 推荐一些学习OpenGL的资料

强力推荐《OpenGL游戏程序设计》作者:K.霍金 D.阿斯特第1篇 OpenGL和DirectX的介绍.
第1章 而今迈步从头越--OpenGL和Directx
1.1 开发游戏需要理由吗
1.2 3D游戏世界
1.3 游戏的元素
1.4 开发工具
1.5 什么是openGL
1.5.1 OpenGL的历史
1.5.2 OpenGL的体系结构
1.5.3 OpenGL实用库
1.5.4 什么是GLUT
1.5.5 轻松一瞥
1.6 什么是DirectX
1.6.1 DirectX的历史
1.6.2 DirectX体系结构
1.7 0penGL与DirectX
本章小结
第2章 Windows操作系统平台上的OpenGL编程
2.1 Windows编程介绍
2.1.1 Windows应用程序基础
.2.1.2从WinMain()开始
2.1.3 Windows Procere
2.1.4 窗口类
2.1.5 窗口类的注册
2.1.6 窗口的创建
2.1.7 消息循环
2.1.8 一个完整的Windows应用程序
2.2 WGL介绍
2.2.1 绘制环境
2.2.2 WGL的使用
2.3 像素格式
2.3.1 nSize
2.3.2 dwFlag
2.3.3 iPixel lype
2.3.4 cColorBits
2.4 0penGL windOWS应用程序
2.5 全屏OpenGL
本章小结
第3章 3D图形学理论概览
3.1 标量、点和矢量
3.1.1 矢量的大小
3.1.2 矢量的归一化
3.1.3 矢量加法运算
3.1.4 矢量与标量的乘法运算
3.1.5 点积运算
3.1.6 叉积运算
3.2 矩阵
3.2.1 单位矩阵
3.2.2 零矩阵
3.2.3 矩阵加法和减法运算
3.2.4 矩阵乘法运算
3.2.5 矩阵的总体实现
3.3 变换
3.3.1 平移变换
3.3.2 旋转变换
3.3.3 缩放变换
3.4 投影
3.4.1 平行投影
3.4.2 透视投影
3.5 3D剪裁
3.6 光照
3.6.1 环境光
3.6.2 散射光
3.6.3 镜面反射光
3.7 纹理映射
本章小结
第2篇 使用OpenGL
第4章 OpenGL状态和图元
4.1 状态函数
4.2 图元的处理
4.2.1 3D空间中点的绘制
4.2.2 3D空间中线的绘制
4.2.3 3D空间中的多边形的绘制
4.2.4 图元的使用
本章小结
第5章 坐标变换和OpenGL矩阵
5.1 理解坐标变换
5.1.1 视点和眼坐标
5.1.2 视图变换
5.1.3 模型变换
5.1.4 投影变换
5.1.5 视区变换
5.2 OpenGL和矩阵
5.2.1 模型视图矩阵
5.2.2 平移变换
5.2.3 旋转变换
5.2.4 缩放变换
5.2.5 矩阵堆栈
5.2.6 机器人例程
5.3 投影变换
5.3.1 正交投影变换
5.3.2 透视投影变换
5.3.3 视区的设置
5.3.4 投影变换实例
5.4 白定义矩阵的使用
5.4.1 自定义矩阵的载入
5.4.2 矩阵的乘法运算
5.4.3 自定义矩阵的实例
本章小结
第6章 添加颜色、混合与光照
6.1 颜色是如何工作的
6.2 在OpenGL中使用颜色
6.2.1 颜色深度
6.2.2 颜色立方体模型
6.2.3 OpenGL中的RGBA模式
6.2.4 OpenGL中的颜色索引模式
6.3 明暗处理
6.4 OpenGL中的光照
6.4.1 OpenGL光照和现实世界
6.4.2 材质
6.4.3 法线
6.4.4 OpenGL光照的使用
6.5 颜色混合
透明度
本章小结
第7章 位图、图像与OpenG L..
7.1 0penGL位图
7.1.1 位图的定位
7.1.2 位图的绘制
7.1.3 一个OpenGL位图例程
7.2 图像的使用
7.2.1 图像数据的绘制
7.2.2 屏幕的读取
7.2.3 屏幕数据的复制
7.2.4 放大、缩小和翻转
7.3 像素存储的管理
7.4 WindOWS位图
7.4.1 BMP文件格式
7.4.2 BMP文件的载入
7.4.3 BMP文件的输
7.5 Targa图像文件
7.5.1 Targa文件格式
7.5.2 Targa文件的载入
7.5.3 Targa文件的输出
本章小结
第8章 纹理映射
8.1 纹理映射的概览
8.2 纹理图的应用
8.2.1 2D纹理
8.2.2 lD纹理
8.2.3 3D纹理
8.3 纹理对象
8.3.1 纹理名字的生成
8.3.2 纹理对象的创建和使用
8.4 纹理的过滤处理
8.5 纹理模式
8.6 纹理坐标
8.6.1 重复和夹持纹理
8.6.2 mipmap和细节层次
8.6.3 mipmap的自动牛成
8.7 例程--飘动的旗帜
8.7.1 例程的解释说明
8.7.2 例程的实现
8.8 例程--高程纹理地形
8.8.1 例程的解释说明
8.8.2 例程的实现
本章小结
第9章 高级纹理映射
9.1 多纹理映射
9.1.1 多纹理支持的验证
9.1.2 扩展函数的访问
9.1.3 纹理单元的建市
9.1.4 纹理坐标的设置(指定)
9.1.5 综合应用
9.2 环境映射
9.3 纹理矩阵
9.4 光照映射
9.5 多通道多纹理映射
本章小结
第1O章 显示列表与顶点数组
lO.1 显示列表
10.1.1 显示列表的创建
10.1.2 向显示列表中填充命令
10.1.3 显示列表的执行
10.1.4 显示列表的注意事项
10.1.5 显示列表的销毁
10.1.6 显示列表与纹理
10.1.7 例程:使用显示列表的机器人演示程序
lO.2 顶点数组
10.2.1 顶点数组的启用
10.2.2 数组的使用
10.2.3 顶点数组与多纹理映射
10.2.4 数组的锁定
10.2.5 例程:再建地形演示程序
本章小结
第11章 文本的显示
11.1 位图字体
l1.2 轮廓字体
ll.3 纹理映射字体
本章小结
第12章 OpenGL缓存
12.1 什么是OpenGL缓存
12.1.1 像素格式的设置
12.1.2 缓存的清理
12.2 颜色缓存
12.2.1 双缓存系统
12.2.2 立体缓存
12.3 深度缓存
12.3.1 深度比较程序
12.3.2 深度缓存的使用
l2.4 模板缓存
l2.5 累积缓存
本章小结
第13章 OpenGL二次曲面
13.1 OpenGL二次曲面的基础
l3.1.1 绘制风格
13.1.2 法线
13.1.3 指向
13.1.4 纹理坐标
13.1.5 清理
13.2 圆盘
l3.3 圆柱
l3.4 球
13.5 例程:飞掠一个二次世界
本章小结
第14章 曲线与曲面
14.1 曲线与曲面的描述
14.1.1 参数方程
14.1.2 控制点与连续性
l4.2 求值程序
14.3 曲面
14.4 NURBS
本章小结
第15章 特殊效果
l5.1 标志板
15.2 粒子系统的使用
15.2.1 粒子
l5.2.2 粒子系统
15.2.3 粒子系统管理器
15.2.4 实例
l5.2.5 粒子系统的效果
15.2.6 例程:暴风雪
l5.3 雾
15.3.1 OpenGL的雾
15.3.2 体积雾
l 5.4 镜像
15.4.1 光照的镜像
15.4.2 深度缓存的处理
15.4.3 使用模板缓存来处理有限的平面
15.4.4 对于非常规镜像表而的处理
15.4.5 对任意指向的平面的处理
l5.5 阴影
15.5.1 静态阴影
15.5.2 投射阴影
15.5.3 模板阴影体
15.5.4 其他的方法
15.5.5 例程:镜像与阴影
本章小结
第3篇 建立一个游戏
第16章 DirectX的使用:DirectInput
16.1 为什么要使用DirectInput
16.1.1 Windows消息
16.1.2 Win32
16.1.3 Directlnput
16.2 DirectInput的初始化
16.3 DirectInput的使用
16.3.1 设备的添加
16.3.2 输入的获取
l6.3.3 关闭
16.4 动作映射
16.5 输入子系统的建立
l6.6 输入系统例程
本章小结
第17章 Directx Audio的使用
l7.1 声音的基础
l7.2 什么是DiteetX Audio
17.2.1 DirecIX Audio的功能部件
l7.2.2 音频数据流
17.3 使用DirectMusic加载和演奏音频
17.3.1 初始化COM
17.3.2 创建与初始化演奏对象
17.3.3 创建loader对象
17.3.4 载入一个segment对象
17.3.5 下载波段
17.3.6 演奏segment
17.3.7 停止一个segment的播放
17.3.8 segment是甭止在播放
17.3.9 segment循环的控制
17.3.10 清理
l7.4 一个简单的例程
l7.5 Audiopath的使用
17.5.1 默认的Audiopath
l7.5.2 标准Audiopath
17.5.3 在Audiopath上播放声音
17.5.4 从Audiopath获取对象
17.6 3D声音
l7.6.1 3D声音坐标
17.6.2 感知
17.6.3 DirectSound 3D缓存
17.6.4 3D参数的设置
17.6.5 DirectSound 3D听者
17.6.6 3D音效文本例程
本章小结
第18章 3D模型的处理
18.1 3D模型文件格式
18.2 MD2文件格式
18.2.1 MD2的实现
18.2.2 MD2的载入
18.2.3 MD2的显示
18.2.4 添加纹理
18.2.5 模型的动画
18.2.6 开发一个CMD2Model类
18.2.7 模型动画的控制
18.3 最后的一点小资料
本章小结
第19章 OpenGL物理建模
19.1 物理学的回顾
19.1.1 时间
19.1.2 距离、位移和位置
19.1.3 速度
l9.1.4 加速度
19.1.5 作用力
19.1.6 动量
19.1.7 摩擦力
19.2 真实世界的模拟
19.2.1 任务的分解
19.2.2 定时
19.2.3 矢量
l9.2.4 平面
19.2.5 物体
l9.2.6 物体碰撞的处理
19.2.7 一个例程:空中曲棍球
本章小结
第20章 建立一个游戏引擎
20.1 SimpEngine的设计
20.1.1 利用CNode管理数据
20.1.2 对象的处胖:CObiect
20.2 引擎核
20.2.1 输入系统
20.2.2 CEngine类
20.2.3 游戏循环
20.2.4 输入的处理
20.2.5 SimpEngine
20.3 视点
20.4 场景
20.5 模型的添加
20.6 音频系统
20.7 粒子系统
本章小结
第21章 创建一个游戏:杀戮时刻
2l.1 初始设计
21.2 游戏场景
21.3 敌人
21.4 火箭与爆炸
21.5 用户的交互
21.6 运行游戏
21.7 建EXE可执行文件
本章小结
第4篇 附录
附录A 在线资源
A.1 游戏开发
A.2 OpenGL
A.3 DirectX
A.4 其他的资源
附录B 随书所附资料的使用
B.1 用户界面
B.2 文件结构
B.3 系统要求
B.4 安装
B.5 其他相关问题与疑难解答信息
B.6 是否仍旧需要帮助 ...

Ⅲ OPENGL是什么

OpenGL三维图形标准是由AT&T公司UNIX软件实验室、IBM
、DEC、SUN、HP、Microsoft和SGI等多家公司在GL图形库标准的基础
上联合推出的开放式图形库,它使在微机上实现三维真实
感图形的生成与显示成为可能。由于OpenGL是开放的图形标
准,用户原先在UNIX下开发的OpenGL图形软件很容易移植到微
机上的WindowsNT/95上。笔者在VisualC++4.1(以下简称VC)集
成环境下,开发了基于OpenGL的三维真实感图形应用程序,现
介绍如下。

微机上的OpenGL开发环境

基于OpenGL标准开发的应用程序必须运行于32位Windows
平台下,如WindowsNT或Windows95环境;而且运行时还需有动态
链接库OpenGL32.DLL、Glu32.DLL,这两个文件在安装WindowsNT时已
自动装载到C:\WINNT\SYSTEM32目录下(这里假定用户将WindowsNT
安装在C盘上);而对于使用Windows95平台的用户,则需手工将
两个动态库复制到Windows95目录的SYSTEM子目录中。安装了
WindowsNT/95和VC4.1后,用户就具备了基于OpenGL开发三维图
形软件的基本条件。

OpenGL程序设计的基本步骤

1.OpenGL在WindowsNT下的运行机制

OpenGL工作在客户机/服务器模式下,当客户方(即基
于OpenGL标准开发的应用程序)向服务器(OpenGL核心机制)发出
命令时,由服务器负责解释这些命令。通常情况下,客户方
和服务器是运行在同一台微机上的。由于OpenGL的运行机制
是客户机/服务器模式,这使得用户能够十分方便地在网
络环境下使用OpenGL,OpenGL在WindowsNT上的这种实现方式通常
称为网络透明性。

OpenGL的图形库函数封装在动态链接库OpenGL32.DLL中,

客户机中的所有OpenGL函数调用,都被传送到服务器上,由
WinSrv.DLL实现功能,再将经过处理的指令发送到Win32设备驱
动接口(DDI),从而实现在计算机屏幕上产生图像。

若使用OpenGL图形加速卡,则上述机制中将添加两个
驱动器:OpenGL可装载客户模块(OpenGLICD)将安装在客户端;硬
件指定DDI将安装在服务器端,与WinDDI同一级别。

2.OpenGL的库函数

开发基于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函数用于处理像素存储格
式、双缓存等函数调用。

3.VC环境下基于OpenGL的编程步骤

下面介绍在VC环境中建立基于Opeetting菜单选项,在Link栏的Lib输入域中
添加openg132.lib、glu32.lib,若需使用OpenGL的辅助库函数,则还
需添加glaux.lib。

(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(dc.m_hDC,&pfd);
BOOLsuccess=SetPixelFormat(dc.m_hDC,pixelFormat,&pfd);
m_hRC=wglCreateContext(dc.m_hDC);

选择WM_DESTORY消息,在OnDestory()中添加以下代码:

wglDeleteContext(m_hRC);

在MyTestView.cpp中,将以下代码添加到PreCreateWindows()函数中:

cs.style|=WS_CLIPCHILDREN|WS_CLIPSIBLINGS;
OpenGL只对WS_CLIPCHILDREN|WS_CLIPSIBLINGS类型窗口有效;

在MyTestView.cpp中,将以下代码添加到OnDraw()函数中:

wglMakeCurrent(pDC->m_hDC,m_hRC);
DrawScene();//用户自定义函数,用于绘制三维场景;
wglMakeCurrent(pDC->m_hDC,NULL);

在MyTestView.cpp中,添加成员函数DrawScene():

voidCMyTestView::DrawScene()
{/*绘制三维场景*/}
(4)在MyTestView.h中包含以下头文件并添加类成员说明:
#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[]={1.0,1.0,1.0,0.0,};
GlfloatLight_diffuse[]={1.0,1.0,0.0,1.0,};
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[]={0.8,0.8,0.8,1.0};
GLfloatmat_diffuse[]={0.8,0.0,0.8,1.0};/*紫色*/
GLfloatmat_specular[]={1.0,0.0,1.0,1.0};/*镜面高光亮紫色*/
GLfloatmat_shiness[]={100.0};/*高光指数*/
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)=(1.0,1.0,1.0)(白光),
物体的材质颜色定义为(Mr,Mg,Mb)=(0.0,0.0,0.8),则最终到达人
眼的物体颜色应当是(Lr*Mr,Lg*Mg,Lb*Mb)=(0.0,0.0,0.8)(蓝色)。

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是近几年发展起来的一个性能卓越的三维图形标准,它是在SGI等多家
世界闻名的计算机公司的倡导下,以SGI的GL三维图形库为基础制定的一个通
用共享的开放式三维图形标准。目前,包括Microsoft、SGI、IBM、DEC、SUN、
HP等大公司都采用了OpenGL做为三维图形标准,许多软件厂商也纷纷以OpenGL
为基础开发出自己的产品,其中比较着名的产品包括动画制作软件Soft Image
和3D Studio MAX、仿真软件Open Inventor、VR软件World Tool Kit、CAM软
件ProEngineer、GIS软ARC/INFO等等。值得一提的是,随着Microsoft公司在
Windows NT和最新的Windows 95中提供了OpenGL标准及OpenGL三维图形加速卡
(如北京黎明电子技术公司的AGC-3D系列三维图形加速卡)的推出,OpenGL将
在微机中有广泛地应用,同时也为广大用户提供了在微机上使用以前只能在高
性能图形工作站上运行的各种软件的机会。

OpenGL实际上是一个开放的三维图形软件包,它独立于窗口系统和操作系统,
以它为基础开发的应用程序可以十分方便地在各种平台间移植;OpenGL可以
与Visual C++紧密接口,便于实现机械手的有关计算和图形算法,可保证算
法的正确性和可靠性;OpenGL使用简便,效率高。它具有七大功能:

1) 建模 OpenGL图形库除了提供基本的点、线、多边形的绘制函数外,还提
供了复杂的三维物体(球、锥、多面体、茶壶等)以及复杂曲线和曲面
(如Bezier、Nurbs等曲线或曲面)绘制函数。
2) 变换 OpenGL图形库的变换包括基本变换和投影变换。基本变换有平移、
旋转、变比镜像四种变换,投影变换有平行投影(又称正射投影)和透
视投影两种变换。其变换方法与机器人运动学中的坐标变换方法完全一
致,有利于减少算法的运行时间,提高三维图形的显示速度。
3) 颜色模式设置 OpenGL颜色模式有两种,即RGBA模式和颜色索引(Color Index)。
4) 光照和材质设置 OpenGL光有辐射光(Emitted Light)、环境光
(Ambient Light)、漫反射光(Diffuse Light)和镜面光(Specular Light)。
材质是用光反射率来表示。场景(Scene)中物体最终反映到人眼的颜色是光
的红绿蓝分量与材质红绿蓝分量的反射率相乘后形成的颜色。
5) 纹理映射(Texture Mapping) 利用OpenGL纹理映射功能可以十分逼真
地表达物体表面细节。
6) 位图显示和图象增强 图象功能除了基本的拷贝和像素读写外,还提供
融合(Blending)、反走样(Antialiasing)和雾(fog)的特殊图象效果处理。
以上三条可是被仿真物更具真实感,增强图形显示的效果。
7) 双缓存(Double Buffering)动画 双缓存即前台缓存和后台缓存,简而言
之,后台缓存计算场景、生成画面,前台缓存显示后台缓存已画好的画面。
此外,利用OpenGL还能实现深度暗示(Depth Cue)、运动模糊(Motion Blur)等
特殊效果。从而实现了消隐算法。

Ⅳ C语言windows,OpenGL编程

  1. 查找 MSDN 可以得知,MSG 里面的 pt 坐标是相对于窗口的左上角的;

2. 至于声音控制和播放,可以使用 Windows 自带的 MCI API,或者使用 DirectSound 来播放,我推荐你使用 un4seen 的 BASS,简单实用强大,一两个函数就可以播放音效了;

3. 你要使用 alpha blend 与桌面进行镂空运算,就必须首先获得桌面的窗体句柄,OpenGL 的 alppha 运算我不是很懂,不过 Direct3D 的话就简单多了;

4. 屏幕常亮,其实就是阻止系统进入休眠状态,每当系统要进入休眠状态之前,都会向系统的所有窗口发送一条消息,你拦截这条消息,进行特别的处理就可以防止系统进入休眠了,至于是什么消息,请查看 MSDN,我也好久没用过这条消息了;

5.bmp 文件可以保存 alpha 通道,使用 32bit 色深的 bmp 文件就可以了,RGB 分别 8bit,alpha 通道 8bit,不过说到 alpha 通道,tga 或者 png 图片更加合适,因为他们可以进行无损压缩

6.用GetPocAddress导出函数,只能用类型强制转换,这个是 windows 的原则,我们只能去迎合它了 ...

7. 执行 NULL 指针的话,不同的系统会有不同的反应,XP 是直接程序崩溃,Vista 或者以上的系统,就会提示无响应

8. 如果你建立的工程是 Win32 窗口程序,那么就不会有 DOS 窗口,如果你建立的是 Win32 控制台程序,那么就会有 DOS 窗口;如果你使用 OpenGL 实用库来创建 OpenGL 程序,那个 DOS 窗口是无法消除的,它可以帮助你进行错误排查

9. 不要用 Dev C++ 了,用 VS2010 吧,这是行业规范


最后,祝楼主学习愉快

Ⅳ OpenGL编程大概要学多久谁有好的书推荐

看你心情咯,主要都是一些函数的学习,如果有计算机图形学基础,应该不是很难。推荐的话,当然是OpenGL红宝书,《OpenGL编程指南》咯,网上有很多电子书下,包括书上源码

Ⅵ opengl编程指南适合初学者吗

其实我觉得NeHe的OpenGL指南应该是比较容易理解和入门的~
如果例程运行有问题,最好找一下问题根源所在~
我记得我当初学openGL的时候(做虚拟现实相关的破烂玩意儿~),只有一点点的WINDOWS编程基础(自学的《windows程序设计》这本书),用的也是nehe的教程,感觉用来入门还算不错的~
不过后来的工作,再也没有用过openGL。。。都淡忘了
=。=

Ⅶ C++做游戏

你可以学一下显卡API,比如 OpenGL (推荐,兼容性好) 或 DirectX 。然后看看关于游戏编程的书(上当当网找)。当然最好要有团队合作,因为一个人通常完不成。

如果要学 OpenGL,推荐一本:《OpenGL编程基础》。

Ⅷ 介绍常用的OpenGL的函数(定义+功能)

OpenGL 函数库相关的API有核心库(gl)、实用库(glu)、辅助库(aux)、实用工具库(glut)、窗口库(glx、agl、wgl)和扩展函数库等。从图1可以看出,gl是核心,glu是对gl的部分封装。glx、agl、wgl 是针对不同窗口系统的函数。glut是为跨平台的OpenGL程序的工具包,比aux功能强大。扩展函数库是硬件厂商为实现硬件更新利用OpenGL的扩展机制开发的函数。下面逐一对这些库进行详细介绍。
1.OpenGL核心库核心库包含有115个函数,函数名的前缀为gl。这部分函数用于常规的、核心的图形处理。此函数由gl.dll来负责解释执行。由于许多函数可以接收不同数以下几类。据类型的参数,因此派生出来的函数原形多达300多个。核心库中的函数主要可以分为以下几类函数:
(1)绘制基本几何图元的函数。如绘制图元的函数glBegain()、glEnd()、glNormal*()、glVertex*()。
(2)矩阵操作、几何变换和投影变换的函数。如矩阵入栈函数glPushMatrix()、矩阵出栈函数glPopMatrix()、装载矩阵函数glLoadMatrix()、矩阵相乘函数glMultMatrix(),当前矩阵函数 glMatrixMode()和矩阵标准化函数glLoadIdentity(),几何变换函数glTranslate*()、glRotate*()和 glScale*(),投影变换函数glOrtho()、glFrustum()和视口变换函数glViewport()等等。
(3)颜色、光照和材质的函数。如设置颜色模式函数glColor*()、glIndex*(),设置光照效果的函数glLight*() 、glLightModel*()和设置材质效果函数glMaterial()等等。
(4)显示列表函数、主要有创建、结束、生成、删除和调用显示列表的函数glNewList()、 glEndList()、glGenLists()、glCallList()和glDeleteLists()。
(5)纹理映射函数,主要有一维纹理函数glTexImage1D()、二维纹理函数glTexImage2D()、 设置纹理参数、纹理环境和纹理坐标的函数glTexParameter*()、glTexEnv*()和glTetCoord*()等。
(6)特殊效果函数。融合函数glBlendFunc()、反走样函数glHint()和雾化效果glFog*()。
(7)光栅化、象素操作函数。如象素位置glRasterPos*()、线型宽度glLineWidth()、多边形绘制模式glPolygonMode(),读取象素glReadPixel()、复制象素glCopyPixel()等。
(8)选择与反馈函数。主要有渲染模式glRenderMode()、选择缓冲区glSelectBuffer()和反馈缓冲区glFeedbackBuffer()等。
(9)曲线与曲面的绘制函数。生成曲线或曲面的函数glMap*()、glMapGrid*(),求值器的函数glEvalCoord*() glEvalMesh*()。
(10)状态设置与查询函数。主要有glGet*()、glEnable()、glGetError()等。
2.OpenGL实用库The OpenGL Utility Library (GLU)包含有43个函数,函数名的前缀为glu。OpenGL提供了强大的但是为数不多的绘图命令,所有较复杂的绘图都必须从点。线、面开始。Glu 为了减轻繁重的编程工作,封装了OpenGL函数,Glu函数通过调用核心库的函数,为开发者提供相对简单的用法,实现一些较为复杂的操作。此函数由 glu.dll来负责解释执行。OpenGL中的核心库和实用库可以在所有的OpenGL平台上运行。主要包括了以下几种:
(1)辅助纹理贴图函数,有gluScaleImage() 、gluBuild1Dmipmaps()、gluBuild2Dmipmaps()。
(2)坐标转换和投影变换函数,定义投影方式函数gluPerspective()、gluOrtho2D() 、gluLookAt(),拾取投影视景体函数gluPickMatrix(),投影矩阵计算gluProject()和 gluUnProject()等等。
(3)多边形镶嵌工具,有gluNewTess()、 gluDeleteTess()、gluTessCallback()、gluBeginPolygon() gluTessVertex()、gluNextContour()、gluEndPolygon()等等。
(4)二次曲面绘制工具,主要有绘制球面、锥面、柱面、圆环面gluNewQuadric()、gluSphere()、gluCylinder()、gluDisk()、gluPartialDisk()、gluDeleteQuadric()等等。
(5)非均匀有理B样条绘制工具,主要用来定义和绘制Nurbs曲线和曲面,包括gluNewNurbsRenderer()、 gluNurbsCurve()、gluBeginSurface()、gluEndSurface()、gluBeginCurve()、 gluNurbsProperty()等函数。
(6)错误反馈工具,获取出错信息的字符串gluErrorString()。
3.OpenGL辅助库包含有31个函数,函数名前缀为aux。这部分函数提供窗口管理、输入输出处理以及绘制一些简单三维物体。此函数由glaux.dll来负责解释执行。创建aux库是为了学习和编写 OpenGL程序,它更像是一个用于测试创意的预备基础接管。Aux库在windows实现有很多错误,因此很容易导致频繁的崩溃。在跨平台的编程实例和演示中,aux很大程度上已经被glut库取代。OpenGL中的辅助库不能在所有的OpenGL平台上运行。辅助库函数主要包括以下几类:
(1)窗口初始化和退出函数,auxInitDisplayMode()和auxInitPosition()。
(2)窗口处理和时间输入函数,auxReshapeFunc()、auxKeyFunc()和auxMouseFunc()。
(3)颜色索引装入函数,auxSetOneColor()。
(4)三维物体绘制函数。包括了两种形式网状体和实心体,如绘制立方体auxWireCube()和 auxSolidCube()。这里以网状体为例,长方体auxWireBox()、环形圆纹面auxWireTorus()、圆柱 auxWireCylinder()、二十面体auxWireIcosahedron()、八面体auxWireOctahedron()、四面体 auxWireTetrahedron()、十二面体auxWireDodecahedron()、圆锥体auxWireCone()和茶壶 auxWireTeapot()。
(5)背景过程管理函数auxIdleFunc()。
(6)程序运行函数auxMainLoop()。
4.OpenGL工具库 OpenGL Utility Toolkit包含大约30多个函数,函数名前缀为glut。glut是不依赖于窗口平台的OpenGL工具包,由Mark KLilgrad在SGI编写(现在在Nvidia),目的是隐藏不同窗口平台API的复杂度。函数以glut开头,它们作为aux库功能更强的替代品,提供更为复杂的绘制功能,此函数由glut.dll来负责解释执行。由于glut中的窗口管理函数是不依赖于运行环境的,因此OpenGL中的工具库可以在X-Window, Windows NT, OS/2等系统下运行,特别适合于开发不需要复杂界面的OpenGL示例程序。对于有经验的程序员来说,一般先用glut理顺3D图形代码,然后再集成为完整的应用程序。这部分函数主要包括:
(1)窗口操作函数,窗口初始化、窗口大小、窗口位置等函数glutInit() glutInitDisplayMode() glutInitWindowSize() glutInitWindowPosition()等。
(2)回调函数。响应刷新消息、键盘消息、鼠标消息、定时器函数等,GlutDisplayFunc() glutPostRedisplay() glutReshapeFunc() glutTimerFunc() glutKeyboardFunc() glutMouseFunc()。
(3)创建复杂的三维物体。这些和aux库的函数功能相同。创建网状体和实心体。如glutSolidSphere()、glutWireSphere()等。在此不再叙述。
(4)菜单函数。创建添加菜单的函数GlutCreateMenu()、glutSetMenu()、glutAddMenuEntry()、glutAddSubMenu() 和glutAttachMenu()。
(5)程序运行函数,glutMainLoop()。

Ⅸ Opengl编程指南第八版中文版怎么样,适合入门学习么

其实我觉得NeHe的OpenGL指南应该是比较容易理解和入门的~如果例程运行有问题,最好找一下问题根源所在~我记得我当初学openGL的时候(做虚拟现实相关的破烂玩意儿~),只有一点点的WINDOWS编程基础(自学的《windows程序设计》这本书),用的也是nehe的教程,感觉用来入门还算不错的~不过后来的工作,再也没有用过openGL。。。都淡忘了=。=

Ⅹ OPenGL非常非常基础的一个编程问题

glClear(GL_COLOR_BUFFER_BIT|GLUT_DOUBLE|GLUT_DEPTH);
这句话不对
glClear(GL_COLOR_BUFFER_BIT);
这样就对了
可是你这个画出来的不是个线球吗

热点内容
安卓如何把时钟插件调出来 发布:2025-03-15 05:19:11 浏览:49
安卓旋钮主机音量大小怎么调整 发布:2025-03-15 05:19:05 浏览:754
如何将支付密码关掉 发布:2025-03-15 05:16:55 浏览:931
java培训学院 发布:2025-03-15 05:11:22 浏览:33
java架构面试题 发布:2025-03-15 05:06:03 浏览:712
vba获取网页表格数据库 发布:2025-03-15 04:57:09 浏览:287
java时间随机 发布:2025-03-15 04:55:14 浏览:70
dmx编程 发布:2025-03-15 04:26:32 浏览:607
oppo手机密码紧急呼叫号码是多少 发布:2025-03-15 04:22:07 浏览:789
黑松鼠停脚本 发布:2025-03-15 04:22:05 浏览:200