一、图形API框架简介
OpenGL
OpenGL (Open Graphics Library) 用于渲染2D、3D矢量图形的跨语言、跨平台的应用程序编程接口(API集合); 由近350个函数组成,用于绘制简单线条到复杂3D景象。依赖GPU硬件支持就。
跨平台:Windows、部分UNIX、Mac OS。
使用场景:CAD、虚拟现实、科学可视化程序、电子游戏开发。
OpenGL ES
OpenGL ES(OpenGL for Embedded Systems)是OpenGL 三维图形API的子集,针对手机、pad、游戏主机等嵌入式设备而设计,去除了很多不必要和性能较低的API接口。
Metal(Apple)
Metal:Apple为游戏开发者推出了新的平台技术,该技术能够为3D图像提高10倍的渲染性能,是苹果为了解决3D图形渲染而设计推出的框架。
DirectX(Windows)
DirectX:Windows上的一个多媒体处理框架,不是单纯的图形API,里面集成了 显示、声音、输入、网络四个部分,不支持Windows以外的其他系统。
二、OpenGL 专业名词
OpenGL Context\OpenGL状态机
OpenGL Context:OpenGL上下文。应用程序在调用OpenGL指令之前,OpenGL需要先创建一个上下文,这个上下文是一个庞大的状态机,保存了OpenGL渲染所需要的的各种信息,是OpenGL执行这种指令的基础。
OpenGL的函数不管在哪个语言中,都是类似C语言一样的面向过程函数,本质都是对OpenGL上下文中某个状态或者对象进行操作。因此可以将 OpenGL指令封装成面向对象的图形API。
由于OpenGL上下文是一个巨大的状态机,切换上下文往往会产生较大的开销。一个应用程序中可以创建多个不同的上下文。某些场景下我们需要创建多个上下文:比如不同的绘制模块可能需要独立的状态管理,或者在不同的线程技中需要使用不同的上下文。上下文之间可以共享纹理、缓冲区资源。
特点:
1、记忆功能,能记住其当前状态。
2、可以接收输入,根据输入的内容和原来的状态,修改当前状态,输出对应的结果。
3、当进入特殊状态(停机状态的时候),不再接收输入内容,停止工作。
图元
基本图形元素,在OpenGL ES中有3种类型图元:点、线、三角形。
顶点数组(VertexArray)和顶点缓冲区(VertexBuffer)
画图一般是先画好图像的骨架,然后再往骨架里面填充颜色,对于OpenGL也是一样的。顶点数据 就是要画的图像的骨架,和现实中不同的是,OpenGL中的图像都是有图元组成:点、线、三角形。
顶点数组:存放顶点数据的数组。原来存储在内存,GPU在调用绘制方法的时候,会访问内存进行顶点处理,然后将计算好的顶点数据放在顶点缓冲区(显存)。另一种提高性能的方法,提前分配一块显存,将定点数据预先传入到显存。这部分显存被称为顶点缓冲区。
管线
管线:在OpenGL下渲染图形,就会经历一个一个的节点,像流水线一样执行每个任务,任务与任务之间有先后顺序,这个流程被抽象为管线。之所以称之为管线,是因为显卡在处理数据的时候是按照一个固定顺序来的,要按照严格的顺序执行,不能被打破。
固定管线
在早起的OpenGL版本,它封装了很多种着色器程序块,内置的一段包含了光照、坐标转换、裁剪等等呢个诸多功能的固定shader程序来完成,帮助开发者完成图形的渲染,开发者仅需要传入相应的参数,就能快速完成图形的渲染。
由于OpenGL的使用场景非常丰富,固定管线或存储着色器无法完成每一个业务,这个时候将内置的一些API开放出来,可以自定义编程,将固定渲染管线架构变为了可编程渲染管线。
渲染
将图形图像数据转换成3D空间图像的过程叫做渲染(Rendering)。
着色器程序 shader
OpenGL在实际调⽤用绘制函数之前,还需要指定⼀个由shader编译成的着⾊器程序。常见的着⾊器器主要有顶点着⾊器(VertexShader),片段着⾊器(FragmentShader)/像素着⾊器(PixelShader)/片元着色器,⼏何着⾊器(GeometryShader),曲⾯细分着⾊器(TessellationShader)。⽚段着色器和像素着⾊器只是在OpenGL和DX中的不同叫法⽽已。可惜的是,直到OpenGLES 3.0,依然只⽀持了顶点着⾊器和⽚段着⾊器这两个最基础的着⾊器。
OpenGL在处理 shader时和其他编译器一样,通过编译-链接等步骤,生成着色器程序(glProgram)。着色器程序同时包含了顶点着色器和片元着色器的运算逻辑。在OpenGL进行绘制的时候,首先由顶点着色器传入对应的顶点数据进行运算;再通过图元装配,将顶点转化为图元;然后进行光栅化,将图元这种矢量图形转换为栅格数据(像素);最后将栅格化数据传入片元着色器中进行预算,片元着色器会对栅格化数据中的每一个像素进行运算,并决定像素的颜色。
顶点着色器 vertexShader
1、一般用来处理图形每个顶点变换【旋转、平移、投影等】。
2、顶点着色器是OpenGL中用于计算顶点属性的程序,对每个顶点逐个运算,每个顶点都要执行一次顶点着色器程序。这个过程是并行执行的,顶点着色器在执行预算的时候无法访问其他顶点数据。
3、一般来说经常需要就计算的顶点属性主要有坐标变化,逐顶点光照运算等。顶点坐标由自身坐标系到归一化坐标系的运算,就是在这里发生的。
片元着色器 fragmentShader
1、一般用来处理图形中每个像素点颜色计算和填充。
2、片元着色器是逐个像素点预算的程序,也就是说每个像素都会执行一次片元着色器,当然这个也是并行的。
GLSL(OpenGL Shading Language)
OpenGL着色语言是用来在OpenGL中着色编程的语言,也是开发人员写的短小的自定义程序,他们是在GPU(Graphic Processor Unit 图形处理单元)上执行的,代替了固定的渲染管线的一部分,是渲染固安县中不同层次具有可编程性。比如:视图转换、投影转换等。GLSL的着色器代码分成2个部分:VertexShader和FragmentShader。
光栅化
把顶点数据转换为片元的过程,具有将图转化为一个一个栅格图像的作用,每个元素对应帧缓冲区中的一个像素。
光栅化包含两部分工作。第一部分工作:决定窗口坐标中哪些整形栅格区域被基本图元占用;第二部分工作:分配一个颜色值和一个深度值到各个区域。光栅化结果生成的是片元。
把物体的数学描述及物体相关的颜色信息转化为屏幕上对应的像素及像素填充的颜色,是一个将模拟信号转换为离散信号的过程。
纹理
纹理(Texture)可以理解为图片。把它像贴纸一样贴在什么东西上面,让那个东西看起来像我们贴纸所要表现的东西那样。
纹理映射(Texture Mapping),又称纹理贴图,是将纹理空间中的纹理像素映射到屏幕空间中的像素的过程。简单来说,就是把一幅图像贴到三维物体的表面上来增强真实感,可以和光照计算、图像混合等技术结合起来形成许多非常漂亮的效果。
位图(Bitmap)与字符(Font)
位图(bitmap),亦称为点阵图像或栅格图像,是由称作像素(图片元素)的单个点组成的。这些点可以进行不同的排列和染色以构成图样。当放大位图时,可以看见赖以构成整个图像的无数单个方块。扩大位图尺寸的效果是增大单个像素,从而使线条和形状显得参差不齐。然而,如果从稍远的位置观看它,位图图像的颜色和形状又显得是连续的。用数码相机拍摄的照片、扫描仪扫描的图片以及计算机截屏图等都属于位图。位图的特点是可以表现色彩的变化和颜色的细微过渡,产生逼真的效果,缺点是在保存时需要记录每一个像素的位置和颜色值,占用较大的存储空间。
OpenGL中位图是由1和0组成的矩形数组,作为窗口中一个矩形区域的绘图掩码。 假设我们正在绘制一副位图,并且当前的光栅颜色是红色。在位图中为1的地方,帧缓冲区中的对应像素就用红色像素(或者根据实际生效的片段操作,与红色像素进行混合)代替。对于位图中为0的地方,就不会生成片段,像素的内容不受影响。位图的最常见用途就是在屏幕上绘制字符。
混合(Blending)
两个具有透明度的像素的叠加效果。混合需要用到混合算法,可以使用OpenGL提供的函数,也可以同构片元着色器自定义实现。
变换矩阵(Transformation)
表示图形平移、旋转、缩放的矩阵。
投影矩阵(Projection)
用于3D坐标转换为2D屏幕坐标,实际线条也是实在为二位屏幕下绘制。
参考资料:
博客:OpenGL 渲染上下文-context