OpenGL系统设计-OpenGL数据类型和状态机制

1.3      OpenGL数据类型

 

数据类型

    OpenGL不仅提供了跨平台的能力,而且也提供了对多种开发语言的支持,除了最常见的C/C++,你还可以用JavaFortranAda等作为OpenGL应用程序的开发语言。实际上,现在人们用的最多的是C/C++,其次,使用Java的也将会越来越多。

          

    在为了简便起见,OpenGLANSI C的一些数据类型进行了包装,如把char使用typedef重新定义成GLbyte,这些数据类型的定义在gl.h文件中都可以找到。

DirectX相比,OpenGL库函数的命名相当有规律,通过函数名基本就知道该函数的功能。OpenGL函数的命名方式是“前缀+函数实体+后缀”。在Windows平台中,其中前缀有glgluaux,分别在gl.hglu.hglaux.h三个文件中定义,表示该函数属于OpenGL的基本库、实用库和辅助库。在UnixLinux平台中,还有1glx前缀,表示X窗口的扩展库。函数实体表示函数的功能,如Color表示设置颜色,Light表示设置灯光。后缀是针对函数中的参数的,其形式是“数字+数据类型+v”,其中数字有1234表示函数中的参数数值为一维、二维、三维和表示透明度的Alpha值,数据类型是OpenGL定义的各种数据类型的缩写, v表示数值是一个向量。在一个函数中,后缀并不是必须的,如glClearColor。在后缀中,数字和v也不是必须的,如glLightf。典型的函数是glColor4fv,表示设置当前颜色,参数应该是一个包含4个浮点数分量的向量,这4个浮点数表示颜色的红、绿、蓝及Alpha值。如下表1-1OpenGL中各种数据类型以及作为后缀的说明。

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*这样的变量说明可以保持一致,但是并不是必须的。只要说明清楚就可以了,所以我们可以把GLvoidvoid混用,GLintint混用,都没有关系。

 

OpenGL基本库和实用库中的函数是平台无关的,可以在不同的平台上使用,而辅助库中的函数则受限于平台,如auxInitDisplayMode。在Windows系统中,为了解决和平台相关问题,如OpenGL对绘图设备上下文GDI的处理,字体的应用等,还提供了Win32专用的WGL库,这些函数以wgl开头,是将WindowsOpenGL连接在一起的纽带,是开发基于Windows系统的OpenGL应用必不可少的部分。如wglMakeCurrent是将OpenGL渲染描述表RCWindows的设备上下文DC关联起来的函数。

 

1.4        状态机制

OpenGL的工作机制是状态机机制,程序在运行时是基于状态的,这些状态被记录在一些状态变量中,程序可以修改这些变量。OpenGL中状态变量通常都有一个缺省值,如果不修改这些变量,则程序就工作在缺省状态下。状态又可以分为两种,一种是简单的是否有效标识,另一种是状态的值。例如,当前纹理是否有效、是否启动光照是一种有效标识。而当前颜色值、启动光照后的光照数据就是状态的值。有效标识是使用glEnableglDisable进行设置,状态的值则使用不同的函数设置。如需要启动纹理,必须使用glEnable(GL_TEXTURE_2D)来使纹理有效,使之无效则需要使用glDisable(GL_TEXTURE_2D)。如修改当前光照数据则使用对应的glLight函数来设置。

状态的值也可以通过glGet*函数来获取,通常使用的函数是glGetBooleanvglGetDoubleglGetFloatvglGetIntegerv,其中glGetBooleanv用于获得有效标识的值,另外的用于获取其他状态的值。有些状态的值还需要对应的函数来获取,例如,光照数据需要使用glGetLight*来获取。

为了便于对状态的管理,OpenGL还提供了状态堆栈。使用glPushAttribglPopAttrib来将当状态值压入状态堆栈和从堆栈中取出状态值。相对于设置和查询函数来说,这两个函数的效率更高。

-------------------------------------------------------------------------------------------------
声明:本文可在网络媒体自由传播,但必须保留作者的声明信息及来源,平面媒体的引用必须征得作者的同意。
另外,作者也欢迎同仁进行交流。
QQ: 851473402
Email: LotusRachel@gmail.com

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值