OpenGL编程指南第七版-第一章 OpenGL简介

本章目标:

  • 大致了解OpenGL的功能
  • 了解不同程度的渲染复杂性
  • 理解OpenGL程序的基本结构
  • 了解OpenGL函数的语法
  • 了解OpenGL渲染管线的操作序列
  • 大致了解如何在OpenGL程序中实现动画

本书对OpenGL进行了简单的介绍,主要包含下面几节:

  • 什么是OpenGL:介绍OpenGL是什么,它能够做什么,不能够做什么,以及它的工作原理.
  • 一段简单的OpenGL代码:展示一个小型的OpenGL程序,并对它进行了简单的讨论,并定义了一些基本的计算机图形术语
  • OpenGL函数的语法:解释OpenGL函数所使用的一些约定和记法
  • OpenGL是一个状态机:描述OpenGL状态变量的用法,并介绍一些查询,启用和禁用OpenGL状态的函数
  • OpenGL渲染管线:展示一个用于处理几何和图像数据的典型操作序列
  • 与OpenGL相关的函数库:介绍一些与使用OpenGL相关的函数,包括对GLUT(Graphice岁LibraryUtilityToolkit,一种可移植的工具库)的详细介绍
  • 动画:简单介绍如何创建能够在屏幕移动的图片

OpenGL及其废弃机制:介绍在OpenGL的最新版本中哪些废弃修改,这些修改如何影响到应用程序,以及根据这些修改,OpenGL未来会如何发展

1.1 什么是OpenGL

OpenGL是图形处理硬件的一种软件接口.这个接口包含的函数超过700个(纳入OpenGL3.0的函数大约670个,另外50个函数位于OpenGL工具库中),这些函数可以用于指定物体和操作,创建交互式的三维应用程序.

OpenGL的设计目标就是作为一种流水线型的,独立于硬件的接口,在许多不同的硬件平台上实现.为了实现这个目标,

OpenGL并未包含用于执行窗口任务或者获取用户输入之类的函数.反之,必须通过具体的窗口系统来控制OpenGL应用程序所使用的特定硬件.类似的,OpenGL并没有提供用于描述三维物体模型的高级函数,这类函数可能允许特定系那个对较为复杂的形状,例如骑车,身体的某个补位,飞机或分子等.在OpenGL中,程序员必须根据一些为数不多的基本几何图元(如点,直线和多边形)来创建所需要的模型.

当然,程序员可以在OpenGL的基础上,创建提供这些特性的高级函数库.OpenGL工具库(GLU)提供了许多建模功能,例如二次曲面以及NURBS曲面和表面.GLU是所有OpenGL实现的第一个标准组成部分.

1.2 一段简单的OpenGL代码

由于OpenGL图形系统的功能非常强大,因此OpenGL程序可能相当复杂,但是,许多使用的OpenGL程序的基本结构可能非常简单,它的任务就是初始化一些状态(这些状态用于控制OpenGL的渲染方式),并指定需要进行渲染的物体

在查看OpenGL代码之前,首先介绍几个术语,渲染(rendering)是计算机根据模型创建图像的过程,我们已经在前面看到过这个术语,模型(model)是根据几何图元创建的,也成为无题(object),几何图元包括点,直线和多边形,它们是通过顶点(vertex)指定的.

最终完成了渲染的图像是由屏幕上绘制的像素组成的,像素是最小可视元素,

位平面是一块内存取悦,保存了屏幕上的每个像素的一个位的信息,

glClearColor()函数确定了窗口将清除成什么颜色,而glClear()函数实际完成清除窗口的任务.在设置了清楚颜色之后,以后每次调用glClear()时,窗口就会清除这种颜色.当然,可以再次调用glClearColor()函数,更改当前的清除颜色,

glColor3f()函数确定了绘制物体时所使用的颜色,此后,所有绘制的物体都将使用这种颜色,出来再次调用这个函数更改绘图颜色.

glOrtho()函数指定了OpenGL在绘制最终图像时所使用的坐标系统(cooridinate system),决定了图像将如何映射到屏幕上,接下来的几个函数位于一对glBegin()和glEnd()调用之间,它们定义了要绘制的物体.

glFlush()函数保证了绘图命令将实际执行,而不是存储在缓冲区中等待其他的OpenGl命令

1.3 OpenGL函数的语法

glColor3f()函数名的3表示这个函数接受三个参数,f表示这些函数都是浮点数,

表1-1 函数后缀和参数数据类型

后缀典型的对应C语言类型OpenGL类型定义
bsigned charGLbyte
sshortGLshort
iint or longGLShort
ffloatGLint,GLsizei
ddoubleGLdouble,GLclampd
ubunsigned charGLubyte,GLboolean
usunsigned shortGLushort
uiunsigned int unsigned longGLuint,GLenum,GLbitfield

