1. Context (OpenGL上下文)
在应用程序调用任何OpenGL的指令之前,需求组织首先创立⼀一个OpenGL的上下⽂。这个上下文是⼀个⾮常巨大的状况机,保存了OpenGL中的各种状况,这也是OpenGL指令执⾏的基础;
OpenGL的函数不论在哪个语⾔言中,都是相似C语⾔⼀样的面向进程的函数,本质上都是对OpenGL上下文这个巨大的状况机中的某个状况或许目标进⾏操作,当然你得首先把这个目标设置为当时目标。因而,经过对 OpenGL指令的封装,是能够将OpenGL的相关调用封装成为⼀个⾯向目标的 图形API的;
因为OpenGL上下文是⼀个巨大的状况机,切换上下文往会产生较大的开 销,可是不同的制作模块,可能需求使⽤彻底独立的状况办理。因而,能够在应用程序中分别创立多个不同的上下文,在不同线程中使⽤不同的上下文,上下⽂之间同享纹路、缓冲区等资源。这样的方案,会比重复切换 上下文,或许⼤量修改烘托状况,愈加合理高效的。 A8站源码交易平台
2. OpenGL 状况机
状况机是理论上的一种机器。这个非常难以了解。所以咱们把这个状况机这么了解。状况机描绘了一个目标在其生命周期内所阅历的各种状况,状况间的改变,发生改变的动因,条件及改变中所执⾏的活动。或许说,状况机是一种⾏为,说明目标在其⽣命周期中呼应事情所阅历的状况序列以及对那些状况事情的呼应。 A8站源码交易平台因而具有以下特色:
有记忆功用,能记住其当时的状况;
能够接纳输入,依据输入的内容和⾃己的原先状况,修改⾃己当时状 态,而且能够有对应输出;
当进⼊特别状况(停机状况)的时分,便不再接纳输⼊,停⽌作业;
类推到OpenGL 中来,能够这么了解:
OpenGL能够记录⾃己的状况(如当时所使⽤的颜色、是否开启了混合功用等);
OpenGL能够接纳输入(当调用OpenGL函数的时分,实践上能够看成 OpenGL在接纳咱们的输入),如咱们调⽤glColor3f,则OpenGL接纳到这个输⼊后会修改⾃己的“当时颜色”这个状况;
OpenGL能够进⼊停⽌状况,不再接纳输入。在程序退出前,OpenGL总会先停⽌作业的。
3. 烘托
将图形/图画数据转换成3D空间图画操作叫做烘托(Rendering)。
4. 极点数组(VertexArray)和极点缓冲区(VertexBuffer)
画图⼀般是先画好图画的⻣架,然后再往骨架⾥面填充颜色,这对于 OpenGL也是一样的。极点数据便是要画的图画的骨架,和现实中不同的是,OpenGL中的图画都是由图元组成。在OpenGLES中,有3种类型的图元:点、线、三⻆形。那这些极点数据最终是存储在哪里的呢?开发者能够选择设定函数指针,在调用制作⽅方法的时分,直接由内存传入极点数据,也便是说这部分数据之前是存储在内存当中的,被称为极点数组。⽽功用更高的做法是,提早分配⼀块显存,将极点数据预先传⼊到显存当中。这部分的显存,就被称为极点缓冲区; A8站源码交易平台
极点指的是咱们在制作⼀个图形时,它的极点方位数据。⽽这个数据能够直接存储在数组中或许将其缓存到GPU内存中。
5. 管线
在OpenGL 下烘托图形,就会有阅历一个⼀个节点。⽽这样的操作能够了解管线。咱们能够想象成流⽔线。每个使命相似流水线般执行。使命之间有先后次序。管线是⼀个抽象的概念,之所以称之为管线是因为显卡在处理理数据的时分是按照⼀个固定的次序来的,⽽且严格按照这个次序。就像水从⼀根管子的⼀端流到另一端,这个次序是不能打破的。
6. 固定管线/存储着⾊器
在前期的OpenGL 版本,它封装了很多种着⾊器程序块内置的一段包含了了光照、坐标改换、裁剪等许多功用的固定shader程序来完结,来帮助开发者来完结图形的烘托.。⽽开发者只需求传⼊相应的参数,就能快速完结图形的烘托。相似于iOS开发会封装很多API,⽽咱们只需求调用,就能够完结功用,不需求关注底层完结原理;
可是因为OpenGL 的运用场景⾮常丰富,固定管线或存储着⾊色器无法完结每⼀个业务,这时将相关部分开放成可编程。
7. Shader(着⾊器程序) A8站源码交易平台
前面提到将固定烘托管线架构变为了可编程烘托管线。因而,OpenGL在实
际调⽤制作函数之前,还需求指定⼀个由shader编译成的着⾊器程序。常
⻅的着⾊器主要有极点着⾊器(VertexShader),⽚段着⾊器
(FragmentShader)/像素着⾊器(PixelShader),⼏何着⾊器
(GeometryShader),曲⾯细分着⾊器(TessellationShader)。⽚段着⾊
器和像素着⾊器只是在OpenGL和DX中的不同叫法⽽已。惋惜的是,直到
OpenGLES 3.0,依然只⽀持了极点着⾊器和⽚段着⾊器这两个最基础的着⾊
器。 A8站源码交易平台
OpenGL在处理shader时,和其他编译器⼀样。经过编译、链接等进程,⽣
成了着⾊器程序(glProgram),着⾊器程序同时包含了极点着⾊器和⽚段
着⾊器的运算逻辑。在OpenGL进⾏制作的时分,⾸先由极点着⾊器对传⼊
的极点数据进⾏运算。再经过图元安装,将极点转换为图元。然后进⾏光
栅化,将图元这种⽮量图形,转换为栅格化数据。最后,将栅格化数据传
⼊⽚段着⾊器中进⾏运算。⽚段着⾊器会对栅格化数据中的每⼀个像素进
⾏运算,并决议像素的颜⾊。
8. VertexShader(极点着⾊器)
⼀般⽤来处理图形每个极点改换(旋转/平移/投影等);
极点着⾊器是OpenGL中⽤于核算极点特点的程序。极点着⾊器是逐极点运
算的程序,也便是说每个极点数据都会执⾏⼀次极点着⾊器,当然这是并
⾏的,而且极点着⾊器运算进程中⽆法拜访其他极点的数据;
⼀般来说典型的需求核算的极点特点主要包括极点坐标改换、逐极点光照
运算等等。极点坐标由⾃身坐标系转换到归⼀化坐标系的运算,便是在这
⾥发⽣的。 A8站源码交易平台
9. FragmentShader(⽚元着⾊器)
⼀般⽤来处理图形中每个像素点颜⾊核算和填充;
⽚元着⾊器是OpenGL中⽤于核算⽚段(像素)颜⾊的程序。⽚元着⾊器是
逐像素运算的程序,也便是说每个像素都会执⾏⼀次⽚段着⾊器,当然也
是并⾏的。
10. GLSL(OpenGL Shading Language)
OpenGL着⾊语⾔(OpenGL Shading Language)是⽤来在OpenGL中着⾊编程
的语⾔,也即开发⼈员写的短⼩的⾃界说程序,他们是在图形卡的GPU
(Graphic Processor Unit图形处理单元)上执⾏的,替代了固定的烘托管
线的⼀部分,使烘托管线中不同层次具有可编程性。⽐如:视图转换、投
影转换等。GLSL(GL Shading Language)的着⾊器代码分红2个部分:
Vertex Shader(极点着⾊器)和Fragment(⽚元着⾊器)。
11. Rasterization(光栅化)
光栅化便是把极点数据转换为⽚元的进程。⽚元中的每⼀个元素对应于帧
缓冲区中的⼀个像素;
光栅化其实是⼀种将⼏何图元变为⼆维图画的进程。该进程包含了两部分
的⼯作。第⼀部分⼯作:决议窗⼝坐标中的哪些整型栅格区域被基本图元
占⽤;第⼆部分⼯作:分配⼀个颜⾊值和⼀个深度值到各个区域。光栅化
进程产⽣的是⽚元;
把物体的数学描绘以及与物体相关的颜⾊信息转换为屏幕上⽤于对应方位
的像素及⽤于填充像素的颜⾊,这个进程称为光栅化,这是⼀个将模仿信
号转化为离散信号的进程。 A8站源码交易平台
12. 纹路
纹路能够了解为图⽚。⼤家在烘托图形时需求在其编码填充图⽚,为了使得
场景愈加逼真。⽽这⾥使⽤的图⽚,便是常说的纹路。可是在OpenGL,咱们愈加
习气叫纹路,⽽不是图⽚。
13. Blending(混合)
在测验阶段之后,如果像素依然没有被剔除,那么像素的颜⾊将会和帧缓
冲区中颜⾊附着上的颜⾊进⾏混合,混合的算法能够经过OpenGL的函数进
⾏指定。可是OpenGL供给的混合算法是有限的,如果需求愈加杂乱的混合
算法,⼀般能够经过像素着⾊器进⾏完结,当然功用会⽐原⽣的混合算法
差⼀些。
14. 改换矩阵(Transformation)
例如图形想发⽣平移、缩放、旋改改换,就需求使⽤改换矩阵。
15. 投影矩阵(Projection)
⽤于将3D坐标转换为⼆维屏幕坐标,实践线条也将在⼆维坐标下进⾏制作。
16. 烘托上屏/交流缓冲区(SwapBuffer)
烘托缓冲区⼀般映射的是体系的资源⽐如窗⼝。如果将图画直接烘托到窗⼝对应的烘托缓冲区,则能够将图画显现到屏幕上;
可是,值得注意的是,如果每个窗⼝只要⼀个缓冲区,那么在制作进程中屏幕进⾏了改写,窗⼝可能显现出不完整的图画;
为了解决这个问题,常规的OpenGL程序⾄少都会有两个缓冲区。显现在屏幕上的称为屏幕缓冲区,没有显现的称为离屏缓冲区。在⼀个缓冲区烘托完结之后,经过将屏幕缓冲区和离屏缓冲区交流,完结图画在屏幕上的显现;
因为显现器的改写⼀般是逐⾏进⾏的,因而为了防⽌交流缓冲区的时分屏幕上下区域的图画分归于两个不同的帧,因而交流⼀般会等候显现器改写完结的信号,在显现器两次改写的间隔中进⾏交流,这个信号就被称为笔直同步信号,这个技术被称为笔直同步;
使⽤了双缓冲区和笔直同步技术之后,因为总是要等候缓冲区交流之后再进⾏下⼀帧的烘托,使得帧率⽆法彻底到达硬件答应的最⾼⽔平。为了解决这个问题,引⼊了三缓冲区技术,在等候笔直同步时,来回交替烘托两个离屏的缓冲区,⽽笔直同步发⽣时,屏幕缓冲区和最近烘托完结的离屏缓冲区交流,完结充分利⽤硬件功用的⽬的。 A8站源码交易平台
17. 笛卡尔坐标系
二维坐标系:
二维的直角坐标系一般由两个互相笔直的坐标轴设定,一般分别称为 x-轴
和 y-轴;两个坐标轴的相交点,称为原点,一般标记为 O ,既有“零”的意思,又是英语“Origin”的首字母。每一个轴都指向一个特定的方向。这两个不同线的坐标轴,决议了一个平面,称为 xy-平面,又称为笛卡尔平面。x-轴被水平摆放,称为横轴,一般指向右方;y-轴被竖直摆放而称为纵轴,一般指向上方。两个坐标轴这样的方位关系,称为二维的右手坐标系,或右手系。如果把这个右手系画在一张透明纸片上,则在平面内不管怎样旋转它,所得到的都叫做右手系;但如果把纸片翻转,其背面看到的坐标系则称为“左手系”。这和照镜子时左右对掉的性质有关。
三维坐标系:
过定点O,作三条互相笔直的数轴,它们都以O为原点且一般具有相同的长度单位。这三条轴分别叫做x轴(横轴)、y轴(纵轴)、z轴(竖轴),总称坐标轴。一般把x轴和y轴配置在水平面上,而z轴则是铅垂线,它们的正方向要符合右手规则,即以右手握住z轴,当右手的四指从正向x轴以π/2视点转向正向y轴时,大拇指的指向便是z轴的正向,这样的三条坐标轴就组成了一个空间直角坐标系,点O叫做坐标原点。这样就构成了一个笛卡尔坐标。 A8站源码交易平台

18. 视口、取舍区域
咱们运用OpenGL制作时是在坐标系中制作的,可是最终是要显现到窗口的,理论上咱们坐标系是正负无穷大的,可是咱们窗口大小却是确认的,此刻咱们就需求告知OpenGL咱们的窗口需求显现坐标系中哪一块区域,超出这个区域的部分窗口就不显现了,这个区域便是裁剪区域。
确认好裁剪区域后,咱们需求将裁剪区域显现在窗口上,裁剪区域的宽高很少与窗口的宽高(以像素为单位)相匹配,因而坐标体系必须将笛卡尔坐标系映射到屏幕像素坐标系,这个映射便是经过一种叫做**视口(ViewPort)**的设置来指定的。视口便是窗口内部用于制作裁剪区域的客户区域。
如此下示意图,坐标系中取舍区域映射到窗口时的两种状况:

另外视口大小是能够超出窗口的,此刻就只会显现取舍区域的一部分。
19. 投影、视景体(Frustum)
咱们在3D空间中运用笛卡尔坐标系制作物体时,不管这个三维图画有多么真实,最终都是要显现到咱们的二维屏幕上的,而将三维图画转换到二维屏幕便是投影。
如下图所示,是指制作场景中摄像机的可见规模锥形规模,在这个规模内的物体是可见的,反之不行见。
透视投影
近大远小,如上图视景体所示便是透视投影。
正投影
或许叫平行投影,和透视投影不同在于,正投影没有近大远小的作用,其视景体是一个长方体。 A8站源码交易平台