来源:《UNITY SHADER入门精要》
我们如果要在 Shader 中计算光源,我们需要为每一个 Pass 指定它所使用的渲染路径,这样才能访问到特定内置变量存储的光源信息。
Unity中目前保有 4 种渲染路径:
1、Deferred Shading Rendering Path(延迟渲染)
2、Forward Rendering Path(前向渲染)
3、Lagacy Deferred Lighting Rendering Path(遗留的延迟光照)
4、Vertex Lit Rendering Path(顶点光照)
我使用的是 Unity 2021.3.4f1c1 版本,俺已经找不到全局和摄像机RendingPath的设置位置了。
对于每个 Pass 的 LightMode 标签,Unity 支持以下的渲染路径设置:
每一次完整的前向渲染,我们需要 ①渲染该对象的渲染图元②计算颜色缓冲区③计算深度缓冲区。而且,对于每一个不同的光源,我们都要进行一次 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 的方式处理。
Blend One One
。
延迟渲染主要包含了两个 Pass。在第一个 Pass 中,我们不进行任何光照计算,而是仅仅计算哪些片元是可见的,这个主要通过深度测试实现,然后进行深度缓冲。当发现一个片元会是可见的,我们就会把相关的信息储存到 G-Buffer 中。然后,在第二个 Pass 中,我们利用 G-Buffer 中各个片元信息,例如:表面发现、视角方向、漫反射系数等,再进行光照计算。
延迟渲染使用的 Pass 数目通常就是两个,这跟场景中包含的光源数目没有关系。换言之,延迟渲染的效率不依赖于场景的复杂度,而是和我们使用的屏幕空间大小有关。这是因为,我们需要的信息都存储在缓冲区中,而这些缓冲区可以理解成是一张张2D图像,我们的计算实际上就是在这些图像空间中进行的。
(1)第一个 Pass 用于渲染 G 缓冲。在这个 Pass 中,我们会把物体的漫反射颜色、高光反射颜色、平滑度、法线、自发光、深度等信息渲染到屏幕空间的 G缓冲区。对于每个物体来说,这个 Pass 仅会执行一次。
(2)第二个 Pass 用于计算真正的光照模型。会使用上一个Pass中渲染的数据来计算最终的光照颜色,再存储到帧缓冲中。
默认的 G 缓冲区包含了以下几个渲染纹理(Render Testure,RT):
可使用的内置变量和函数可以在 UnityDeferred Library.cginc 文件
旧了,不太使用了。更多比较可以查看官方文档:https://docs.unity3d.com/cn/current/Manual/RenderingPaths.html 。
如果我们想要修改 Unity前向渲染中的逐像素渲染的个数的话,Edit -> Project Settings -> Quality -> Pixel Light Count,默认是 4。可以自行修改。