注意:不同的OpenGL实现在选择哪些C数据类型表示OpenGL数据类型方面存在一些差异,如果坚持在自己的应用程序中使用OpenGL定义的数据类型,那么在不同的OpenGL实现之间一直代码时,就可以避免类型不匹配的问题.
有些OpenGL函数名的最后还有一个v,它表示这个函数所接受的参数是一个指向值向量(或数组)指针,而不是一系列的单独参数,许多函数既有向量版本也有非向量版本,也有一些函数只接受单独的参数,另外还有一些函数要求至少有一个参数被指定为向量,下面这几行代码显示了既可以使用向量版本也可以使用非向量版本的函数来设置当前绘制颜色.
glColor3f(1.0,0.0,0.0);
GLfloat color_array[] = {1.0,1.0,1.0};
glColor3fv(color_array);
最后,OpenGL还定义了GLvoid类型,这种类型最长用于那些接受指向值数组的指针为参数的OpenGL函数.
在本书的剩余部分,将只用基本名称来表示OpenGL函数,并且加表示它还有多个不同版本,glColor()表示用于设置当前颜色的函数所有版本,如果想强调所使用的是一个函数的某个特定版本,可以加上必要的后缀来表示这个版本.glVertex*v()表示用于指定顶点的函数的所有版本.

1.4 OpenGL是一个状态机

OpenGL是一个状态机,尤其是如果你使用固定功能的管线,可以设置它的各种状态(或模式),然后让这些状态一直生效,直到再次修改它们,正如所看到的那样,当前颜色就是一个状态变量,可以把当前颜色设置成白色,红色,或其他颜色,当前颜色只是OpenGL所维护的许多状态变量之一.其他的状态还有很多,并且有着各自的用途,例如控制当前视图和投影变换,直线和多边形点画模式,多边形绘图模式,像素包装约定,光照的位置和特征已经被绘制的物体的材料属性,许多表示模式的状态变量可以用glEnable()和glDisable()函数进行启用和禁用.

如果使用shader,根据所用的OpenGL版本的不同,shader所识别状态的数量也不同.

每个状态都有一个默认值,任何时候都可以向系统查询每个状态变量的当前值,

1.5 OpenGL渲染管线

1.5.1 显示列表(display list)

任何数据,不论它描述的是几何图元还是像素,都可以保存在display list中,供当前或以后使用,当然,也可以不用保存,而是立即处理(immediate mode)

1.5.2 求值器

所有的几何图元最终都要通过顶点来描述.

1.5.3 基于顶点的操作

顶点变图元,

1.5.4 图元装配

图元装配的一个主要内容就是裁剪,
透视除法(perspective division)使远处的物体看起来比近处的物体更小一些,接下来所进行的是视口(viewport)和深度(z坐标)操作.如果启用了剔除功能(sulling)并且该图元是一个多边形,那么它就有可能被剔除测试所拒绝.根据多变模式,多边形可能化成点的形式或者直线的形式.

1.5.5 像素操作

在OpenGL的渲染管线中,和单路径的几何数据相比,像素数据所经历的流程有所不同,首先,来自系统内存的一个数组中像素进行解包,从某种格式(像素的原始格式可能有多种)解包为适当数量的数据成分,接着,这些数据被缩放,偏移,处理结果先进行截取,然后写入纹理内存,或者发送到光栅化阶段

1.5.6 纹理装配

OpenGL应用程序可以在几何物体上应用纹理图像,使它们看上去更为逼真.如果需要使用多幅纹理图像,把它们放在纹理对象中是一种明智的做法.这样就可以很方便的在他们之间进行切换.

1.5.7 光栅化

光栅化就是把几何数据和像素数据转换为片断(fragment)的过程,每个片段方块对应于帧缓冲区的一个像素,把顶点连接起来形成直线或者计算填充多边形的内部像素时,需要考虑直线和多边形的点画模式,直线的宽度,点的大小,着色模型以及用于支持抗锯齿处理的覆盖计算.每个片段方块都将具有各自的颜色和深度值.

1.5.8 片断操作

在数据实际存储到帧缓冲区之前,要执行一系列的操作,这些操作可能会修改甚至丢弃这些片段.

1.6 与OpenGL相关的函数库

OpenGL提供了一组功能强大但又非常基本的渲染函数,所有的高级绘图操作都是在这些函数的基础上完成的.另外,OpenGL程序还必须使用窗口系统的底层机制,有一些函数库可以帮助程序员简化编程任务,他们是:
- OpenGL工具函数库(GLU)包含了一些函数,它们利用底层的OpenGL函数来执行一些特定的任务,例如设置特定的矩阵(历史用于视图方向和投影的矩阵),多边形分格化以及表面渲染等.所有的OpenGL实现都把GLU作为它们的一部分,<>描述了GLU的部分函数,分布
- 所有的窗口系统都提供了一个函数库,对该窗口系统的功能进行扩展,以支持OpenGL渲染,对于使用X窗口系统的计算而言,它所使用的OpenGL扩展(GLX)是作为OpenGL的一个附件提供的.所有的GLX函数都使用前缀glX,win7而言,WGL函数库提供了Windows和OpenGL之间的接口
- OpenGL实用工具库,它的目的是隐藏不同窗口

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值