核心模式与立即渲染模式
早起的OpenGL使用立即渲染模式(Immediate mode,即固定渲染管线):OpenGL的大多数功能都被库隐藏起来,开发者很少能控制OpenGL如何进行计算的自由,渲染模式容易使用喝理解,但是效率太低,从OpenGL3.2开始,规范文档开始废弃立即渲染模式,并鼓励开发者在OpenGL的核心模式(Core-profile)下进行开发,这个分支的规范完全移除了旧的特性。
当使用OpenGL的核心模式时,OpenGL迫使我们使用现代的函数,现代函数具有更高的灵活性和效率性,让人更容易理解OpenGL是如何运作的,深入理解图形编程。(OpenGL3.3-OpenGL4.5)
扩展
OpenGL的一大特性就是对扩展(Extension)的支持, 当一个显卡公司提出一个 新特性或者渲染上的大优化,通常会以扩展的方式在驱动中实现。如果一个程序在支持这个扩展的显卡上运行,开发者可以使用这个扩展提供的一些更先进更有效的图形功能,而不需要等待一个新的OpenGL规范面世,只需要简单检查一下显卡是否支持此扩展。扩展可能发展为未来的OpenGL规范一部分,用来提供给未来的显卡开发商。
if(GL_ARB_extension_name)
{
}
else
{
}
状态机(State Machine)
一系列的变量描述OpenGL此刻应当如何运行,OpenGL的状态通常被称为OpenGL的上下文(Context),更改OpenGL状态:设置选项,操作缓冲。最后,使用当前OpenGL上下文来渲染。
使用OpenGL的时候,我们会遇到一些状态设置函数(State-changing Function),改变上下文;状态使用函数(State-using Function),根据当前状态执行一些操作。
对象(OpenGL引入的抽象层)
在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);
glBindObjectOption(GL_WINDOW_TARGET, objectId);
glSetObjectOption(GL_WINDOW_TARGET, GL_OPTION_WINDOW_WIDTH, 800);
glSetObjectOption(GL-WINDOW_TARGET, GL_OPTION_WINDOW_HEIGHT, 600);
geBindObject(GL_WINDOW_TARGET, 0);
解析:首先创建对象,然后用一个id保存他的引用(实际数据被存储在后台),然后我们将对象绑定至上下文的目标位置(如:GL_WINDOW_TARGET),接下来我们设置窗口的选项,最后我们将目标位置的对象id设置回0,解绑这个对象,上下文该位置不再绑定该id对象,而设置的选项将会被保存在objectId所引用的对象中,相当于我们设置好了参数然后就把它存储起来了。一旦我们重新绑定这个对象到GL_WINDOW_TARGET位置,这些选项就会生效。
// 这些对象中的变量来自哪里还是一个问题。