OpenGL系列教程(3)——OpenGL基础(2)

来源:互联网 发布:京东延保服务 知乎 编辑:程序博客网 时间:2024/05/22 02:50

本篇教程内容续上篇。

在实际接触OpenGL之前,需要先了解一些计算机图像领域的基础知识。

1.RGB颜色模型
或许你曾听说过三原色理论,这个理论奠定了RGB颜色模型的基础。光的三原色,即红、绿、蓝。我们普遍认为世界上所有颜色都能由这三种颜色混合得到,实际效果可见下图。
任意色彩都能由三原色混合而成
RGB颜色模型的全称是Red Green Blue颜色模型,它将任意一种颜色表示成红、绿、蓝三种分量。一般在计算机中,我们使用三个字节来表示一种颜色,从低位到高位依次是红色分量、绿色分量和蓝色分量。这种表示方法也是业界的一种标准,称为RGB888,其中8的意思是8bit。
然而实际上在处理图像时,光有红绿蓝三种颜色分量是不够的。随着图像技术的发展,人们提出了透明度的概念,并为其定义了一个度量Alpha。于是传统的RGB模型变成了RGBA模型,即Red Green Blue Alpha模型。该模型在RGB模型的基础上添加了一个新的度量Alpha,代表颜色的透明度。我们一般用四个字节来表示RGBA,即业界标准RGBA8888。

2.矢量图和位图
在计算机中,有两种方式表示一幅图像。第一种是使用图形代码表示,被称为矢量图;第二种是使用点阵表示,被称为位图。
使用图形代码表示可以从字面意思上理解,即使用图形语言来描述一副图像的构成,典型的有SVG语言描述的SVG图片,详情可以百度;点阵是最常见的一种图像表示法,平时我们打交道的图片几乎都是点阵表示的。点阵是一个颜色矩阵,图像按照宽高分成一个个小格子,每个格子中储存一种颜色。当格子密而多时,就能表现出一张完整的图片。
因此,位图可以使用一个RGBA类型的二维数组来存储。而OpenGL的渲染实质便是将矢量图转换成位图。

以上是图像领域的基础知识。

在实际接触代码前,先来讲解一下OpenGL的基础概念。以下内容基于OpenGL 4.x版本。

OpenGL在输入阶段接受一种叫做图元(Primitive)的数据作为输入。我们把构成图像的基本元素称为图元。就好像宇宙是由基本粒子构成的一样,图元就是计算机图形学世界的基本粒子。这跟矢量图使用代码描述图像十分类似,而实际上它们差别也不大。OpenGL定义的图元严格来说只有三种:点、线、面(三角形)。任何一种图形都能由点、线、三角形构成。为了方便起见,OpenGL还定义了这些图元:条带线、循环线、三角形条带、三角形扇面。其中条带线和循环线是线的变种,三角形条带和三角形扇面是三角形的变种。为了直观理解,我提供了三角形条带和三角形扇面的样子,如下:

三角形条带
三角形条带

三角形扇面
三角形扇面

任何一个图元都由两部分构成,一是图元类型,二是顶点数据。在OpenGL的输入阶段,我们需要同时提供图元的类型和图元的顶点数据,这样OpenGL才能认识到这是一个怎样的形状。

1.图元类型
下表列出了图元类型与OpenGL枚举量的对应关系

图元类型 OpenGL枚举量 点 GL_POINTS 线 GL_LINES 条带线 GL_LINE_STRIP 循环线 GL_LINE_LOOP 三角形 GL_TRIANGLES 三角形条带 GL_TRIANGLE_STRIP 三角形扇面 GL_TRIANGLE_FAN

2.顶点数据
OpenGL 4中的顶点是高度抽象的,不像早期版本那样预先设置好了顶点应该具有的属性,如空间坐标、颜色值、纹理坐标、法向量等。OpenGL 4中的顶点在初始时没有定义任何属性,需要开发人员手动设置。具体如何设置将在下章教程中阐述。
在定义完顶点的属性后,我们就能创建一个顶点集合,并向其中填入数据,与图元类型一起输入给OpenGL。注意,虽然我这里给出的顺序是:定义顶点属性→创建顶点集合→填充顶点数据,但实际在编写代码时,顺序是:创建顶点集合→填充顶点数据→将数据绑定到顶点属性。具体原因将在下章阐述。

0 0