OpenGL状态机
状态机:是一个抽象的模型,表示一组状态变量的集合。每个状态变量可以有各种不同的值,例如可以打开或关闭等。
OpenGL使用了一种状态模型(或称状态机)来追踪所有的OpenGL状态变量。当一个状态值被设置之后,它就一直保持这个状态,直到其他函数对它进行了修改。许多状态只是简单的打开或关闭。例如,光照要么打开,要么关闭。如果几何图形不使用光照,那么在绘制这个几何图形的颜色集合时就不必进行任何光照计算。如果启用了光照效果,那么此后所绘制的所有几何图形都将进行光照计算。
打开状态变量:
void glEnable(GLenum capability);
关闭状态变量:
void glDisable(GLenum capability);
判断某一状态变量是否被打开:
Glboolean glIsEnabled(GLenum capability);
保存和恢复状态
OpenGL提供一种方便的机制,可以保存一组范围内的所有状态值,并在将来恢复它们。堆栈在这里发挥了重要的作用(堆栈是一种方便的数据结构,允许把一些值压入到堆栈保存,并在以后将它们从堆栈中弹出。数据元素是按照与压入堆栈时相反的顺序弹出的,即所谓的后进先出数据结构)。
将一个OpenGL状态值或一组范围的相关状态值压入到属性堆栈中:
void glPushAttrib(GLbitfield mask);
提取对应的值:
void glPopAttrib(GLbitfield mask);
注意,上面两个函数的参数是个位段,也就是一个位掩码,这意味着可以在单个函数调用中用位OR操作来表示多个状态。例如,可以用下面这个调用保存光照和纹理状态:
glPushAttrib(GL_TEXTURE_BIT | GL_LIGHTING_BIT)
OpenGL错误
OpenGL在内部维护了一组错误标志。每个标志代表一种不同类型的错误。当一个错误发生时,与这个错误相对应的标志就会被设置。
获取错误标志:
GLenum glGetError(void);
获取错误标志描述:
const GLubyte * gluErrorString(GLenum errorCode);
下面是OpenGL错误标志列表:
错误代码 描述
GL_INVALID_ENUM 枚举参数超出范围
GL_INVALID_VALUE 数值参数超出范围
GL_INVALID_OPERATION 在当前的状态中操作非法
GL_STACK_OVERFLOW 堆栈上溢
GL_STACK_UNDERFLOW 堆栈下溢
GL_OUT_OF_MEMORY 没有足够内存来执行这条命令
GL_TABLE_TOO_LARGE 指定表太大
GL_NO_ERROR 没有错误
使用glHint
一种OpenGL实现常常包含了两种方法来执行一个特定的任务,一种是快速的方法,在性能上稍作妥协;另一种是慢速的方法,着重于改进视觉质量。glHint函数允许指定偏重于视觉质量还是速度,以适应各种不同类型的操作。函数原型如下:
void glHint(GLenum targe,GLenum mode);