经常听人提到OpenGL,实际开发中目前暂时没有涉猎,了解了下它的基本概念。
OpenGL是什么?
OpenGL是Khronos Group开发维护的一个规范,它主要为我们定义了用来操作图形和图片的一系列函数的API,需要注意的是OpenGL本身并非API。GPU的硬件开发商则需要提供满足OpenGL规范的实现,这些实现通常被称为“驱动”,它们负责将OpenGL定义的API命令翻译为GPU指令。
当然,如果硬件开发商的某款显卡无法在硬件上支持OpenGL所定义的所有功能,那么硬件开发商就必须通过软渲染的方式提供这种功能。综上,OpenGL并非一个能够直接安装的库或包,它只是一个规范。我们只需要安装显卡的驱动即可,因为显卡驱动中就包括了对OpenGL规范的实现。
另外OpenGL只是关注于怎么调用接口实现绘画。为了使用OpenGL,还得初始化一个OpenGL环境。这个环境需要AGL、WGL、GLX这些库里的接口来建立。这几个库分别对应苹果系统、Windows、还有Linux的X-Window,没有实现跨平台。这也是为什么存在glut(已经不更新了,代替者freeglut,不支持macOS)、glfw这些“半”跨平台的框架帮助你轻松地在各平台下使用OpenGL。在嵌入式设备上、手机还有浏览器里的OpenGL实现使用的是OpenGL ES的说明书。浏览器的WebGL是对OpenGL ES的js封装。建立环境用的是EGL库。
OpenGL专有名词了解下:
1.OpenGL Context
OpenGL Context,中文解释就是OpenGL的上下文。我们一般使用glut或glfw来创建窗口,然后在这个窗口中绘制。所以上下文的意思也就是OpenGL的作用范围,在这里可以先简单的理解为就是这个窗口。也就是说,如果我们要使用OpenGL,需要先为它创建一个窗口。当然OpenGL的Context不只是这个窗口,这个窗口我们可以理解为OpenGL的default framebuffer,所以Context还包含关于这个framebuffer的一些参数设置信息,具体内容可以查看OpenGL的Context的结构体。
OpenGL是通过面向过程的方式通过不同的功能函数实现的。函数内部的实现本质就是对context中的某个状态进行操作。
- 一个保存OpenGL中各种状态的庞大状态机
- 是OpenGL指令执行的基础,需要在调用指令之前创建
2.OpenGL状态机
特点:
- 它有记忆的能力,能够记住自己当前的状态。
- 它可以接收输入,根据输入的内容和自己的状态,修改自己的状态,并且可以得到输出。
- 当它进入某个特殊的状态(停机状态)的时候,它不再接收输入,停止工作。
3.顶点数组 VertexArray、顶点缓冲区 VertexBuffer
图像的显示由 点 线 三角形 三种 图元[基本图形元素] 组合而成。
基本图形元素是任何一个图形表达都是由若干不同的点、线、面图案或相同的图案循环组合而成的。这些点、线、面图案即为基本图形元素
图像的显示是由GPU根据图像的图元数据信息进行处理和渲染的。
其中顶点数组是在内存中存储顶点数据的数组。当图像需要显示的时候顶点数组中的数据会被GPU加载到缓存中进行渲染处理。此时顶点数据是被加载到顶点缓冲区中
- 【顶点数组】 存储在内存中
- 【顶点缓冲区】存储在GPU提前分配的显存中
4.管线
图像由基本的数据到最终显示为图像的 "流水线" 加工过程。
OpenGL主要是做图形图像处理的库,尤其是在移动设备上进行图形图像处理,它的性能优势更能体现出来。GLSL(OpenGL Shading Language)是OpenGL的着色器语言,开发人员利用这种语言编写程序运行在GPU(Graphic Processor Unit,图形图像处理单元,可以理解为是一种高并发的运算器)上以进行图像的处理和渲染。GLSL着色器代码分为两个部分,即Vertex Shader(顶点着色器)与Fragment Shade(片元着色器)两部分,分别完成各自在OpenGL渲染管线中的功能。
5.GLSL(OpenGL Shading Language)
- OpenGL中着色编程的语言
- 开发者可以使用该语言,自定义着色器
6.Vertex Shader(顶点着色器)
顶点着⾊器是OpenGL中⽤于计算顶点属性的程序。
⼀般来说典型的需要计算的顶点属性主要包括顶点坐标变换、逐顶点光照运算等等。顶点坐标由⾃身坐标系转换到归一化坐标系的运算,就是在这里发⽣的。
顶点着⾊器是逐顶点运算的程序,也就是说每个顶点数据都会执⾏一次顶点着⾊器。当然这是并行的,并且顶点着⾊器运算过程中⽆法访问其他顶点的数据。
核心要点:
- ⼀般⽤来处理理图形每个顶点变换(旋转/平移/投影等)。
- 并行计算,且运算过程中⽆法访问其他顶点的数据。
7.Fragment Shade(片元着色器)
⽚元着⾊器是OpenGL中⽤于计算⽚段(像素)颜⾊的程序。一般⽤来处理图形中每个像素点颜⾊计算和填充。
⽚元着⾊器是逐像素运算的程序,也就是说每个像素都会执⾏一次⽚元着⾊器,当然也是并⾏的。
核心要点:
- 一般⽤来处理图形中每个像素点颜⾊计算和填充。
- 并行计算,且运算过程中⽆法访问其他顶点的数据。
8.栅格化
在此将会分解成更小的单元并对应于帧缓冲区的各个像素。这些单元称为片元,一个片元可能包含窗口颜色、纹理坐标等属性。片元的属性是根据顶点坐标利用插值来确定的,这就是栅格化操作,也就是确认好每一个片元是什么。
9.纹理
纹理就是图片
10.矩阵
- 变换矩阵
图形发生平移、缩放、旋转等 - 投影矩阵
用于将3D坐标转换为2D坐标
11.渲染 Rendering
将图形数据通过管线绘制到屏幕上的操作就是渲染。如图渲染的流程。