文章只作学习使用,大部分内容来自LearnOpenGL CNOpenGL - LearnOpenGL CN (learnopengl-cn.github.io)https://learnopengl-cn.github.io/01%20Getting%20started/01%20OpenGL/
其中个人理解均为此颜色
目录
OpenGL是什么
OpenGL一般被‘认为是一个API(Application Programming Interface,应用程序编程接口),包含了一系列可以操作图形,图像的函数。但是实际上它是一个由Khronos制定并维护的规范。
OpenGL规范规定了每个函数该如何执行,以及它们的输出值。但是OpenGL规范并没有规定实现的细节,具体的OpenGL库允许使用不同的实现,只要其功能和结果与规范相匹配。所以函数的内部可以由编写OpenGL库的人自行决定。实际的OpenGL库的编写者通常是显卡的生产商。
所有版本的OpenGL规范文档都被公开的寄存在Khronos那里。
核心模式与立即渲染模式
早期的OpenGL使用立即渲染模式(Immediate mode,也就是固定渲染管线)。
//在固定渲染管线里面画一个三角形
glClear(GL_COLOR_BUFFER_BIT);
glBegin(GL_TRANGLES);
glVertex2f(-0.5f,-0.5f);
glVertex2f( 0.0f, 0.5f);
glVertex2f( 0.5f,-0.5f);
glEnd();
虽然在这个模式下画图很方便,但是由于开发者希望能有更多的灵活性,所以立即渲染模式逐渐被废弃,开发者们被鼓励到OpenGL的核心模式(Core-profile)下进行开发。
当使用OpenGL的核心模式时,OpenGL迫使我们使用现代的函数。现代函数要求使用者真正理解OpenGL和图形编程,提供了更多的灵活性,更高的效率,更重要的是可以更深入的理解图形编程。
扩展
OpenGL的一大特性就是支持扩展(Extension),当显卡公司提出新特性或者渲染上的大优化,通常会以扩展的方式在驱动中实现。如果程序在支持这个扩展的显卡上运行,开发者可以使用这个扩展提供的功能。通过这种方式,开发者不必等待一个新的OpenGL规范面世,就可以使用这些新的渲染特性了
if(GL_ARB_extension_name)
{
// 使用硬件支持的全新的现代特性
}
else
{
// 不支持此扩展: 用旧的方式去做
}
状态机
OpenGL自身是一个巨大的状态机(State Machine):一系列的变量描述OpenGL此刻该如何运行。OpenGL的状态通常被称为OpenGL上下文(Context)。我们通过设置选项,操作缓冲来更改OpenGL的状态。最后我们根据OpenGL上下文来渲染。
OpenGL内大致有两种函数:
状态设置函数(State-changing Function):改变上下文。
状态使用函数(State-using Function):根据当前OpenGL的状态执行一些操作。
对象
OpenGL库是用C语言写的,C的一些语言结构不易被翻译到其它的高级语言,因此OpenGL开发时引入了一些抽象层,例如“*对象(object)”。
在OpenGL中一个对象是指一些选项的集合,代表了OpenGL状态的一个子集,可以把对象看做一个C风格的结构体。
*对象就是一块缓冲区,缓冲区里储存了我们对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保存了它的引用。*然后我们将对象绑定在了上下文的目标位置上,现在我们对这个目标的操作,都会保存在objectId所引用的对象内部。最后我们将目标位置的对象id设回0,解绑这个对象。一旦我们重新绑定这个对象到GL_WINDOW_TARGET位置,这些选项就会重新生效。
*因为OpenGL的状态是由多个变量控制的,我们的对象不能一下子操作所有的变量,但是可以指定某些变量给他操作,我们给他的变量就是所谓的目标位置
使用对象的一个好处是在程序中,我们不止可以定义一个对象,并设置它们的选项,每个对象都可以是不同的设置。在我们执行一个使用OpenGL状态的操作的时候,只需要绑定含有需要的设置的对象即可。