延迟渲染路径
一、延迟照明渲染路径处理光照的方式
延迟渲染路径对光照数量没有任何限制,并且所有灯光都可以采用逐像素渲染。 理论上来说,即使场景中有成百上千个实时灯光,依然可以保持比较流畅的渲染帧率
它支持法线纹理,阴影等效果处理;但是它不能处理半透明物体,并且不支持真正的抗锯齿。 这些会自动的使用前向渲染路径
延迟渲染路径的效率不依赖于场景的复杂,而是和我们使用的屏幕大小有关。 因为延迟渲染路径中除了使用颜色缓冲和深度缓冲外,还会利用一个叫做 G 缓冲的额外缓存区 它会储存我们关心的表面(通常是离摄像机最近的表面)的其他信息,比如表面的法线、位置、材质属性等等 总之,我们需要的信息都存储到缓冲区中,而这些缓冲区可以理解为一张张 2D 图片,我们实际上是在这些图像空间中进行处理
二、延迟照明渲染路径在哪里进行光照计算
要进行光照计算,那肯定是在 Shader 中的 Pass 进行计算 延迟渲染路径中主要包含两个 Pass
- 第一个 Pass 主要判断哪些片元可见,并且将可见片元的相关信息存储到 G 缓冲区中 比如:表面法线、视角方向、漫反射系数等等数据
- 第二个 Pass 将光照模式设置为 Deferred
Tags{"LightMode" = "Deferred"}利用 G 缓冲区中的各个片元的相关信息进行真正的相关计算,最终将颜色写入颜色缓冲区
注意: 在第二个 Pass 中计算光照时,默认情况下只能使用 Unity 内置的标准(stander)光照模型计算
三、延迟照明渲染路径的内置光照变量
常用的内置光照变量
| 变量名 | 类型 | 描述 |
|---|---|---|
| _CameraGBufferTexture0 _CameraGBufferTexture1 _CameraGBufferTexture2 _CameraGBufferTexture3 ··· |
sampler2D | (#include "UnityGBuffer.cginc") 这些变量是自定义变量,我们一般无需实现延迟函数中的第一个 Pass,G 缓冲中的相关数据 Unity 会帮助我们储存到这些自定义的变量中,我们可以直接使用他们来参与计算: _CameraGBufferTexture0:漫反射颜色(RGB),遮挡(A) _CameraGBufferTexture1:镜面反射颜色(RGB),粗糙度(A) _CameraGBufferTexture2:世界空间法线(RGB),未使用(A) _CameraGBufferTexture3:发射+光照+反射探针缓冲区 _CameraGBufferTexture4:光照遮挡指(RGBA)··· |
| _LightColor | float4 | 光源的颜色(#include "UnityDeferredLibrary.cginc") |
| _LightMatrix0 | float4x4 | 世界空间到光源空间的变换矩阵(#include "UnityDeferredLibrary.cginc") |