分割线:OpenGL3.0。
3.0之前,所有OpenGL版本都与早期版本完全向后兼容。针对OpenGL 1.1编写的代码可以在OpenGL 2.1实现中很好地执行。
3.0,引入了废弃functionality的想法。许多OpenGL函数被声明为已弃用,这意味着用户应避免使用它们,因为它们可能会从更高版本的API中删除。
3.1,OpenGL 3.1删除了OpenGL 3.0中几乎弃用的所有功能。这包括固定功能管道。
但是,由于许多实现仍然支持那些不推荐使用和已删除的功能,因此某些实现希望能够为更高GL版本的用户提供一种访问旧API的方式。尝试了几种技术,最终将其分为core和compatibility上下文。
具体说就是,引入了新的扩展名ARB_compatibility。此扩展的存在向用户发出信号,表明已弃用或删除的功能仍然可以通过原始入口点和枚举使用。此种实现的行为由单独的,更大的OpenGL规范定义。因此,存在一个向后兼容的规范和一个非向后兼容的规范。(此时并不存在profile:core&compatibility,只是有这么一个规范)
3.2,OpenGL被分为core和compatibility两种配置文件(profile)。核心只需要一种实现来定义,所以并不能保证可获得compatibility。但是大多数实现中,compatibility配置文件是可获得的。
3.2还引入了新的上下文创建机制,可以返回不同版本的上下文。
旧版OpenGL:在2008年,发布了OpenGL规范的3.0版。在此修订版中,固定函数管道以及大多数相关的OpenGL函数和常量已声明为弃用。这些不推荐使用的元素和概念现在通常称为旧式OpenGL。
以上参考:
与此相关的问题:
1.在GLAD中,为什么没有glBegin?
把core切换成compatibility即可。
2.glBegin在哪个版本被废弃?
3.为什么新版OpenGL的core模式强制使用VAO?而VBO和IBO不能直接渲染?
The compatibility OpenGL profile makes VAO object 0 a default object. The core OpenGL profile makes VAO object 0 not an object at all. So if VAO 0 is bound in the core profile, you should not call any function that modifies VAO state. This includes binding the `GL_ELEMENT_ARRAY_BUFFER` with glBindBuffer.
4.VAO出现在哪个版本?
3.0。可从API中查找函数glGenVertexArrays对应的版本号。
5.哪个版本强制使用了VAO?
3.2的core模式。
6.GLFW+GLAD,如何不使用VAO,而仅使用VBO和IBO进行渲染?
方法有二:
1)设置3.1及以前的版本。
2)设置3.2及以后的版本,并设置glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_COMPAT_PROFILE);向后兼容。
7.避免使用旧版OpenGL的原因。
参考:旧版OpenGL
8.自OpenGL 2.0以来的大多数硬件都缺少实际的固定功能硬件。而是使用系统构建的着色器模拟固定功能的过程。
参考:固定功能管道
9.固定渲染管线与立即渲染模式关系。
两者是一个东西。参考:核心模式与立即渲染模式
10.既然OpenGL 4.6 都出来了,为什么我们还要学习OpenGL 3.3?
所有OpenGL的更高的版本都是在3.3的基础上,引入了额外的功能,并没有改动核心架构。新版本只是引入了一些更有效率或更有用的方式去完成同样的功能。
11.立即模式(immediate mode) 与 保留模式(retained-mode)。
参考:
What does “immediate mode” mean in OpenGL?