1.3 OpenGL数据类型
数据类型
OpenGL不仅提供了跨平台的能力,而且也提供了对多种开发语言的支持,除了最常见的C/C++,你还可以用Java、Fortran、Ada等作为OpenGL应用程序的开发语言。实际上,现在人们用的最多的是C/C++,其次,使用Java的也将会越来越多。
在为了简便起见,OpenGL对ANSI C的一些数据类型进行了包装,如把char使用typedef重新定义成GLbyte,这些数据类型的定义在gl.h文件中都可以找到。
和DirectX相比,OpenGL库函数的命名相当有规律,通过函数名基本就知道该函数的功能。OpenGL函数的命名方式是“前缀+函数实体+后缀”。在Windows平台中,其中前缀有gl、glu、aux,分别在gl.h、glu.h、glaux.h三个文件中定义,表示该函数属于OpenGL的基本库、实用库和辅助库。在Unix和Linux平台中,还有1个glx前缀,表示X窗口的扩展库。函数实体表示函数的功能,如Color表示设置颜色,Light表示设置灯光。后缀是针对函数中的参数的,其形式是“数字+数据类型+v”,其中数字有1、2、3、4表示函数中的参数数值为一维、二维、三维和表示透明度的Alpha值,数据类型是OpenGL定义的各种数据类型的缩写, v表示数值是一个向量。在一个函数中,后缀并不是必须的,如glClearColor。在后缀中,数字和v也不是必须的,如glLightf。典型的函数是glColor4fv,表示设置当前颜色,参数应该是一个包含4个浮点数分量的向量,这4个浮点数表示颜色的红、绿、蓝及Alpha值。如下表1-1是OpenGL中各种数据类型以及作为后缀的说明。
表1-1 OpenGL数据类型说明
OpenGL数据类型 | 缩写 | 对应ANSI C定义 | 对应Win32定义 | 取值范围 |
GLbyte | b | char | CHAR | -128~127 |
GLdouble GLclampd | d | double | double | 1.7e-308~1.7e+308 |
GLfloat GLclampf | f | float | FLOAT | 3.4e-38~3.4e+38 |
GLint GLsizei | i | int | INT BOOL LONG | -2147483648~ 2147483647 |
GLshort | s | short | SHORT | -32768~32767 |
GLubyte GLboolean | ub | unsigned char | UCHAR BYTE BOOLEAN | 0~255 |
GLuint GLenum GLbitfield | ui | unsigned int | UINT DWORD ULONG | 0~ 4294967295 |
GLushort | us | unsigned short | USHOR WORD | 0~65535 |
GLvoid |
| void | VOID |
|
在程序中全部使用GL*这样的变量说明可以保持一致,但是并不是必须的。只要说明清楚就可以了,所以我们可以把GLvoid和void混用,GLint和int混用,都没有关系。
OpenGL基本库和实用库中的函数是平台无关的,可以在不同的平台上使用,而辅助库中的函数则受限于平台,如auxInitDisplayMode。在Windows系统中,为了解决和平台相关问题,如OpenGL对绘图设备上下文GDI的处理,字体的应用等,还提供了Win32专用的WGL库,这些函数以wgl开头,是将Windows和OpenGL连接在一起的纽带,是开发基于Windows系统的OpenGL应用必不可少的部分。如wglMakeCurrent是将OpenGL渲染描述表RC和Windows的设备上下文DC关联起来的函数。
1.4 状态机制
OpenGL的工作机制是状态机机制,程序在运行时是基于状态的,这些状态被记录在一些状态变量中,程序可以修改这些变量。OpenGL中状态变量通常都有一个缺省值,如果不修改这些变量,则程序就工作在缺省状态下。状态又可以分为两种,一种是简单的是否有效标识,另一种是状态的值。例如,当前纹理是否有效、是否启动光照是一种有效标识。而当前颜色值、启动光照后的光照数据就是状态的值。有效标识是使用glEnable和glDisable进行设置,状态的值则使用不同的函数设置。如需要启动纹理,必须使用glEnable(GL_TEXTURE_2D)来使纹理有效,使之无效则需要使用glDisable(GL_TEXTURE_2D)。如修改当前光照数据则使用对应的glLight函数来设置。
状态的值也可以通过glGet*函数来获取,通常使用的函数是glGetBooleanv、glGetDouble、glGetFloatv和glGetIntegerv,其中glGetBooleanv用于获得有效标识的值,另外的用于获取其他状态的值。有些状态的值还需要对应的函数来获取,例如,光照数据需要使用glGetLight*来获取。
为了便于对状态的管理,OpenGL还提供了状态堆栈。使用glPushAttrib和glPopAttrib来将当状态值压入状态堆栈和从堆栈中取出状态值。相对于设置和查询函数来说,这两个函数的效率更高。
-------------------------------------------------------------------------------------------------
声明:本文可在网络媒体自由传播,但必须保留作者的声明信息及来源,平面媒体的引用必须征得作者的同意。
另外,作者也欢迎同仁进行交流。
QQ: 851473402
Email: LotusRachel@gmail.com