什么是渲染管线

渲染管线大致分三大阶段:
应用阶段(包围盒裁剪,遮挡剔除)
几何阶段(顶点着色器,细分着色器,几何着色器,图元装配)
光栅化阶段(裁剪)
通过光栅化操作后进入逐片元阶段,最后输出片元着色器

应用阶段:
这个阶段是我们的CPU准备数据的阶段。CPU会将我们需要渲染物体的顶点、材质、贴图、进行一个打包,在提交的时候CPU会对数据进行优化工作,我们的unity引擎会对不需要渲染的物体进行剔除(因为CPU是掌握第一手数据的,所以可以在粗粒上剔除操作,这样就能减少GPU的负担)
CPU不像GPu一样通过计算每个三角形的有效性,而是比较模型颗粒(通过包围盒判断是否要剔除)
包围盒的信息储存在Mesh.Bounds变量中,通过判断包围盒的8个顶点是否有一个视锥范围内来决定是否剔除。
颗粒度就是指的是具体的详细和清清晰程度。
应用阶段最后是向GPU发送数据,GPU接收到数据,存放在显存中,但是移动端没有GPU,这时候就会使用内存为GPU提供服务(三重缓存机制):顶点、模版、深度(颜色)
VBO(顶点缓冲对象)
VBO是向显存申请的空间,它用于存放顶点数据,例如:顶点位置、法向量、顶点颜色数据。由于数据是存在显存中的,所以处理的维度很快,我们可以开辟多个VBO,但是每个VBO在OpenGl中有唯一的ID,通过ID访问具体的显存地址。
VAO(顶点数组对象)
VAO其实相当于我们顶点信息的管理。它保存了所有顶点数据的属性,VAO本身是没有储存顶点数据,这些信息是存储在VBO中的,VAO被创建绑定之后,任何随后的顶点属性都会存储在这个VAO中。
EBO(牵引缓存对象)
EBO也是缓冲,它专门存储牵引,牵引的意义就是减少重复数据。OpenGL通过调用这些顶点的牵引来决定绘制哪个顶点。

几何阶段:处于GPU的阶段
集合阶段的工作内容是将图元(点、线、面、三角形)转化为屏幕空间,因此它可以决定那些图元可以绘制,以及怎么绘制
图元:即点、线、面可以理解成为网格拆分状态,是着色器中的基础数据,在几何阶段中的作用很大。
几何阶段会经过几个处理过程,按顺序排列为顶点着色器-细分着色器-几何着色器-图元装配-归一化坐标-裁剪
顶点着色器:会对每个顶点逐一计算。它可以很简单的将数据传递给下一阶段,也可以采用矩阵变换来计算顶点在几何空间内的位置,也可以通过光照公式计算颜色或者下一阶段需要的信息。
细分着色器:是一个非必要的着色器、很多手机设备上的GPU没有这几个功能。细分着色器包括曲面细分着色器,细分计算着色器,其使面片来描述一个物体的形状、并且增加顶点和面片的数量,使得模型表面看起来更平顺。
图元装配:将细分着色器处理后的数据与相关的图元组织起来,为裁剪做准备。
归一化坐标:顶点着色器将顶点从模型空间转换到矩形空间,这个转换过程为从模型空间到世界空间到视口空间再到投影空间。在转换了坐标空间后,会通过硬件上的透视阵法来得到归一化后的设备坐标,归一化后的设备坐标会让裁剪变的更加容易。可以将归一化后的设备坐标(NDC)看作矩形内的坐标,经过转换后,物体的x,y,z值会被限制在[-1,1]这个范围内。
裁剪:三角形是否需要裁剪,将归一化后的坐标来决定,它或许完全在范围内,完全在范围外,也或许部分在范围内、部分在范围外,将会全部被剔除。若是全部在范围内数据会被传递下去,若部分在范围内则需要进行裁剪。

光栅化阶段
这个阶段是我们渲染管线中处理片元的阶段。我们物体最终的渲染结果是在这个阶段中计算的。
光栅化阶段包括绘制三角形-遍历三角形-片元着色器-逐片元操作
设置三角形:前面几个阶段的三角形是几何意义上的,而治理指的是像素。因此设置三角形是将所有的三角形平铺在屏幕坐标系上,三角形通过线的边界形式来表达面片的覆盖的情况。面积不是关键,因为屏幕是以像素来计算的。所以三角形覆盖了哪些像素需要扫描,而扫描的操作就是遍历三角形
三角形三个顶点中包括像素坐标、像素深度、像素颜色、像素法线、像素纹理坐标等。
片元着色器是处理片元的地方。如今片元着色器也是我们可以控制的一个着色器,我们可以通过很多技巧来改变片元的颜色或者可以直接丢弃。
每个片元相当于一个像素,但是相比像素,每个片元包含了三角形遍历后的信息插值,每个片元都是独立的,就是相邻的片元它们互不相通。
逐片元操作: 逐片元操作是OpenGl的说法,在他们都包含裁剪测试,透明测试,模版测试,深度测试。

猜你喜欢

转载自blog.csdn.net/2302_76830411/article/details/131734789