偶新手学opengl,对一些基本的数据类型不太清楚,故做笔记。为了便于OpenGL在各种平台上移植,OpenGL定义了自己的数据类型。如果你愿意也可用这些数据类型对应的标准C的数据类型来替代。如OpenGL也定义GLvoid类型,如果用C语言编写,可以用它替代void类型。不同的C编译器或环境对各种C变量的大小和内存分布都有自己的规则。使用 OpenGL定义的数据类型就可以隔离开这些不同。下列表列出了Win32操作系统中OpenGL的数据类型及相应的C数据类型,为了便于识别,使用了后缀。在本书中,我将会使用这些后缀。以后你也可发现OpenGL的许多函数名字也是这种后缀来命名的。
OpenGL数据类型及对应的C数据类型
OpenGL数据类型 | 数据类型 | 相应的C数据类型 | 后缀 |
GLbyte | 8-bit integer | Signed char | b |
GLshort | 16-bit integer | Short | s |
G l int,GLsizei | 32-bit integer | long | l |
GLfloat,GLclampf | 32-bit floating point | Float | f |
GLdouble,GLclampd | 64-bit floating point | Double | d |
GLubyte,GLboolean | 8-bit unsigned integer | Unsigned char | ub |
GLushort | 16-bit unsigned integer | Unsigned short | us |
GLuint, GLenum, GLbitfield | 32-bit unsigned integer | Unsigned long | ui |
所有的数据类型都以GL开头,表示是OpenGL。紧跟在后面的大多是它们相应的C数据类型。一些开始有个u表示是无符号的数据类型,如:ubyte表示是无符号的字节。也给出了更多的描述名字的方法,如:size表示一个值的长度。GLsizei表示是一个GL变量,且参数的大小是一个整型。 C lamp是用于颜色的。这种数据类型以f和d结尾表示实型或双精度型数据类型。GLboolean变量用于标示True和False;GLenum用于枚举型变量; GLbitfield 用于包含二进制位的区域的变量。
指针和数据组没有特别的考虑。一个包含10个GLshort变量的数组可以简单的定义如下:GLshort shorts[10];包含10个GLdouble变量的指针的数组可以定义如下:
GLdouble
函数命名方式
OpenGL 的函数的命名方式可以告诉你你所使用的函数来自哪个库,及这个函数有几个参数和参数的类型。所有的函数都有一个词根来描述函数在OpenGL中相应的命令。例如:glColor3f() 有一个词根color。gl- 前缀描述的是这个函数来自gl库(看一下表3-1);-3f后缀表示函数有三个实型参数。所有的OpenGL函数是如下格式:
<库前缀><根命令><参数的数目><参数的类型>。
图3-1所示为OpenGL函数的保各部分组成。
这个示例函数带有后缀3f表示有三个实型参数。另外的有三个整型参数(glColor3i()),三个双精度型参数(glColor3d())。这种添加了参数个数的命名方式可以使我们不用查看就能很容易的记住函数列表的个数。有一些glColor有四个参数来表示alpha[eryar:即透明度 J ]值。在本书的参考部分,这些函数将以库的前缀和词根表列出。因此所有的变量类型 (glColor3f, glColor4f, glColor3i, 等等 ) 只将列表在glColor下面。
辅助库
通过本章的提醒你将会学使用辅助库来学习OpenGL。OpenGL的辅助库是一些特殊的函数,这些函数本来是用于初学者做简单的练习之用,因此这些函数不能在所有的OpenGL平台上使用,在Windows NT环境下可以使用这些函数。这些函数使用简单,它们可以用于窗口管理、输入输出处理以及绘制一些简单的三维形体。为了使OpenGL的应用程序具有良好的移植性,在使用OpenGL辅助库的时候应谨慎。
平台独立性
OpenGL是一种有力的、灵活的绘制三维图形的API,它的300多条命令包含了三维中的一切东西,从设置材质颜色、反射效果到旋转和复杂的坐标变换。你会对 OpenGL没有一条函数或命令涉及到窗口或屏幕管理而感到吃惊。另外,也没有键盘输入和鼠标交互的函数。由此可见,OpenGL的主要目的就是要做到平台独立性。在不同的平台中创建和打开窗口是用的不同的方法。即使OpenGL有关于打开窗口的命令,你是会用OpenGL的命令还是会用操作系统的API 来打开一个窗口呢?
另外一个与平台有关的就是处理键盘和鼠标的输入事件。假如所有的操作系统都一样地处理,我们只需一个环境就可以了,这就没有必要 ” open ” API了。