【UnityShader】(一) 渲染流水线详解

UnityShader之渲染流水线

学习冯乐乐–UnityShader《入门精要》,总结自己对渲染流水线的理解。

渲染流水线:
  渲染流水线的工作任务是从一个三维场景出发、生成(或渲染)成一张二维图像。换句话说,计算机需要从一系列顶点数据、纹理等信息出发,把这些信息最终转换成人眼可看到的图像。而这个工作通常是由CPU和GPU来完成的。一般分为三个阶段:应用阶段、几何阶段和光栅化阶段。


图1.1 真实生活中的流水线
 
图1.2 渲染流水线中的三个概念阶段


   渲染流水线的起点是;CPU,即:应用阶段
1.首先将所需要的数据从硬加载到系统内存(RAM),再加载到显存上。

   
图1.3 渲染所需的数据(两张纹理以及3个网格)从硬盘最终加载到显存中。在渲染时,GPU可以快速访问这些数据 


2.设置渲染状态,定义场景中网格如何被渲染。

在这里插入图片描述
图1.4 在同一状态下渲染三个网格。由于没有更改渲染状态,因此三个网格的外观看起来像是同一种材质的物体。


3.调用DrawCall,告诉GPU开始渲染,而此时CPU会向GPU发送指向一个需要被渲染的图元列表。

在这里插入图片描述
图1.5 CPU通过调用Draw Call来告诉GPU开始进行一个渲染过程。一个Draw Call会指向本次调用需要渲染的图元列表

   中间操作GPU(几何阶段)

在这里插入图片描述
图1.6 GPU的渲染流水线实现。颜色表示了不同阶段的可配置性或可编程性:绿色表示该流水线阶段是完全可编程控制的,黄色表示该流水线阶段可以配置但不是可编程的,蓝色表示该流水线阶段是由GPU固定实现的,开发者没有任何控制权。实线表示该shader必须由开发者编程实现,虚线表示该Shader是可选的


4.接收顶点数据作为输入,随后被传到顶点着色器(坐标转换和逐顶点光照)。
5.裁剪,将那些不在摄像机视野内的顶点裁剪掉,并剔除某些三角图元的面片。
6.屏幕映射,将输入的三维坐标中的x,y坐标从(-1,1)范围转换到屏幕坐标系中,最后将Z坐标(此过程不发生变换)和屏幕坐标一起传送给光栅化阶段。
  GPU处理(光栅化阶段
7.三角形设置,上述传过来的只是三角网格每条边两个端点的值,此时,计算每条边的所有像素坐标。
8.三角形遍历,检查每个像素是否被一个三角形覆盖,即找到哪些像素被一个三角形覆盖,若被覆盖则生成一个片元。

在这里插入图片描述
图1.7 三角形遍历的过程。根据几何阶段输出的顶点信息,最终得到该三角网格覆盖的像素位置。对应像素会生成一个片元,而片元中的状态是对三个顶点的信息进行插值得到的。例如,对图2.12中三个顶点的深度进行插值得到其重心位置对应的片元的深度值为-10.0


9.片元着色器,对顶点着色器输出数据插值后的信息作为输入,在该阶段可以进行许多渲染技术,其中比较重要的有纹理采样。例如:首先在顶点着色器阶段要输出每个顶点的纹理坐标,然后经过光栅化阶段对三角网格的3个顶点 对应的纹理坐标进行插值,最后便可得到该三角网格覆盖的像素形成片元,从而得到该片元的纹理坐标。

在这里插入图片描述
图1.8 根据上一步插值后的片元信息,片元着色器计算该片元的输出颜色


10.逐片元操作,决定每个片元的可见性,通常会涉及到一系列测试:如模板测试、深度测试等。若该片元通过了所有的测试,则需要将该片元的颜色值与已存在颜色缓存区中的颜色进行混合。(进行的目的:物体需要不断地在屏幕上绘制)。
11.双缓冲策略,实现屏幕物体不断刷新。

扩展☆☆深度测试+模板测试 ☆☆

深度测试:
  开启深度测试,GPU会把该片元的深度值和已存在于深度缓存区中的深度值进行比较。此时,开发者定义比较函数来确定是否将该片元写入。
模板测试:
  开启模板测试,Result=(ref&mask)OP(value&mask)
   ref:读取到的参考值(应用程序录入);
   mask:模板掩码;
   value:GPU读取模板缓存区中该该片元位置的模板值;
   OP:比较函数

  
冯乐乐CSDN博客:https://blog.csdn.net/candycat1992
《Unity Shader入门精要》随书彩色插图链接:http://www.manew.com/blog-194008-42590.html

猜你喜欢

转载自blog.csdn.net/qq_43459806/article/details/83186775
今日推荐