下面是个人学习的总结:
知识点:
1,Opengl 它是包含了一系列的 图形 、 图像的函数 并不是一个api 紧紧是由 khronos 组织 制定并维护 规范
2,规范 主要是 制定: 函数是如何执行 以及 函数的输出值
题外话: 至于内部每个函数的的具体实现 由opengl 库的开发者决定,OpenGL 的开发者 一般都是 显卡的生产商提供 也有一些爱好者改编的版本
3,
1) OpenGL 3.2 之前 都是 立即渲染模式 (固定渲染管线)
2) OpenGL 3.3 之后 包括 3.3 使用的是 核心渲染模式 后期一直都是再3.3 基础之上进行扩展
立即渲染模式 与 核心渲染模式 优缺点
1, 3.2 之前 容易理解 使用简单 但是大多数功能都被隐藏了,很少能控制OpenGL的计算自由,灵活性差 效率低
2,3.3之后 使用了现代函数,灵活性高了 效率高了 但是学习更难了,需要去理解 OpenGL和图形编程,可以让人更深入的理解图形编程,后续更高版本 都是在 3.3 基础上进行扩展的 3.3 的规范完全移除了旧的特效
4,扩展 如果出来了 新的特性或 渲染上的大优化。 可以不必等待新的 OpenGL规范面试,我们就可以直接使用新的渲染特性
if(GL_ARB_extension_name)
{
// 使用硬件支持的全新的现代特性
}
else
{
// 不支持此扩展: 用旧的方式去做
}
5,状态机: OpenGL 是一个 巨大的状态机, 可以通过一系列变量来描述 OpenGL 此刻应该如何运行
OpenGL 的状态 被称为 OpenGL 的上下文 context 通过改变 context 的变量 来修改渲染
6,OpenGL 的内核 是一个 C库
由于C库的一些特性 很难被翻译到其他的高级语言 所以 引入了一些抽象层 比如 对象Object
对象包含了一些 选项的集合,它是一个 OpenGL 状态的子集 可以给这个对象设置 大小 颜色等等
struct object_name {
float option1;
int option2;
char[] name;
};
一个对象例子
// 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);
当我们需要操作绘制的时候,只需要设置 对象变量即可
当我们需要绘制某个对象的时候,只需要绑定 一个包含 对应模型数据的对象就可以了