1 关于OpenGL的理解

OpenGL本身不是一个API,而是一个规范

OpenGL是一个巨大的状态机(state machine),它是定义OpenGL现在该如何工作的变量的集合。

  • OpenGL的状态state通常指的是OpenGL的语境context,我们通过设置一些选项改变OpenGL的状态,以操作一些buffers并使用当前的context渲染。

2 核心模式(Core-profile)与立即模式(Immediate mode)

2.1 立即模式特点

Immediate mode也称作fixed function pipeline。

  1. 容易使用
  2. 灵活性差(隐藏过多细节)
  3. 效率低下

因此,在OpenGL3.2+的版本中,立即模式被弃用了。

2.2 核心模式的特点

  1. 难以学习(需要对图形编程有更好的理解)
  2. 灵活
  3. 更高效

3 扩展(Extensions)

非常有用和受欢迎的扩展未来可能会集成到OpenGL的更高版本中,在使用扩展的功能前,一般要确认扩展是否存在。

if(GL_ARB_extension_name){//使用扩展完成功能
}
else{//扩展不支持,使用传统方法完成功能
}

4 OpenGL中的对象(Object)

OpenGL中的对象是一些选项的集合,它代表OpenGL状态的一个子集。

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

实际使用的例子(OpenGL_Context是OpenGL上下文):

struct OpenGL_Context{...object_name* object_Window_Target;...
}
//create object
unsigned int objectId=0;
glGenObject(1,&objectId);
// bind/assign object to context
glBindObject(GL_WINDOW_TARGET, objectId);
// set options of the object bound to GL_WINDOW_TARGET
glSetObjectOption(GL_WINDOW_TARGET, GL_OPTION_WINDOW_WIDTH, 800);
glSetObjectOption(GL_WINDOW_TARGET, GL_OPTION_WINDOW_WIDTH, 600);
//set context target back to default
glBindObject(GL_WINDOW_TARGET,0);

上述代码展示了OpenGL的工作流程:

  1. 创建对象——glGenObject
  2. 以id的方式存储对象的reference——glBindObject(GL_WINDOW_TARGET, objectId)
  3. 使用id,将对象绑定到context的目标位置``。

使用对象的好处:一个程序中,我们不止可以定义一个对象,并设置它们的选项,每个对象都可以是不同的设置。在我们执行一个使用OpenGL状态的操作的时候,只需要绑定含有需要的设置的对象即可。