OpenGL专业名词解析
• OpenGL(英语:Open Graphics Library)是⼀个跨编程语⾔、跨平台的编程图形程序接⼝,它将计算机的资源抽象称为⼀个个OpenGL的对象,对这些资源的操作抽象为⼀个个的OpenGL指令
• OpenGLES(OpenGLforEmbeddedSystems)是OpenGL三维图形API的⼦集,针对⼿机、PDA和游戏主机等嵌⼊式设备⽽设计,去除了许多不必要和性能较低的API接⼝。
• DirectX是由很多API组成的,DirectX并不是⼀个单纯的图形API.最重要的是DirectX是属于 Windows上⼀个多媒体处理框架.并不⽀持Windows以外的平台,所以不是跨平台框架.按照性
• Metal:Metal:Apple为游戏开发者推出了新的平台技术Metal,该技术能够为3D图像提⾼10倍的渲染性能.Metal是Apple为了解决3D渲染⽽推出的框架
1.OpenGL状态机
状态机是理论上的一种机器。从本质上讲,我们现在的电脑就是典型的状态机。我们可以这样理解:· ·电脑的存储器(内存、硬盘等等),可以记住电脑自己当前的状态(当前安装在电脑中的软件、保存在电脑中的数据,其实都是二进制的值,都属于当前的状态)。
· 电脑的输入设备接收输入(键盘输入、鼠标输入、文件输入),根据输入的内容和自己的状态(主要指可以运行的程序代码),修改自己的状态(修改内存中的值),并且可以得到输出(将结果显示到屏幕)。
·当它进入某个特殊的状态(关机状态)的时候,它不再接收输入,停止工作。
状态机的特点:
它有记忆功能:能够记住自己当前的状态。
它可以接收输入:根据输入的内容和自己的状态,修改自己的状态,并且可以得到输出。
当它进入某个特殊的状态如停机状态的时候,它不再接收输入,停止工作.
2.OpenGL上下文(context)
· OpenGL本身就是一个非常庞大的状态机(State Machine) ,其状态通常被称为OpenGL上下文(Context)。它里面保存了一系列的变量用来描述OpenGL此刻需要如何运行,比如拍照时候要开启滤镜功能等等。
· OpenGL使用C语言编写的,进而他的Api的封装也都是面向过程的,其函数本质上都是对OpenGL上下文状态机中的某个状态或者对象进行操作。
· 应用程序中可以创建多个不同的上下文,他们分别在各自的线程中使用。上下文之间共享纹理,缓冲区等资源,采用这中方案更为高效,因为它避免了反复切换上下文,或者大量修改渲染状态所造成的较大的开销。
核心要点:
非常庞大的状态机(State Machine)
OpenGL使用C语言编写,Api的封装也都是面向过程的
函数本质上都是对OpenGL上下文状态机中的某个状态或者对象进行操作
创建多个不同的上下文,分别在各自的线程中使用,共享资源
3.渲染
图形/图像数据转换成2D空间图像操作。
4 .顶点数组[VertexArray]和顶点缓存区[VertexBuffer]
顶点数据就是图像的轮廓。OpenGL中的图像都是由图元组成。在OpenGL ES中,有3种类型的图元:点、线、三⻆形。
开发者选择设定函数指针,在调⽤用绘制⽅方法的时候,直接由内
传⼊入顶点数据,也就是说这部分数据之前是存储在内存当中的,被称为顶点数组。
性能更高的做法是,提前分配⼀块显存,将顶点数据预先传⼊到显存当中。这部分的显存,就被称为顶点缓冲区
顶点指的是我们在绘制⼀一个图形时,它的顶点位置数据.⽽而这个数据可以直接 存储在数组中或者将其缓存到GPU内存中
核心要点:
顶点数组的顶点数据是保存在内存中。
顶点缓存区的顶点数据是保存在GPU显存
3种类型的图元:点、线、三⻆形
5.管线
在OpenGL下渲染图形,就会经历⼀个⼀个的节点。而这样的操作可以理理解管线。就像一个流⽔线,任务按照先后顺序依次执行。管线是⼀个抽象的概念,之所以称之为管线是因为显卡在处理数据的时候是按照一个固定的顺序来的,严格按照这个顺序。
核心要点:
固定顺序
6.固定管线/存储着色器
在早期的OpenGL版本,封装了多种着色器程序块,内置了一段包含了光照、坐标变换、裁剪等诸多功能的固定shader程序来完成。来帮助开发者来完成图形的渲染。开发者只需要传入相应的参数,就能快速完成图形的渲染。类似于iOS开发会封装很多API,而我们只需要调⽤,就可以实现功能,不需要关注底层实现原理。但是由于OpenGL的使⽤场景⾮常丰富,固定管线或存储着⾊器⽆法完成每一 个业务,这时将相关部分开放成可编程。
核心要点:
固定管线: 指的是在渲染管线过程,使用的着色器都是存储着色器. 不可以进行自定义编程
存储着色器: 指的是 OpenGL 封装好的着色器
固定管线场景下,使用的是存储着色器
可编程管线场景下,使用的自定义着色器
7.着色器(Shader)
OpenGL一般使用经典的固定渲染管线来渲染对象,但是随着OpenGL技术的不断发展,固定管线技术也在不断改进,最终变成了当代的可编程管线技术。就是渲染管线的某些阶段可以通过编程来控制(提供了很大的灵活性),而着色器就是这些可编程的程序片段,用来替代原始管线的特定渲染阶段。
着色器是使用一种叫GLSL的类C语言写成的。GLSL是为图形计算量身定制的,它包含一些针对向量和矩阵操作的有用特性。着色器的开头总是要声明版本,接着是输入和输出变量、uniform和main函数。每个着色器的入口点都是main函数,在这个函数中我们处理所有的输入变量,并将结果输出到输出变量中。
核心要点:
GLSL的类C语言写成的,GLSL是为图形计算量身定制的
固定渲染管线变为了可编程管线技术
着色器的入口点都是main函数
8.顶点着色器(VertexShader)
一般用来处理图形每个顶点变换【旋转/平移/投影等】
顶点着色器是OpenGL中用于计算顶点属性的程序。顶点着色器是逐顶点运算的程序,也就是说每个顶点数据都会执行一次顶点着色器。当然这是并行,并且顶点着色器运算中无法访问其他顶点数据。
一般来说典型计算的顶点属性包括顶点坐标变换,逐顶点光照运算等。
顶点坐标由自身坐标系转换到归一话坐标系的运算。
核心要点:
一般用来处理图形每个顶点变换【旋转/平移/投影等】
逐点运算的程序,并行,运算中无法访问其他顶点数据。
9.片元着色器程序(FragmentShader)
一般用来处理图形中每个像素点颜色计算和填充
片段着色器是OpenGL中用于计算片段(像素)颜色的程序。片段着色器是逐像素运算的程序,也就是说每个像素都会执行一次片段着色器,当然也是并行。
核心要点:
一般处理图形每个像素点的颜色计算和填充
计算片段(像素)颜色的程序,每个像素都会执行一次片段着色器,且并行
10.GLSL (OpenGL Shading Language)
GLSL着色语⾔是⽤来在OpenGL中着⾊编程的语⾔,是在图形卡的GPU上执⾏的。代替了固定的渲染管线的⼀部分,使渲染管线中不同层次具有可编程性。⽐如:视图转换、投影转换等。GLSL(GL Shading Language)的着⾊器代码分成2个部分: Vertex Shader(顶点着⾊器)和Fragment(⽚断着⾊器)。
11.光栅化(Rasterization)
光栅化就是把顶点数据转换为片元的过程。具有将图转化为⼀个个栅格组成的图象 的作⽤,特点是每个元素对应帧缓冲区中的⼀像素。
光栅化其实是⼀种将⼏何图元变为二维图像的过程。该过程包含了两部分的⼯作。第⼀部分工作:决定窗⼝坐标中的哪些整型栅格区域被基本图元占⽤;第⼆部分⼯作:分配一个颜⾊值和⼀个深度值到各个区域。
把物体的数学描述以及与物体相关的颜色信息转换为屏幕上用于对应位置的像素及⽤于填充像素的颜⾊,这个过程称为光栅化。这是⼀个将模拟信号转化为离散信号的过程。
12. 纹理(Texture)
纹理可以理解为图⽚。 在渲染图形时需要在顶点围成的区域中填充图⽚,使得场景更加逼真。⽽这⾥使⽤的图⽚,就是常说的纹理。只是在OpenGL,我们更加习惯叫纹理,⽽不是图⽚。
13.混合(Blending)
在测试阶段之后,如果像素依然没有被剔除,那么像素的颜⾊将会和帧缓冲区中颜⾊附着上的颜色进⾏混合,混合的算法可以通过OpenGL的函数进行指定。但是OpenGL提供的混合算法有限。如果需要更加复杂的混合算法,一般可以通过片段着⾊器进⾏实现,当然性能会⽐原⽣的混合算法差⼀些。
14.变换矩阵(Transformation)
例如图形想发⽣平移、缩放、旋转等变换,就需要使用变换矩阵。
15.投影矩阵(Projection)
⽤于将3D坐标转换为⼆维屏幕坐标,实际线条也将在二维坐标下进行绘制。
16.渲染上屏/交换缓冲区(SwapBuffer)
渲染缓冲区⼀般映射的是系统的资源⽐如窗⼝。如果将图像直接渲染到窗口对应的渲染缓冲区,则可以将图像显示到屏幕上。
值得注意的是,如果每个窗⼝只有⼀个缓冲区,那么在绘制过程中屏幕进⾏了刷新,窗⼝可能显示出不完整的图像。
为了解决这个问题,常规的OpenGL程序⾄少都会有两个缓冲区。显示在屏幕上的称为屏幕缓冲区,没有显示的称为离屏缓冲区。在一个缓冲区渲染完成之后,通过将屏幕缓冲区和离屏缓冲区交换,实现图像在屏幕上显示。
由于显示器的刷新⼀般是逐⾏进⾏的,为了防⽌交换缓冲区的时候屏幕上下区域的图像分属于两个不同的帧,交换一般会等待显示器刷新完成的信号,在显示器器两次刷新的间隔中进⾏交换,这个信号就被称为垂直同步信号,这个技术被称为垂直同步。
使用了双缓冲区和垂直同步技术之后,由于总是要等待缓冲区交换之后再进⾏下⼀帧的渲染,使得帧率无法完全达到硬件允许的最⾼⽔平。为了解决这个问题,引⼊了三缓冲区技术。在等待垂直同步时,来回交替渲染两个离屏的缓冲区,⽽垂直同步发⽣生时,屏幕缓冲区和最近渲染完成的离屏缓冲区交换,实现充分利利⽤硬件性能的⽬的。
核心要点:
渲染缓冲区⼀般映射的是系统的资源
解决显示不完整图形而进行屏幕缓冲区和离屏缓冲区交换,实现图像在屏幕上显示。
为了防⽌交换缓冲区的时候屏幕上下区域的图像分属于两个不同的帧,交换一般会等待显示器刷新完成的信号两次刷新的间隔中进⾏交换,这个信号就被称为垂直同步信号,这个技术被称为垂直同步。
为了达到硬件允许的最⾼⽔平,引⼊了三缓冲区技术
在等待垂直同步时,来回交替渲染两个离屏的缓冲区,⽽垂直同步发⽣生时,屏幕缓冲区和最近渲染完成的离屏缓冲区交换,充分利用硬件性能。
网友评论