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。
- 容易使用
- 灵活性差(隐藏过多细节)
- 效率低下
因此,在OpenGL3.2+的版本中,立即模式被弃用了。
2.2 核心模式的特点
- 难以学习(需要对图形编程有更好的理解)
- 灵活
- 更高效
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的工作流程:
- 创建对象——
glGenObject
。 - 以id的方式存储对象的reference——
glBindObject(GL_WINDOW_TARGET, objectId)
。 - 使用id,将对象绑定到context的目标位置``。
使用对象的好处:一个程序中,我们不止可以定义一个对象,并设置它们的选项,每个对象都可以是不同的设置。在我们执行一个使用OpenGL状态的操作的时候,只需要绑定含有需要的设置的对象即可。