OpenGL 是一个跨编程语言、跨平台的编程图形程序接口,它将计算机的资源抽象称为一个个OpenGL的对象,对这些资源的操作抽象为一个个OpenGL指令
OpenGL与OpenCV比较
OpenGL 主要用于渲染显示
OpenCV 主要图像识别,比如人脸识别,物体识别与人工智能相结合,第三方主流框架face++(收费)
OpenGL ES 是OpenGL三维图形API的子集,针对手机、PAD和游戏主机等嵌入式而设计,去除了许多不必要和性能较低的API接口
Metal Apple为游戏开发者推出的新的平台技术,该技术能够为3D图像提高10倍的渲染性能,是Apple为了解决3D渲染而推出的框架
Apple迁移到Metal的原因
图形API能解决的问题
context 上下文
在应⽤程序调用任何OpenGL的指令之前,需要安排首先创建⼀个OpenGL的上下文。这个上下文是一个⾮常庞大的状态机,保存了OpenGL中的各种状态,这也是OpenGL指令执⾏的基础
OpenGL的函数不管在哪个语言中,都是类似C语言⼀样的⾯向过程的函数,本质上都是对OpenGL上下文这个庞大的状态机中的某个状态或者对象进行操作,当然你得首先把这个对象设置为当前对象。因此,通过对OpenGL指令的封装,是可以将OpenGL的相关调用封装成为⼀个⾯面向对象的图形API的
由于OpenGL上下文是一个巨大的状态机,切换上下文往会产生较大的开销,但是不同的绘制模块,可能需要使用完全独立的状态管理。因此,可以在应用程序中分别创建多个不同的上下文,在不同线程中使⽤不同的上下文,上下文之间共享纹理、缓冲区等资源。这样的⽅方案,会⽐反复切换上下文,或者大量修改渲染状态,更加合理高效的.
渲染
将图片、视频、按钮等绘制到屏幕上的过程叫渲染
顶点数组和顶点缓冲区
在OpenGL ES中,有3种类型的图 元:点、线、三⻆角形
顶点指的是我们在绘制⼀个图形时,它的顶点位置数据.
将顶点数组存储在内存当中我们称为顶点数组,从GPU调度到内存中的顶点数组,会有性能问题,更高效的做法是将顶点数据预先传⼊入到显存当中。这部分的显存,就被称为顶点缓冲区
位图
png,jpeg是压缩图片,所有的压缩图片到计算机里有先解压成位图,假设一个png图片,它的像素点是120 * 120 = 14400个像素点 ,每一个像素点都是通过RGBA储储,14400*4个字节 就是位图的大小,位图比较大,通过位图存储和传输的话会非常占用资源,所有图片都需要先解压,然后还原成位图
管线(流水线)
在OpenGL 下渲染图形,就会有经历⼀个⼀个节点.而这样的操作可以理解管线.大家可以想象成流水线,每个任务类似流水线般执行.任务之间有先后顺序,之所以称之为管线是因为显卡在处理数据的时候是按照一个固定的顺序来的,而且严格按照这个顺序。就像水从⼀根管⼦的一端流到另⼀端,这个顺序是不能打破的
固定管线
系统封装好的,你使用别人的工厂生产东西,中间环节你需要知道也不用操心叫做固定管线,虽然生产的东西变不了,但是比如他提供了几种不同的颜色给你选择,这些可以被选择的颜色称为固定着色器。
可编程管线
自己创建工厂,细节自己写,使用GLSL语法来驱使GUP
着色器
先来思考什么是方法、函数?本质其实是一个代码段,由CPU执行
着色器(shader)本质也是一个代码段,由GPU执行
着色器的渲染流程
固定着色器
固定着色器是由openGL 提供的固定API方法
自定义着色器
自己基于GLSL语法进行编译的代码段
顶点着⾊器 VertexShader
⼀般用来处理图形每个顶点的位置和变换(旋转/平移/投影等)
片源着色器FragmentShader(像素着色器)
⼀般⽤来处理图形中每个像素点颜⾊计算和填充,假如有120*120个像素点,由GPU并行去计算,所以不算大
GLSL
进行自定义着色器时,驱动GPU使用Open GL, 使用 GLSL语言
光栅化Rasterization(不可编程,物理动作)
有两个过程
1.通过顶点数据,确定图形顶点之间有多少个像素点(确定图像的形状)
2.通过片源着色器,确定每一个像素点的颜色
纹理(本质就是位图)
纹理的格式:tga格式,在移动端要显示一张图片把png转化成位图,不需要转到tga格式
混合
在测试阶段之后,如果像素依然没有被剔除,那么像素的颜⾊将会和帧缓冲区中颜色附着上的颜⾊进⾏混合,混合的算法可以通过OpenGL的函数进行指定。但是OpenGL提供的混合算法是有限的,如果需要更加复杂的混合算法,⼀般可以通过像素着⾊器进⾏实现,当然性能会⽐原⽣的混合算法差⼀些
变换矩阵(Transformation)
例如图形想发⽣平移,缩放,旋转变换.就需要使用变换矩阵.
投影矩阵Projection
⽤于将3D坐标转换为二维屏幕坐标,实际线条也将在二维坐标下进⾏绘制
投影方式
摄像机坐标系
规范坐标系