OpenGL专业名词解析
OpenGL简介
- OpenGL(Open Graphics Library)是一个跨平台、跨编程语言的图形编程接口,它将计算机资源抽象为一个个OpenGL对象,并把对这些资源的操作抽象为一个个OpenGL指令
- OpenGL ES(OpenGL for Embedded Systems)是OpenGL的一个子集,针对手机、pad、游戏主机等嵌入式设备而设计,去除了许多不必要和性能较低的API接口
- Metal:Apple为游戏开发者推出的新的平台技术,该技术能为3D图像提高10倍的渲染性能。Metal是Apple为了解决3D渲染而推出的框架。
OpenGL名词解析
OpenGL 上下文(Context)
OpenGL在渲染的时候需要一个Context,这个Context记录了OpenGL渲染需要的所有信息,可以把它理解成一个大的结构体,它里面记录了当前绘制使用的颜色、是否有光照计算以及开启的光源等非常多我们使用OpenGL函数调用设置的状态和状态属性。
OpenGL状态机
状态机描述了一个对象在其生命周期内所经历的各种状态,状态间的转变,发生转变的动因,条件及转变中所执行的活动。或者说,状态机是一种行为,说明对象在其⽣命周期中响应事件所经历的状态序列以及对那些状态事件的响应。
因此具有以下特点:
- 有记忆功能,能记住其当前的状态
- 可以接收输⼊,根据输入的内容和⾃己的原先状态,修改⾃己当前状态,并且可以有对应输出
- 当进⼊特殊状态(停机状态)的时候,便不再接收输入,停⽌工作。
// 举例使用场景:
//清屏并设置背影颜色
glClearColor(0.0f,1.0f,1.0f,1.0f);
//开启某个功能
glEnable(GL_DEPTH_TEST);
渲染
将图像/图形数据转换成3D空间图形的操作。(也可以理解为绘制)
图元
OpenGL中的图像都是由图元组成。在OpenGLES中,有3种类型的图元:点、线、三⻆角形。在OpenGL中,基本图形元素如点、线、折线和多边形都是由一个或多个顶点所定义。
顶点
在计算机中图元的位置是通过x,y,z,w来存储或颜色数据是通过RGBA的数组格式存储的,然后通过多个点来进行图元装配和光栅化出图形.比如三角形3个点使用x,y,z表示如下:
GLfloat vertex[]={
0.0f,1.0f,1.0f, //x,y,z
1.0f,0.5f,1.0f,
0.0f,0.5f,1.0f
}
顶点数组(VertexArray)和顶点缓冲区(VertexBuffer)
画图时一般先画好骨架,然后再往骨架里填充颜色。这对OpenGL也是一样的。顶点数据就是要画的图形的骨架。
顶点数据在渲染前被存储在顶点数组(内存)中,每次绘制时从先从内存中加载这些数据,这样会带来绘制延时,因此我们想着在显存中开辟一块区域,在每次绘制间隔就将顶点数据加载过来,这样绘制时直接读取显存中的数据就可以了,明显提高渲染速度。这一块显存区域就是顶点缓冲区。
管线
可以理解为日常生活中的流水线:OpenGl每一步操作都是按照固定的顺序来的。就像⽔水从一根管⼦的一端流到另一端,这个顺序是不能打破的。
- 固定管线:也可以叫存储着色器。使用固定管线时,OpenGL不需要也不允许你自己去定义顶点渲染和像素渲染的具体逻辑,它内部已经固化了一套完整的渲染流程,只需要开发者在CPU代码端输入渲染所需要的参数并指定特定的开关,就能完成不同的渲染。
- 可编程管线:可编程管线的OpenGL必须由开发者自行实现渲染流程,否则无法绘制出最终的画面。开发者可以根据自己的具体需要来编写顶点渲染和像素渲染中的具体逻辑,可最大程度的简化渲染管线的逻辑以提高渲染效率,也可自己实现特定的算法和逻辑来渲染出固定管线无法渲染的效果。具有很高的可定制性,但同时也对开发者提出了更高的要求。(OpenGL 2.0及其以上的版本则为可编程渲染管线的版本)
简单理解就是:固定管线是一些封装好的可以直接传参数调用来实现渲染的,而可编程管线是需要开发者完全通过自定义来实现渲染。可编程管线并不是说管线中的每一步流程都可以自定义实现,直到OpenGLES 3.0,依然只支持顶点着⾊器和⽚源着⾊器这两个最基础的着⾊器这两步的自定义。
着色器程序 shader
shader就是一段由GPU去执行的代码。
OpenGL在实际调用绘制函数之前,需要指定⼀个由shader编译成的着⾊器程序。常见的着色器主要有顶点着⾊色器器(VertexShader),片源着色器 (FragmentShader),几何着⾊器 (GeometryShader),曲面细分着⾊器(TessellationShader)。直到 OpenGLES 3.0,依然只支持顶点着⾊器和⽚源着⾊器这两个最基础的着⾊器,所以,开发中,我们只会用到顶点着色器和片源着色器。
着⾊器程序”shader“同时包含了顶点着⾊器和⽚源着⾊器的运算逻辑。在OpenGL进行绘制的时候,⾸先由顶点着⾊器对传⼊的顶点数据进⾏运算。再通过图元装配,将顶点转换为图元。然后进⾏光栅化,将图元这种⽮量图形,转换为栅格化数据。最后,将栅格化数据传入⽚源着⾊器中进⾏运算。⽚源着⾊器会对栅格化数据中的每一个像素进行运算,并决定像素的颜⾊。
顶点着色器 和 片源着色器
- 顶点着色器:对图形顶点的变换处理(旋转、平移、投影、坐标变换、光照效果等等等等)
- 片源着色器:对图形中每个像素的计算与填充。
GLSL (OpenGL Shading Language)
OpenGL的着色语言,是用来着色编程的语言。即对顶点着色器和片源着色器的代码编写。
光栅化
在顶点着色器和片源着色器中间执行,将顶点数据转换为片源的过程,也就是先经过顶点处理,计算出每个顶点的坐标,颜色,纹理坐标等等,然后经过光栅化,获得每个像素的坐标,颜色等等……
纹理
纹理可以理解为图⽚。大家在渲染图形时需要在其编码填充图片,为了使得场景更加逼真。⽽这里使⽤的图片,就是常说的纹理。但是在OpenGL,我们更加习惯叫纹理,而不是图片。
混合
物体透明分成两种透明,一种是完全透明另一种是部分透明,完全透明的话会使颜色完全穿透,而部分透明使颜色穿透的同时也显示自身颜色。为了渲染出不同的透明度级别,我们需要开启混合(glEnable(GL_BLEND))。类似于如下效果:
变换矩阵(Transformation)
图形想发生平移,缩放,旋转变换.就需要使用变换矩阵
投影矩阵Projection
⽤于将3D坐标转换为二维屏幕坐标,实际线条也将在二维坐标下进⾏绘制
渲染上屏/交换缓冲区(swapBuffer)
- 渲染缓冲区:一般映射的是系统的资源比如窗⼝。如果将图像直接渲染到窗口对应的渲染缓冲区,则可以将图像显示到屏幕上。
但是,值得注意的是,如果每个窗口只有⼀个缓冲区,那么在绘制过程中屏幕进行了了刷新,窗⼝可能显示出不完整的图像 - 为了解决这个问题,常规的OpenGL程序至少都会有两个缓冲区。显示在屏幕上的称为屏幕缓冲区,没有显示的称为离屏缓冲区。在一个缓冲区渲染完成之后,通过将屏幕缓冲区和离屏缓冲区交换,实现图像在屏幕上的显示。
由于显示器的刷新一般是逐行进行的,因此为了防止交换缓冲区的时候屏幕上下区域的图像分属于两个不同的帧,因此交换一般会等待显示器刷新完成的信号,在显示器两次刷新的间隔中进行交换,这个信号就被称为垂直同步信号,这个技术被称为垂直同步。