OpenGL的扩展,状态机与对象

  • 扩展

        OpenGL的一大特性就是对扩展(Extension)的支持,当一个显卡公司提出一个新特性或者渲染 上的大优化,通常会以扩展的方式在驱动中实现。如果一个程序在支持这个扩展的显卡上运行, 开发者可以使用这个扩展提供的一些更先进更有效的图形功能。通过这种方式,开发者不必等待 一个新的OpenGL规范面世,就可以使用这些新的渲染特性了,只需要简单地检查一下显卡是否 支持此扩展。通常,当一个扩展非常流行或者非常有用的时候,它将最终成为未来的OpenGL规 范的一部分。 使用扩展的代码大多看上去如下:

if(GL_ARB_extension_name)

{ // 使用硬件支持的全新的现代特性

} else {

// } 不支持此扩展: 用旧的方式去做 使用OpenGL3.3时,我们很少需要使用扩展来完成大多数功能。

  • 状态机

       OpenGL自身是一个巨大的状态机(State Machine):一系列的变量描述OpenGL此刻应当如何 运行。OpenGL的状态通常被称为OpenGL上下文(Context)。我们通常使用如下途径去更改 OpenGL状态:设置选项,操作缓冲。最后,我们使用当前OpenGL上下文来渲染。

        假设当我们想告诉OpenGL去画线段而不是三角形的时候,我们通过改变一些上下文变量来改变 OpenGL状态,从而告诉OpenGL如何去绘图。一旦我们改变了OpenGL的状态为绘制线段,下 一个绘制命令就会画出线段而不是三角形。 当使用OpenGL的时候,我们会遇到一些状态设置函数(State-changing Function),这类函数 将会改变上下文。以及状态使用函数(State-using Function),这类函数会根据当前OpenGL的 状态执行一些操作。OpenGL本质上是个大状态机,就能更容易理解它的大部分特性。

  • 对象

        OpenGL库是用C语言写的,同时也支持多种语言的派生,但其内核仍是一个C库。由于C的一些 语言结构不易被翻译到其它的高级语言,因此OpenGL开发的时候引入了一些抽象层。“对象 (Object)”就是其中一个。 在OpenGL中一个对象是指一些选项的集合,它代表OpenGL状态的一个子集。比如,我们可以 用一个对象来代表绘图窗口的设置,之后我们就可以设置它的大小、支持的颜色位数等等。可以 把对象看做一个C风格的结构体(Struct):

struct object_name {
    float  option1;
    int    option2;
    char[] name;
 };

当我们使用一个对象时,通常看起来像如下一样(把OpenGL上下文看作一个大的结构体):

// OpenGL的状态
struct OpenGL_Context {
    ...
    object* object_Window_Target;
    ...     
};
// 创建对象
unsigned int objectId = 0;
 glGenObject(1, &objectId);
 // 绑定对象至上下文
 glBindObject(GL_WINDOW_TARGET, objectId);
 // 设置当前绑定到 GL_WINDOW_TARGET 的对象的一些选项
glSetObjectOption(GL_WINDOW_TARGET, GL_OPTION_WINDOW_WIDTH, 800);
 glSetObjectOption(GL_WINDOW_TARGET, GL_OPTION_WINDOW_HEIGHT, 600);
 // 将上下文对象设回默认
glBindObject(GL_WINDOW_TARGET, 0);

        这一小段代码展现了你以后使用OpenGL时常见的工作流。我们首先创建一个对象,然后用一个 id保存它的引用(实际数据被储存在后台)。然后我们将对象绑定至上下文的目标位置(例子中 窗口对象目标的位置被定义成GL_WINDOW_TARGET)。接下来我们设置窗口的选项。最后我们 将目标位置的对象id设回0,解绑这个对象。设置的选项将被保存在objectId所引用的对象 中,一旦我们重新绑定这个对象到GL_WINDOW_TARGET位置,这些选项就会重新生效。

        使用对象的一个好处是在程序中,我们不止可以定义一个对象,并设置它们的选项,每个对象都 可以是不同的设置。在我们执行一个使用OpenGL状态的操作的时候,只需要绑定含有需要的设 置的对象即可。比如说我们有一些作为3D模型数据(一栋房子或一个人物)的容器对象,在我 们想绘制其中任何一个模型的时候,只需绑定一个包含对应模型数据的对象就可以了(当然,我 们需要先创建并设置对象的选项)。拥有数个这样的对象允许我们指定多个模型,在想画其中任 何一个的时候,直接将对应的对象绑定上去,便不需要再重复设置选项了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值