OpenGL学习笔记(二)

这篇博客介绍了OpenGL的状态机模型,包括如何打开和关闭状态变量,以及如何使用glEnable和glDisable函数进行控制。此外,还讲解了如何利用glIsEnabled检查状态,glPushAttrib和glPopAttrib进行状态保存与恢复。同时,文章提到了OpenGL的错误处理机制,如glGetError和gluErrorString函数,以及常见的错误代码和描述。最后,提到了glHint函数用于在性能和视觉质量之间进行权衡。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值