二、如何理解OpenGL

Posted by 卢小胖 on 2023-09-15
Estimated Reading Time 4 Minutes
Words 1.4k In Total
Viewed Times

OpenGL是什么

  • OpenGL是一个图像API,是一套接口,并不是一个独立的平台
  • 硬件层面和驱动层面需要支持OpenGL,才能使用OpenGL API,目前大部分图形设备都支持OpenGL,所以其应用层面才非常广
  • OpenGL的Open指的是接口是开放的,而具体实现的库一般都是不公开的。

显卡驱动和OpenGL的关系:OpenGL每隔一段时间发布新的API,显卡厂商需要在驱动中支持其新的API,它们负责将OpenGL定义的API命令翻译为GPU指令。如果硬件开发商的某款显卡无法在硬件上支持OpenGL所定义的所有功能,那么硬件开发商就必须通过软渲染的方式提供这种功能。

操作OpenGL API相当于直接操作显卡驱动API,可以利用这套API来操作屏幕上的每一个像素点的排列组合,颜色,深度等等来实现各种各样的图形图像。他的效率是非常高的。

参考:

核心模式与立即渲染模式

早期的OpenGL使用立即渲染模式(Immediate mode,也就是固定渲染管线),这个模式下绘制图形很方便。OpenGL的大多数功能都被库隐藏起来,开发者很少有控制OpenGL如何进行计算的自由。而开发者迫切希望能有更多的灵活性。随着时间推移,规范越来越灵活,开发者对绘图细节有了更多的掌控。立即渲染模式确实容易使用和理解,但是效率太低。因此从OpenGL3.2开始,规范文档开始废弃立即渲染模式,并鼓励开发者在OpenGL的核心模式(Core-profile)下进行开发,这个分支的规范完全移除了旧的特性。

当使用OpenGL的核心模式时,OpenGL迫使我们使用现代的函数。当我们试图使用一个已废弃的函数时,OpenGL会抛出一个错误并终止绘图。现代函数的优势是更高的灵活性和效率,然而也更难于学习。立即渲染模式从OpenGL实际运作中抽象掉了很多细节,因此它在易于学习的同时,也很难让人去把握OpenGL具体是如何运作的。现代函数要求使用者真正理解OpenGL和图形编程,它有一些难度,然而提供了更多的灵活性,更高的效率,更重要的是可以更深入的理解图形编程。

以上内容是摘抄自LearnOpenGL,基本大部分博客都是这么说的,我们总结一下就是

核心模式是在OpenGL3.2之后推出的,完全废弃了之前的立即渲染模式,使得开发更加现代化。

OpenGL 核心模式在以下几个方面有所改进:

  1. 去除了旧的固定函数(Fixed-Function)渲染管线,所有的渲染过程都需要开发者手动编写 Shader 来实现。
  2. 去除了一些过时的渲染功能和状态,使得 OpenGL 更加轻量级和高效。
  3. 强制使用 VAO(Vertex Array Object)来管理顶点数据,使得 OpenGL 渲染更加规范和易于维护。
  4. 强制使用 VBO(Vertex Buffer Object)来管理顶点缓存数据,提高了内存使用效率。

另外:LearnOpenGL教程都是基于3.3版本,为什么不使用更新的版本?

  • 所有OpenGL的更高的版本都是在3.3的基础上,引入了额外的功能,并没有改动核心架构。新版本只是引入了一些更有效率或更有用的方式去完成同样的功能。因此,所有的概念和技术在现代OpenGL版本里都保持一致。当你的经验足够,你可以轻松使用来自更高版本OpenGL的新特性。

上面提到了固定渲染管线, 其实还有可编程渲染管线,其两者区别可以简单理解为:

  • 固定管线其实就是把渲染的过程,光照过程都封装到了opengl里边了,代码执行流程都写死了,比如光照 漫反射 环境光 高光计算都写死到了opengl里,你不能改变渲染流程,只能改变各种参数,标记。甚至雾效处理也内置好了,都是调用API调整参数来调整效果。
  • opengl1.5开始的可编程管线就是就是加入了shader脚本语言,很多流程不内置,包括光照处理都让你在外部自己写。我提供脚本编译框架在opengl底层,并且在特定流程里去调用你自己的光照脚本。这样你可以自己控制写什么样的光照模型,甚至更复杂的pbr物理渲染模型等。

可编程渲染管线相比固定渲染管线,开发难度是提高的,因为需要手动实现部分渲染功能,自定义参数。但是在功能性上是增强了,可以自定义功能。

参考: