一、OpenGL是什么?
-
OpenGL本身并不是一个API(Application Programming Interface,应用程序编程接口),仅仅是一个由Khronos组织制定并维护的规范;
-
OpenGL规范严格规定了每个函数该如何执行,以及它们的输出值,至于函数内部是如何实现的,将由OpenGL库的开发者(通常为显卡生产商)自行决定;
-
由于OpenGL的大多数实现是由显卡厂商编写的,当产生一个bug时通常可以通过升级显卡驱动来解决。
二、核心模式与立即渲染模式
1、立即渲染模式(Immediate mode,也叫固定渲染管道)
-
早期OpenGL使用的模式;
-
OpenGL的大多数功能都被隐藏起来,容易理解和使用,但是效率太低;
-
从OpenGL3.2开始,推出核心模式
2、核心模式(Core-profile)
-
也叫可编程管线
-
提供了更多的灵活性,更高的效率,更重要的是可以更深入的理解图形编程
三、状态机(State Machine)
-
OpenGL自身是一个巨大的状态机,描述该如何操作的所有变量的大集合;
-
OpenGL的状态通常被称为上下文(Context);
-
状态设置函数(State-changing Function):将会改变上下文;
-
状态使用函数(State-using Function):根据当前OpenGL的状态执行一些操作;
-
通过改变一些上下文变量来改变OpenGL的状态,从而告诉OpenGL如何去绘图。
四、对象(Object)
一个对象是指一些选项的集合,代表OpenGL状态的一个子集;
例如:我们可以用一个对象来代表绘制窗口的设置:设置它的大小、支持的颜色位数等等,可以把对象看做一个C风格的结构体;
struct object_name {
GLfloat option1;
GLfloat option2;
GLchar[] name;
};
通常把OpenGL上下文比作一个大的结构体,包含很多子集:
//OpenGL的状态
struct OpenGL_Context {
...
object_name* object_name_target;
...
};
//创建对象
unsigned int objectId = 0;
//给对象objectId赋一个id
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);
//设置的选项将被保存在objectId所引用的对象中,一旦我们重新绑定这个对象到GL_WINDOW_TARGET位置,这些选项就会重新生效
使用对象的一个好处:在程序中,不止可以定义一个对象,并设置它们的选项,每个对象都可以是不同的设置,在执行一个使用OpenGL状态的操作的时候,只需要绑定含有需要设置的对象即可。
注:观看OpenGL中文官网(https://learnopengl-cn.github.io/)和阿西拜的现代OpenGL入门(https://ke.qq.com/course/3999604#term_id=104150693)学习OpenGL