本文由@唐三十胖子出品,转载请注明出处。
文章链接:https://blog.youkuaiyun.com/iceSony/article/details/84887592
这篇文章将总结和提炼《Unity Shader入门精要》的第十章“高级纹理”的内容。
通过这篇文章,你可以知道
1)Unity的渲染路径介绍
2)前向渲染路径
3)顶点照明渲染路径
4)延迟渲染路径
一.Unity的渲染路径介绍
之前章节用到的是单一平行光(大多数手游就是如此)
但PC实现光照往往更加复杂,处理的数目与种类更多的光源。
Unity的渲染路径
渲染路径:决定光照如何应用到shader中,写在Pass/Tags中的LightMode中
Unity在5.0版本自带三种渲染模式:前向渲染、延迟渲染、顶点照明渲染
但在5.0版本之后顶点照明渲染被抛弃,有了新的延迟渲染机制,但都对旧有代码的兼容
在Unity调整默认渲染路径(事实上在博主用的5.6.5版本这个选项已经被剔除了)
Edit->Porject Settings->Player->Other Settings->Rendering Path中选择项目所需的渲染路径。
这是一种默认的设置方式,我们还可以通过设置摄像机的Rendering Path来修改不同的方式
上面使用的是默认的渲染路径,当你的显卡不支持该渲染路径,Unity会自动使用更低一级的渲染路径。比如当GPU不支持延迟渲染,就会替换为前向渲染。
事实上在Shader中这三种渲染路径仍可以细分
除了我们一直用的forwardbase,还有其他类型如下表
接下来我们将一一讲解
二.前向渲染路径:最常见的渲染路径
前向渲染的原理:当进行逐片元的渲染,利用深度缓冲判断当前片元是否可见,如果可见就更新颜色缓冲区的颜色
对于每个逐像素的光源,我们都要进行上述的完整渲染流程。
如果物体处在多个逐像素光源影响区域,那么该物体需要执行多个Pass,每个Pass计算一个逐像素光源的光照结果。
最后在帧缓冲中(每帧结束数据处理的区域)混合得到最终的显示颜色。
为了减少Pass数目,Unity渲染时会限制物体的逐像素光照数目。
前向渲染对光照的处理
分三类处理光照:逐顶点处理、逐像素处理、球谐函数处理
逐顶点处理/SH处理:光源Render Mode设置为Not Important
逐像素处理:场景中最亮的平行光;光源RenderMode设置为Important;逐像素光源数量小于QualitySetting中的逐像素光源数量,那么原本采用逐顶点处理/SH处理的会自动变成逐像素处理
在之后的前向渲染Shader编写中,往往包含两个Pass:一个Pass仅仅执行一次,另一个会根据逐像素光源数目多次调用
内置的光照变量和函数
三.顶点照明渲染路径:性能最高、效果最差
顶点照明渲染原理:通常为一个Pass,计算所有光线照明。
在本质上顶点照明渲染是前向渲染的子集,除了不支持阴影、法线映射、高光映射等
所以在现在的版本这个已经被剔除了= =
四.延迟渲染路径:适用于大量光源
比起前向渲染的颜色与深度缓冲区,还添加一个Geometry缓冲来保存表面信息,包含法线、位置、材质等
原理:两个Pass,第一个Pass计算片元是否可见,可见就存储到G缓冲区
第二个Pass利用缓冲区片元信息,进行光照计算
Unity中的延迟渲染
分为旧版与新版,且不支持抗锯齿,不能处理半透明物体,对显卡有要求。
除去深度缓冲&模板缓冲,默认的G缓冲区包含:
RT0:格式为ARGB32,RGB存储漫反射颜色,A通道没用到
RT1:格式为ARGB32,RGB存储高光反射颜色,A通道存储高光反射的指数
RT2:格式为ARGB2101010,RGB存储法线,A通道没用到
RT3:格式为ARGB32(非HDR),用于存储自发光+lightmap+反射探针
可用的内置变量与函数
之后的文章我们将重点讲解Unity最常见的前向渲染(= =手游无光,且不用考虑硬件问题)
感谢阅读:)