本文已参与「新人创造礼」活动,一起敞开创造之路。

一篇仅为个人总结学习的blog,参阅内容包含不限于毛星云rtr3提炼总结,插图基本上来自入门精要和提炼总结

第二章 烘托管线

感觉跟之前学到的区别方式有些不同,对比了毛的rtr3提炼书也是这种区别,仍是这种方式更好啊 三个大阶段 这儿区别成了三个大的阶段:==运用阶段、几许阶段、光栅化==

1. 运用阶段

总结

这个阶段主要是预备,==从CPU为起点给到GPU==,包含场景数据,包含相机方位视锥体等等,再进行一个粗粒度除掉裁剪不可见物体,终究设置烘托状况(原料纹路运用哪些shader),得到一个 烘托图元(点线三角形面) 给到几许阶段

细分

  1. 数据加载到显存
  2. 设置烘托状况
  3. 调用DrawCall

(1)数据加载到显存

烘托数据 :从硬盘 –> 体系内存(RAM) –> 显存

为什么要加载到显存(显卡)上?(不才操作体系严峻没学好,你学好了能够跳过这段笔记…) 首要,显卡对显存拜访数据是更快的,甚至很多显卡对RAM没有数据拜访权限,所以要加载到显存 那么显卡关于烘托的意义是什么? 这不得不说GPU与显卡的联系,GPU(Graphic Processing Unit--图形处理器)是显卡的核心部件之一,还有显存,主板散热器so on。

所以烘托的起点是CPU,数据终究给到GPU

UnityShader入门精要个人总结--基础篇(一)

(2)设置烘托状况

原书的话:状况便是界说场景中网格怎么被烘托。 包含运用哪些着色器(像曲面细分着色器/几许shader都是可选的),还有光源原料等等

(3)调用DrawCall

便是CPU向GPU发出的一个烘托指令(CPU:快来烘托这个东西 GPU:OK!)

DrawCall为什么影响功率?怎么减少? 1 由于每次调用DrawCall,CPU会进行预备内容给到GPU,烘托没有差异,可是DrawCall越多CPU更多时间都在提交DrawCall上降低功率 2 解决方法是批处理,把小DrawCall兼并成大的,更合适静态的物体。避免运用很小的网格,避免运用太多原料

因此以下2、3阶段都是在GPU进行

UnityShader入门精要个人总结--基础篇(一)

2. 几许阶段

总结

这个阶段负责大多数极点和多边形简直所以几许相关的工作,需求制作的图元是什么,怎么制作,在哪里制作。

细分

  1. 极点着色器
  2. 投影
  3. 裁剪
  4. 屏幕映射

(1)极点着色器

这儿主要是两个任务是坐标改换和极点着色,毛是细分了两个阶段,冯的书是合为极点着色器,本质是一样的。 ==坐标改换:将模型改换到合适烘托的空间当中== 经典的MVP改换进程,把极点坐标从模型空间转化到齐次裁剪空间内。 ==逐极点光照 :意图在于确认模型上极点处原料的光照效果。== 所谓的Shader,着色器,确认原料上的光照效果的这种操作被称为着色 坐标转化完毕我还需求知道这个坐标会显现成啥样吧,逐极点着色根据着色方程,核算出这个成果,包含色彩纹路坐标等等,把这个成果丢到光栅化。

(2)投影

==将模型从三维空间投射到了二维的空间中的进程== 这儿留意一个概念NDC,归一化设备坐标,终究能看到的模型的坐标都会被放在一个[-1,1]的cube里,这便是归一化。通常是正交和透视投影两种,详细怎么归一化能够参阅Games101

(3)裁剪

很好理解,在规范立方体内才会被显现,其他的摄像机看不到也不需求被烘托,所以其他部分进行裁剪。

(4)屏幕映射

主要是视口改换,放在cube里的三维坐标怎么映射到二维屏幕进行显现。那么主要是矩阵缩放改换,[-1,1] 到宽width高height的屏幕进行一个缩放。 可是留意,还有一个Z轴方向的数据,这个阶段不做处理,可是数据会被传下去,这是重要的深度参阅信息

3. 光栅化

总结

==将二维屏幕上的点转变为像素==。极点间短少的像素插值补充。 主要分为两步,图元覆盖了那些像素,核算他们终究的色彩。

细分

  1. 三角形设置
  2. 三角形遍历
  3. 片元着色器
  4. 输出兼并(逐片元操作)

(1)三角形设置

之前得到的一系列极点数据,把它们装配成我们需求的三角形网格。

(2)三角形遍历

查看像素是否被三角形覆盖,覆盖则生成片元。 这一阶段包含了插值操作,三角形极点的信息对整个覆盖区域插值。

留意片元与像素的区别 片元并不是真实意义上的像素,而是很多状况的调集,包含深度发现纹路坐标,终究需求一系列测验才会成为像素

(3)片元着色器

经过插值的成果,输出色彩值。因此这一阶段最重要的纹路贴图,得到像素色彩。

可是至此,屏幕详细的像素都没有任何变化,这些都是预备的数据,直到==输出兼并==

(4)输出兼并(逐片元操作)

UnityShader入门精要个人总结--基础篇(一)
模板测验:那就需求模板buffer。跟深度测验相似,但更像是一个mask,设定一个固定值,mask内显现,以外不显现
UnityShader入门精要个人总结--基础篇(一)
深度测验:相机只能看到近处的,被遮挡的远的物体看不到就无需烘托; 最典型便是Z-Buffer技能,只有更近的物体才有资格更新frame。 混合

这儿还提到了关于通明物体烘托的一些Tips: 众所周知,不通明的物体当然是看到最近的,那么通明的呢?需求进行片元着色器中的色彩和色彩缓冲器的色彩混合。举个比如,一个玻璃放在眼前,我既能够看到玻璃,又能够看到玻璃之后的,实践看到的是这两个色彩的混合

unity中深度测验在片元着色器前,这称为Early-Z ,先判断出近处图形,再核算像素,愈加高效,可是问题在于通明的物体就无法烘托了,由于远方的物体已经被除掉掉了。

4.结尾(双缓冲)

烘托中的图元必定是不能显现的,就像舞台更改背景,背景预备完毕,红布一拉,舞台展现在众人眼前。 双缓冲分为前置和后置缓冲 前置便是能看到的显现在屏幕上的图像,后置便是烘托中的,GPU不断交流两者内容,保证看到的都是连续的画面。