核心模式和立即渲染模式
早期的OpenGL使用立即渲染模式(Immediate mode,也就是固定渲染管线),这个模式下绘制图形很方便。OpenGL的大多数功能都被库隐藏起来,开发者很少有控制OpenGL如何进行计算的自由。而开发者迫切希望能有更多的灵活性。随着时间推移,规范越来越灵活,开发者对绘图细节有了更多的掌控。立即渲染模式确实容易使用和理解,但是效率太低。因此从OpenGL3.2开始,规范文档开始废弃立即渲染模式,并鼓励开发者在OpenGL的核心模式(Core-profile)下进行开发,这个分支的规范完全移除了旧的特性。
核心模式(Core Profile)与立即渲染模式(Immediate Mode)的区别
| 特性 | 核心模式 (Core Profile) | 立即渲染模式 (Immediate Mode) |
|---|---|---|
| 编程模型 | 面向数据(Data-Oriented):先准备数据,后发送指令。 | 面向过程(Procedural):一边发送数据,一边发送指令。 |
| 性能 | 极高。 数据预处理和批处理能力强。 | 极低。 每次调用都会导致大量的 CPU/GPU 通信。 |
| 数据组织 | 数据必须存储在 VBO/VAO (显存对象)中。 | 顶点数据在每次绘制时通过 CPU 即时发送。 |
| 状态管理 | 使用 可编程渲染管线(Programmable Pipeline),所有状态(变换、光照、材质)由 Shader 控制。 | 使用 固定功能渲染管线(Fixed-Function Pipeline),通过 glMatrixMode()、glLight() 等 API 调用设置状态。 |
| 兼容性 | 现代标准。移除所有旧 API,是主流 GPU 架构和驱动程序的原生模式。 | 已弃用。在 OpenGL 3.1+ 版本中被移除,不支持现代 GPU 功能。 |
| 主要 API | glGenBuffers(), glBufferData(), glVertexAttribPointer(), Shader。 | glBegin(), glVertex(), glEnd()。 |
核心模式 (Core Profile)
这是 OpenGL 的现代模式(OpenGL 3.1+ 引入,当前主流)。它彻底放弃了易用性优先的旧思想,转而拥抱高性能。
- 工作方式:
- 数据准备: 将所有顶点、颜色、法线等数据打包,一次性上传到 GPU 内存中的 VBO(顶点缓冲对象) 和 VAO(顶点数组对象)。
- 可编程管线(Shader): 开发者使用 GLSL(OpenGL Shading Language)编写 着色器(Shaders)。着色器是运行在 GPU 上的小程序,它定义了顶点如何变换(如旋转、投影)以及像素如何着色(如光照计算、纹理采样)。
- 批量绘制: 只需调用一次
glDrawArrays()或glDrawElements(),GPU 就可以访问它自己的内存中的数据,并行地绘制成千上万的顶点。这大大减少了 CPU 的工作量。
- 高性能优势: 通过将数据和渲染逻辑(Shader)推向 GPU,核心模式极大地减少了 Draw Call 的数量和驱动程序的负担,从而释放了 CPU 资源,并充分发挥了现代 GPU 的并行处理能力。