OpenGL 是⼀一种图形应⽤用程序编程接⼝口(Application Programming Interface, API).简单理理解就是开发的 图形库
OpenGL 本领高强,涉猎极广,使用略麻烦
- 视频,图形,图⽚片处理理
- 2D/3D 游戏引擎开发
- 科学可视化
- 医学软件开发
- CAD(计算机辅助技术)
- 虚拟实境(AR,VR)
- AI ⼈人⼯工智能
那么一张图片显示出来,到底经过了什么一个过程?(这个过程就叫OPenGL的渲染管线:可以理解为流水线名称)
顶点数据 ------> 顶点着色器(vertex Shader) -----> 细分着色器 ----->
几何着色器 -----> 图元设置 -----> 剪切 ----->
光栅化 -----> 片元着色器 (Fragment Shader) -----> 显示效果
来看一下细节:
管线
- OpenGL 渲染管线: 一系列有序的处理阶段的序列,⽤于把我们应用中的数据转化到OpenGL 生成 一个最终的图像的一个过程。
- 管线 翻译白话:管线可以理解为流水线,按照固定的顺序进行一个一个执行不同的操作
- 图元: 组成图像的基本单元.OpenGL中的基本图元包括 点 , 线 ,三角形。
-固定管线:
- 主要针对的是着色器Shader,一个已经封装好的着色器,开发者使用时候,只要传入响应的参数,即可迅速完成渲染,类似系统中封装好的API,传入不同参数,实现不同渲染效果。
- 非固定管线/可编程管线/GLSL:
- GLSL: (OpenGL Shading Language) 专⻔为图形开发设计的编程语⾔(一般来说就是编写各个着色器,语法类似C、C++)
- 顶点数据:
顶点数组(VertexArray)、顶点缓冲区(VerTex Buffer)。
两者区别主要在于存储方式不同:
- 顶点数组(VertexArray)存储在内存中
- 顶点缓冲区(VerTex Buffer) 存储在GPU提前分配的显存中
着⾊器分类:
-顶点着⾊器(必要):
- 接收顶点数据,确定顶点位置
- 单独处理理每个顶点(现在并行):处理图像顶点的变换(旋转、平移、缩放)
- 3D图形数据 投影换算 2D图形数据
-细分着⾊器(可选) :
- 全称: 细分控制着⾊器 /细分计算着⾊器。主要是:对所有的图像进行修改⼏何图元类型或者放弃所有的凸缘
-⼏何着⾊器 (可选):
- 描述物体的形状,在管线中生成新的几何体处理(平顺)模型 ⽣成最终状态
-⽚元着⾊器 (必选):
- 片元:理解为屏幕中的像素点。
- 片元颜⾊以及深度值, 然后传递到⽚片元测试和混合 模块
-> 片元着色器主要用于处理一个个点像素点,例如像素颜色的计算和填充
-> 逐一像素且在GPU并行运行的程序,即每个像素都会执行一次。
- 目前OpenGL中可编程的仅有两个顶点:顶点着⾊器、⽚元着⾊器
-光栅化:
- 输⼊入图元的数学描述,转化为 与屏幕对应的位置像素⽚片元, 简称(光栅化)
- 顶点数据转换为片元
- 几何图元转换为二维图像
- 把物体的数学描述和相关颜色信息转换为屏幕上对应位置的像素和填充像素的颜色
- 将模拟信号转换为离散信号
- 这上一个不可编程的过程
作用:将图转化为一个个格栅组成的图像
特点:每个元素对应帧缓冲区中的一像素
执行的操作:
- 确定图像的像素范围
- 颜色附着:即分配一个颜色值和一个深度值到各个区域
-纹理
- 可以理解为图片:一个增加了不同图像的图片,比如地球表面的纹理;
- 添加纹理时候,渲染时候,可以使得场景更加逼真。
-混合(Blending)
- 简单理解就是:两个图像/图形相交处的颜色,这个颜色即是两个图像/图形颜色的混合。
-变换矩阵(Transformation)
- 图形平移、旋转、缩放时候使用变换矩阵
-投射矩阵(Projection)
- 将3D坐标转换为2D屏幕坐标的时候使用
-渲染上屏/交换缓冲区(Swap Buffer)
- 渲染缓冲区:可以理解为系统的资源。如:窗口
- 渲染上屏:将图像直接渲染到窗口对应的渲染缓冲区
面试点:如果每个窗口只有一个缓冲区,在绘制过程中刷新了屏幕,窗口可能显示不出完成的图像
-
常规OpenGL程序至少有两个缓冲区:
->屏幕缓冲区:用于显示在屏幕上。
->离屏缓冲区:没有显示在屏幕上。
触发离屏渲染:设置圆角 或设置图层蒙版、阴影 、光栅化
- 在一个缓冲区渲染完成后,将屏幕缓冲区和离屏缓冲区进行交换,实现图像在屏幕上的显示
面试点:防止交换缓冲区时屏幕上下区域的图像分别属于两个不同的帧
- 显示的刷新一般是逐行进行的,因此交换一般会等待显示器完成的信号,在显示器两次刷新的间隔中进行交换
->信号:垂直同步信号
->技术:垂直同步技术
面试点:使用了双缓冲区和垂直同步技术之后,由于总是要等缓冲区交换之后再进行下一帧的渲染,所以使得帧率无法完全达到硬件允许的最高水平
三区缓冲技术:
- 在等待垂直同步时,来回交替渲染两个离屏的缓冲区
- 垂直同步发生时,屏幕缓冲区和最近渲染完成的离屏缓冲区交换