延迟渲染与前向渲染
前向渲染或叫正向渲染,每一个图元都经过顶点着色器,图元着色器,片段着色器,在片段着色器内连同光照一起计算,效率和图元数量有关。
延迟渲染会先计算出G-BUFFER,就是不含光照计算,但有光照需要的信息的BUFFER,最后在一个片段着色器内进行一次光照计算,效率和屏幕像素有关。
http://m.elecfans.com/article/651416.html 比较概括
https://learnopengl-cn.github.io/05 Advanced Lighting/08 Deferred Shading/ 比较详细
https://www.cnblogs.com/wangchengfeng/p/3440097.html
https://blog.csdn.net/taotaoah/article/details/52633822
https://zhuanlan.zhihu.com/p/39464715
G-Buffer
Geometry Buffer,亦即“几何缓冲”。区别于普通的仅将颜色渲染到纹理中,G-Buffer指包含颜色、法线、世界空间坐标的缓冲区,亦即指包含颜色、法线、世界空间坐标的纹理。
一般还有 Albedo反射率 Specular镜面反射
Base Pass
对非透明的物体进行演算并填充到GBuffer,使用缓冲区可视化模式可以在视图中看到效果。几乎所有的延迟渲染都受到其影响,因此才叫基础通道。
其计算结果包括base color, metallic, specular, roughness, normal, sss profile,并且Decals、Fog以及Velocity的计算也在此处。
其开销受到屏幕空间尺寸、物体数量、面数、Decals的数量、Shader的复杂度,生成的过程中包含光照贴图的推送,因此也会受到光照贴图的大小的影响。
可以通过Stat rhi指令检查各种贴图和triangle的消耗。
Deferred Decal Buffer 延迟贴花缓冲
在完成正常的G-Buffer渲染后,即可得到对应的Buffer,但是此时仍没有进行光照计算,这时就需要将Decal渲染到对应的Diffuse(Albedo) buffer中(UE4里应该是BaseColor)。
为了实现Decal,这里需要在G-Buffer后再增加一个Pass,并使用Diffuse buffer作为Render target,并使用Decal shader进行渲染,计算并更新Decal所能够影响到的那些像素。
https://blog.csdn.net/ZJU_fish1996/article/details/86852579 贴花的计算方法
大致流程:利用GBUFFER里的深度,坐标,经过一系列局部空间转全局空间坐标变换
DBuffer Decals
是否在Base Pass之前将decals属性累积到缓冲区
D-Buffer贴花正确影响光照贴图和天空照明
不像常规的延迟贴花
D-Buffer启用prepass开启
更改此设置需要重新启动编辑器
whether to accumulate decals properties to a buffer before the base pass
dbuffer decals correctly affect lightmap and sky lighting
unlike regular deferred decals
dbuffer enabled forces a full prepass
changing this setting requires restarting the editor
从引擎渲染路径分析
UE4使用reverse-Z来保存深度,意味着近裁面的深度值为1,远裁面的深度值为0。这使得深度缓冲的精度更高,避免在远处发生z-fighting的现象。从该pass的名字可以看出这一步是由“DBuffer”触发的。DBuffer是UE4用来保存延迟贴花(deferred decal)的缓冲,这一步需要场景深度,所以会启动Z-prepass