大纲
推荐书籍
图形API简介
图形API解决哪些问题?
OpenGL 中的专业名词解析(简述)
OpenGL坐标系解析(简述)
图形/图片从文件渲染到屏幕过程解析(简述)
推荐书籍
业内红宝书:《OpenGL编程指南》、蓝宝书:《OpenGL超级宝典》
图形API简介
OpenGL: 跨编程、跨平台的编程图形程序接口、将计算机的资源抽象成为一个个OpenGL的对象,对这些资源的操作抽象为一个个OpenGL指令,一般用于PC端、MAC端开发
OpenGL ES:一般用于移动端(Android、iOS、黑莓等)、游戏主机、嵌入式设备等而设计的,是OpenGL三维图形API的子集,去除了需要不必要的性能较低的API接口
OpenCV:做识别,身份证、人脸、物体等,一般和人工智能结合运用,第三方代表:face++
DirectX:只用于PC端,不是单纯的图形API,是Windows上的一个多媒体处理框架,按照性质分类,可分四大类:显示部分、声音部分、输入部分、网络部分
Metal:类似opengl es,是Apple为了解决3D渲染而推出的框架
核心动画CoreGraphics、CoreAnimation、CoreImage,在2018年之前,最终都是通过OpenGL ES API来驱动GPU进行渲染绘制显示,2018年及之后,是通过OpenGL Metal
图形API解决什么问题?
- 系统针对按钮、图片、视图、图层渲染问题
- 游戏引擎,人物/场景渲染(图形APi)
- 核心动画,旋转、缩放、平移、图层特效
- 视频硬/软解码渲染显示(图形API)
- 视频/图片特效(图形APi)
- 解决离屏渲染
OpenGL 中的专业名词解析
上下文(context):上下文就是巨大的状态机,面向过程的,保存了OpenGL中的各种状态,记录修改,例如:记录glColor颜色修改、记录glPointSize点大小等
渲染:图片/按钮/视频等绘制显示到屏幕的过程
顶点数组:图片显示的位置,顶点数据都存放在顶点数组里,存放在内存中,顶点数据会传给顶点着色器
顶点缓存区:为了更高效的渲染绘制,顶点数据存放在显示器处理器缓存区,也就是我们常说的GPU显存
位图:就是纹理,就是解码之后的图片数据,位图的大小:像素宽x像素高xRGBA,例如120x120的位图,大小是120x120x4=57600字节
RGBA:一个颜色占一个字节,所以RGBA占4个字节
管线:类似生产流水线
固定管线:顾名思义,固定的,从视觉(OpenGL)角度来解释的话,就是调用系统封装好的固定API,无法自定义,一切都是封装好的,只管用就可以,类似固定着色器(存储着色器)
可编程管线:顾名思义,就是可以自定义的,从视觉(OpenGL)角度来解释的话,就是在顶点着色器和片元着色器这里的时候,可以自定义,用GLSL(着色器语言)来自定义实现绘制渲染
着色器:shader(着色器)图形API,类似函数、方法,通过调用,实现不同的图形构造(GPU)
固定着色器:Apple提供API,只需要调用传参数即可,无法自定义
自定义着色器:可以自定义,基于GLSL(着色器语言)有且只能自定义顶点着色器和片元着色器(像素着色器)
顶点着色器:用来处理顶点相关代码,1、位置、2、平移、旋转、缩放等位置换算 3、手机屏幕显示3D(手机屏幕实际2D,3D图形数据->2D投影换算)
片元着色器:也叫像素着色器,处理一个一个像素点,GPU并行计算
CPU的并行,实际上只是CPU快速的一个一个线程的调度而已,GPU才是真正的并行计算
图片的饱和度调整,也是片元着色器一个一个像素点的修改
GLSL:自定义着色器语言
关栅化:不可自定义,2个过程,1、确定像素范围,2、颜色附着到像素点上去
纹理:也叫位图,解压过后的图片,png/jpeg都是压缩过的图片,因为位图比较大,在网络上传输比较消耗流量,数据也比较大,所以需要压缩一下,在最终显示的时候,需要解压缩,拿到真正的数据绘制渲染显示
混合:2个图层叠加,混合行为,会出发离屏渲染
变换矩阵:根据观察者视角、物体的变化(平移、缩放、旋转等)投影方式,就需要使用变换矩阵
投影矩阵:将3D坐标转换为2D屏幕坐标,实际线条也将在2D坐标下进行绘制,投影方式有2种:
1、正投影:显示2D效果,图片绘制不管远近,1:1进行绘制
2、透视投影:远小近大的效果,3D效果
物体坐标:物体自身坐标系
OpenGL 坐标系
- 2D笛卡尔坐标系:坐标是由x、y决定的,如图:
- 3D笛卡尔坐标系:,坐标是由x、y、z决定的,该图显示的是右手坐标系,如图:
-
视口:
观察者视角约近,看到的视口越小,反之,看到的视口越大,视口可以简单理解为物体显示的区域范围,在这个范围内的物体,才能被看到
以上图标引用了另一位优秀的博主:收纳箱
glViewport(GLint x,GLint y,GLsizei width,GLsizei height)
OpenGL ES坐标系统包括:视窗坐标、规范坐标(规格化设备坐标)、裁剪坐标、视觉坐标、世界坐标、物体自身坐标(对象坐标)
在世界、物体、照相机空间是右手坐标系
在规范化设备坐标系用的是左手坐标系
视窗坐标系
- 视窗坐标也就是我们手机窗口对应的坐标系统,以左上角为原点
规格化设备坐标系
- 是左手坐标系,原点坐标为(0,0,0),也就是这个立方体的中心,而它左上角离我们最近的那个顶点的坐标就是(1,1,1),右下角离我们最远的那个顶点的坐标就是(-1,-1,-1),如图: