来源:《UNITY SHADER入门精要》
文章目录
1、渲染路径
我们如果要在 Shader 中计算光源,我们需要为每一个 Pass 指定它所使用的渲染路径,这样才能访问到特定内置变量存储的光源信息。
Unity中目前保有 4 种渲染路径:
1、Deferred Shading Rendering Path(延迟渲染)
2、Forward Rendering Path(前向渲染)
3、Lagacy Deferred Lighting Rendering Path(遗留的延迟光照)
4、Vertex Lit Rendering Path(顶点光照)
2、针对整个项目渲染路径的改变
我使用的是 Unity 2021.3.4f1c1 版本,俺已经找不到全局和摄像机RendingPath的设置位置了。
3、Unity支持的渲染路径
对于每个 Pass 的 LightMode 标签,Unity 支持以下的渲染路径设置:
4、前向渲染(Forward Rendering Path)
①每次渲染的过程
每一次完整的前向渲染,我们需要 ①渲染该对象的渲染图元②计算颜色缓冲区③计算深度缓冲区。而且,对于每一个不同的光源,我们都要进行一次 Pass 渲染。
如果场景中有 N 个物体,每个物体受 M 个光源影响,那么整个场景里一共需要 N* M
次 Pass 来完成渲染。
Unity 中,如果存在多个光源的话,Unity会按照距离、强度和颜色来分配重要程度,具体如何自动分配重要程度的,Unity 官方文档中没有给出说明,当然也可以手动设置 重要程度。
②多个光源的渲染方法
这里说的 SH(Spherical harmonics 球谐函数)是一种更简单的渲染方式。
对于 Render Mode 为 Auto 的光源,Unity将以每像素光照模式渲染(A 到 D),然后最多 4 个光源以每顶点光照模式渲染(D 到 G),最后其余光源以 SH 进行渲染(G 到 H)。
对于设置成 Important 的光源,会按像素处理。
对于设置成 Not Important 的光源,会按照逐顶点或 SH 的方式处理。
③Unity中渲染光线的Pass
- 对于前向渲染来说,一个Unity Shader通常会定义一个Base Pass(Base Pass也可以定义多次,例如需要双面渲染等情况)以及一个Additional Pass。一个Base Pass仅会执行次(定义了多个Base Pass的情况除外),而一个Additional Pass会根据影响该物体的其他逐像素光源的数目被多次调用,即每个逐像素光源会执行一次Additional Pass。
- 在Additional Pass 的渲染设置中,我们还开启和设置了混合模式。这是因为,我们希望每个Additional Pass可以与上一次的光照结果在帧缓存中进行叠加,从而得到最终的有多个光照的渲染效果。如果我们没有开启和设置混合模式,那么Additional Pass的渲染结果会覆盖掉之前的渲染结果,看起来就好像该物体只受该光源的影响。通常情况下,我们选择的混合模式是
Blend One One
。
④内置的光照变量和函数
5、延迟渲染(Deferred Shading Rendering Path)
①概念
延迟渲染主要包含了两个 Pass。在第一个 Pass 中,我们不进行任何光照计算,而是仅仅计算哪些片元是可见的,这个主要通过深度测试实现,然后进行深度缓冲。当发现一个片元会是可见的,我们就会把相关的信息储存到 G-Buffer 中。然后,在第二个 Pass 中,我们利用 G-Buffer 中各个片元信息,例如:表面发现、视角方向、漫反射系数等,再进行光照计算。
延迟渲染使用的 Pass 数目通常就是两个,这跟场景中包含的光源数目没有关系。换言之,延迟渲染的效率不依赖于场景的复杂度,而是和我们使用的屏幕空间大小有关。这是因为,我们需要的信息都存储在缓冲区中,而这些缓冲区可以理解成是一张张2D图像,我们的计算实际上就是在这些图像空间中进行的。
②延迟渲染的缺点
- 不支持真正的**抗锯齿(anti-aliasing)**功能。
- 不能处理半透明物体
- 对显卡有一定要求,显卡必须支持MRT(Multiple Render Targets)、Shader Mode3.0及以上,深度渲染纹理以及双面的模板缓冲。
③延迟渲染的过程
(1)第一个 Pass 用于渲染 G 缓冲。在这个 Pass 中,我们会把物体的漫反射颜色、高光反射颜色、平滑度、法线、自发光、深度等信息渲染到屏幕空间的 G缓冲区。对于每个物体来说,这个 Pass 仅会执行一次。
(2)第二个 Pass 用于计算真正的光照模型。会使用上一个Pass中渲染的数据来计算最终的光照颜色,再存储到帧缓冲中。
默认的 G 缓冲区包含了以下几个渲染纹理(Render Testure,RT):
- RTO:格式是ARGB32,RGB通道用于存储漫反射颜色,A通道没有被使用。
- RT1:格式是ARGB32,RGB通道用于存储高光反射颜色,A通道用于存储高光反射的指数部分。
- RT2:格式是ARGB2101010,RGB通道用于存储法线,A通道没有被使用。
- RT3:格式是ARGB32(非HDR)或ARGBHalf(HDR),用于存储自发光±lightmap+反射探针(reflection probes)。
- 深度缓冲和模板缓冲。
④Unity延迟渲染中可以使用的内置变量
可使用的内置变量和函数可以在 UnityDeferred Library.cginc 文件
6、顶点光照(Vertex Lit Rendering Path)
旧了,不太使用了。更多比较可以查看官方文档:https://docs.unity3d.com/cn/current/Manual/RenderingPaths.html 。
7、前向渲染的Unity实现
如果我们想要修改 Unity前向渲染中的逐像素渲染的个数的话,Edit -> Project Settings -> Quality -> Pixel Light Count,默认是 4。可以自行修改。