OpenGL简介
OpenGL(Open Graphics Library)译名为开放图形库,是用于渲染2D、3D矢量图形的跨语言、跨平台的应用程序编程接口(API)。这个接口由近350个不同的函数调用组成,用来从简单的图形比特绘制复杂的三维景象。
OpenGL名词解释
一、OpenGL 状态机
状态机描述了一个对象在其生命周期内所经历的各种状态,状态间的转变,发生转变的动因,条件及转变中所执⾏的活动。或者说,状态机是一种行为,说明对象在其生命周期中响应事件所经历的状态序列以及对那些状态事件的响应。因此具有以下特点:
1.有记忆功能,能记住其当前的状态;
2.可以接收输入,根据输入的内容和自己的原先状态,修改自己当前状态,并且可以有对应输出;
3.当进入特殊状态(停机状态)的时候,便不再接收输入,停止工作;
- 【例子】就像是运动员在场上奔跑时接收到了队友的传球时,他会根据自己当前的位置(记忆功能)以及足球过来的角度和力量(接收输入),做出相应动作的调整(修改自己的状态),然后接到球(得到输出)。最后当比赛结束或其他原因至运动员下场了便不再响应这件事(不再接收输入)。
以上述例子类推到OpenGL中:
1、OpenGL可以记录自己的状态,比如下面的这几行代码(比如:当前所使用的颜色、是否开启了混合功能等)
glEnable(GL_DEPTH_TEST);//开启深度测试
glDisable(GL_DEPTH_TEST);//关闭深度测试
2、OpenGL可以接收输入(当我们调用OpenGL函数的时候,实际上可以看成OpenGL在接收我们的输入),根据输入的内容和自己的状态,修改自己的状态,并且可以得到输出(比如我们调用glColor3f,则OpenGL接收到这个输入后会修改自己的“当前颜色”这个状态;我们调用glRectf,则OpenGL会输出一个矩形)
3、OpenGL可以进入停止状态,不再接收输入。这个可能在我们的程序中表现得不太明显,不过在程序退出前,OpenGL总会先停止工作的。
二、OpenGL上下文
1、 OpenGL的上下文实际上是一个巨大的状态机,保存了OpenGL中的各种状态,这也是OpenGL指令执⾏的基础。
2、 OpenGL采用了客户端-服务器模式,我们可以认为每一个硬件GPU是个服务器,每一个绘制上下文对应于申请的一个客户端,一个客户端维护着一套状态机,如果两个窗口分别对应两个不同的绘制上下文,则两个窗口彼此状态独立。
3、 所有的OpenGL调用,都需要指定是在哪个上下文环境下调用的。不同的上下文中,同样的资源ID,可能对应于各自上下文中不同类型的资源。
4、 不同的操作系统,都有各自的绘制上下文创建、和设置当前绘制上下文的API。
5、 两个线程同时MakeCurrent到同一个绘制上下文,会导致程序崩溃。大型程序的一般做法是申请一条线程,专门用于绘制,创建线程时,为该绘制线程申请一个绘制上下文,一直作为当前的上下文。所有的绘制相关的操作,都在绘制线程完成。
三、渲染
渲染(Rendering):将图片、按钮、视频等数据通过数据转换成2D空间图像显示在屏幕上。
四、顶点数组 & 顶点缓冲区
- 首先了解一下什么是顶点?
顶点指的是我们在绘制一个图形时,它的顶点位置数据.而这个数据可以直接 存储在数组中或者将其缓存到GPU内存中。
- 顶点数组?
开发者可以选择设定函数指针,在调用绘制方法的时候,直接由内存传⼊顶点数据,也就是说这部分数据之前是存储在内存当中的,被称为顶点数组。(会存在带宽问题)
- 顶点缓冲区?
⽽性能更高的做法是,提前分配⼀块显存,将顶点数据预先传入到显存当中。这部分的显存,就被称为顶点缓冲区。
五、管线
管线就好似流水线,每个任务类似流⽔线般执⾏,任务之间有先后顺序。在OpenGL 下渲染图形,就会有经历一个一个节点,⽽这样的操作可以理解管线。(之所以称之为管线是因为显卡在处理数据的时候是按照一个固定的顺序来的,⽽且严格按照这个顺序。就像⽔从一根管子的一端流到另一端,这个顺序是不能打破的。)
*【例】肥皂工厂:肥皂水 -> 模具(20) ->肥皂
- 固定管线?
(对应很多固定的模具)OpenGL内部已经封装了一系列的固定渲染流程,这个是不可更改的。
- 可编辑管线?
(自定义编程模具)可以简单理解, 在处理图形的过程,必须使用顶点着色器和片元着色器,我们可以用GLSL语言编写着色器程序,通过自定义的着色器程序来达到我们想要的。
六、着色器
- 顶点着色器:
顶点着色器一般用来处理每个顶点变换(旋转,平移,投影等),顶点着色器是OpenGL中用来处理计算顶点属性的程序。
顶点着色器的输入是一个或多个顶点属性(Vertex Attribute)组成的VertexBuffer。VertexBuffer中的顶点应至少指出了顶点的位置属性,这些位置属性通常指的是每个3D模型(每个模型都有其自身的原点)本身的坐标。顶点着色器将这些位置信息转换为屏幕位置,以便可以正确的显示。
- 片元着色器
片元着色器是OpenGL中用于计算片段, 处理一个一个像素点,如(120* 120像素点 ,要执行14400次)
基本上来说,它是这样运行的:片元着色器将顶点着色器输出的片元作为输入,片元的顶点属性已被光栅化单元进行了插值处理。
七、光栅化
光栅化就是把顶点数据转换为片元的过程。片元中的每一个元素对应于帧缓冲区中的一个像素。
光栅化分为两个过程:1、确定图形在像素范围 2、颜色附着上去
八、纹理
纹理可以理解为图片,图像渲染时经常需要填充图片。这里的图片其实就是纹理,在OpenGL中,我们更喜欢称之为纹理 。
1、常见图像文件格式(BMP,TGA,JPG,GIF,PNG)
2、常见纹理格式(R5G6B5,A4R4G4B4,A1R5G5B5,R8G8B8, A8R8G8B8等)
九、混合
混合指的是颜色混合行为,通常可以用来实现半透明(注意:只有在RGBA模式下,才可以使用混合功能,颜色索引模式下是无法使用混合功能的。)
【例】Layer两个图层(粉色0.5 、蓝色0.5)== 叠加在一起 == 混合成透明灰
十、矩阵
- 变换矩阵?
当图形想要平移、旋转、缩放变换时,用变换矩阵
- 投影矩阵?
将3D坐标转换为二维屏幕坐标时用到
投影矩阵的投影方式有:透视投影(Perspective projection)、正投影(Orthographic projection) 投影.jpeg
十、视口
窗口大小 坐标系对应屏幕区域的范围
参考:
[https://www.cnblogs.com/Liuwq/p/5444641.html]
[https://www.jianshu.com/p/d3dd314c9f83]
[https://www.jianshu.com/p/58af418dfe01]
[https://www.jianshu.com/p/a7096a6c16a7]
网友评论