视觉1-1、OpenGL专用名词理解

一、初识图形API

1、OpenGL(用于电脑平台)
OpenGL是用来渲染2D、3D矢量图形语言、跨平台的应用程序编程接口(API)。这个接口由350个左右的不同函数调用组成,常用于CAD、虚拟现实、科学可视化程序和电子游戏开发。

2、其他图形库
OpenGL ES(用于移动端、嵌入式设备):是OpenGL 三维图形 API 的子集,针对手机、pad、游戏主机、家电设备和汽车等嵌入式设备的跨平台API。

DirectX(用于windows端):属于Windows系统的一套多媒体处理库,并不支持其他平台。包含四大部分:显示部分、声⾳音部分、输⼊部分和网络部分。

Metal(苹果官方Api):Apple为游戏开发者推出了了新的平台技术Metal,该技术能够为3D 图像提⾼高10 倍的渲染性能.Metal 是Apple为了了解决3D渲染⽽而推出的框架

二、OPENGL专用名词
1、状态机
API有很多配置的状态,状态机就用于保存这些状态,并根据当前状态进行相应输出的机器。
要点:
记忆功能:保存当前状态
接收输入:根据输入修改当前状态,且有相应输出
停机状态:不再接收输入,且停止工作

2、OpenGL上下文(Context)
保存OpenGL中各种状态的庞大状态机,是OpenGL指令执行的基础,需要在调用指令之前创建。
要点:
context之间,共享纹理、缓冲区等资源:切换上下文会产生较大的开销。但是绘制不同模块,可能需要使用完全独立的状态管理,这样更加高效。
OpenGL的函数虽然是面向过程的,但可以把相关的调用封装为面向过程的图形API.

3、渲染(Rendering)
将图形/图像数据转换,将其显示绘制到屏幕上的操作

4、顶点数组和顶点缓冲区
顶点数据:图形/图像的轮廓,一般有三种图元状态(点、线、三角形)
顶点数组(VertextArray):顶点数据的数组,保存在内存中
顶点缓冲区(VertextBuffer):将顶点数据,从内存拷贝到CPU的显存中,更高效
png->位图:png/jpg都是压缩图片,纹理指的就是位图。假设png图片的大小是120120px位图的大小就是:120120 = 14400个像素点,通过RBGA(48位= 4个字节)对应,144004就是位图的大小。

5、管线
可以理解为工厂的整条流水线(肥皂->肥皂水->模具->肥皂块)
固定管线:对应非常多的现有模具(固定着色器),只需要修改模具即可。
可编程管线:可以自己更改模具

6、着色器(shader)
着色器也是代码段,只是函数/方法(代码段)是cpu来使用的,着色器(代码段)是gpu来使用的。
固定着色器(存储着色器):苹果提供api(代码块) ,调用参数来使用
自定义着色器:进行自定义(自己基于OPENGL 来)定义

7、顶点着色器和片元着色器
着色器还有几何着⾊(GeometryShader),曲⾯细分着⾊器(TessellationShader)。但是直到OpenGL ES 3.0,OpenGL ES依然只⽀持顶点着⾊器和片段着⾊器这两个最基础的着⾊器。
片元着色器:片元就是一个个的像素点,片元着色器用来处理一个个片元。(例如像素颜色的填充和混合计算,在GPU中并行运行)
顶点着色器:顶点可以理解为需要处理的一个个起始点和结束点,顶点着色器用来处理顶点间的运算。(例如旋转、平移、缩放、投影等)

WechatIMG4.jpeg

8、GLSL(OpenGL Shading Language)
GLSL着色语⾔是⽤来在OpenGL中着⾊编程的语⾔,在GPU上执行。着色器代码分为2部分:Vertex Shader(顶点着⾊器)和Fragment(⽚元着⾊器)。

9、光栅化
把顶点数据转化为片元的过程(具体可看着色器渲染过程图)
分为2部分工作:
1、决定窗口坐标中哪些栅格区域被基本图元占用
2、分配颜色值和深度值到各个区域

10、纹理(Texture)
纹理就是位图图片,只是在OpenGL,我们更加习惯叫纹理,⽽不是图⽚。

11、混合(Blending)
混合是指半透明图层颜色的叠加混合计算。一般在测试阶段之后,该需混合像素不会被剔除,像素的颜色会和帧缓冲区中附着上的颜色进行混合计算。

12、矩阵(线性代数的矩阵运算)
12.1、变换矩阵(Transformation)
用于图形想发⽣平移、缩放、旋转等变换,就需要使用变换矩阵。

12.2、投影矩阵(Projection)
用于3d坐标转换为2维屏幕坐标,实际线条也在二维坐标下绘制的

13.渲染上屏/交换缓冲区(SwapBuffer)
渲染缓冲区:可以理解为是系统的资源,例如窗口
渲染上屏:将图像直接渲染到窗口对应的渲染缓冲区

问题:如果每个窗口只有一个缓冲区,在绘制过程中刷新了屏幕,窗口可能显示不出完整的图像
OpenGL至少都会有两个缓冲区:防止出现绘制中屏幕刷新的问题
屏幕缓冲区:显示在屏幕上的
离屏缓冲区:没有显示的
在一个缓冲区渲染完成后,交换他们,将实际图像在屏幕上显示

问题:防止交换缓冲区时屏幕上下区域的图像分属于两个不同的帧
显示的刷新一般是逐行进行的,因此交换一般会等待显示器刷新完成的信号,在显示器两次刷新的间隔中进行交换
信号:垂直同步信号
技术:垂直同步技术

问题:使⽤用了了双缓冲区和垂直同步技术之后,由于总是要等待缓冲区交换之后再进行下一帧的渲染,使得帧率 无法完全达到硬件允许的最⾼⽔平
三缓冲区技术
在等待垂直同步时,来回交替渲染两个离屏的缓冲区
垂直同步发生时,屏幕缓冲区和最近渲染完成的离屏缓冲区交换

暂无评论