Sorry, your browser cannot access this site
This page requires browser support (enable) JavaScript
Learn more >

延迟渲染路径

一、延迟照明渲染路径处理光照的方式

延迟渲染路径对光照数量没有任何限制,并且所有灯光都可以采用逐像素渲染。 理论上来说,即使场景中有成百上千个实时灯光,依然可以保持比较流畅的渲染帧率

它支持法线纹理,阴影等效果处理;但是它不能处理半透明物体,并且不支持真正的抗锯齿。 这些会自动的使用前向渲染路径

延迟渲染路径的效率不依赖于场景的复杂,而是和我们使用的屏幕大小有关。 因为延迟渲染路径中除了使用颜色缓冲和深度缓冲外,还会利用一个叫做 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")

评论