CryEngine3中的延迟渲染
说明
《孤岛惊魂》游戏之后,我们改变了早期的使用Z-pass来输出像素的Z值来做Alpha test和把不透明的几何体渲染到纹理,我们通过延迟处理的方式做了一些功能。我们开始使用一个R16f格式的纹理来提供一个更好品质,但并不是所有硬件都支持。R16G16f格式可以被很好的支持,但当时的对于Nvidia是一个并不是一个原生的格式。R32f有着很好的质量并被所有硬件支持,同样速度也很快。如果硬件能访问原生的Z-Buffer则这种格式是首选的。这样会在生成数据(双倍的Z值读写性能)得到更快的渲染,并且更少的内存需求,同时得到更好的图像质量。但是这样会由于z-buffer可能不会直接的返回线性的Z值而使访问变得有些复杂
每个像素拥有Z值可以带来更多的功能和效果:
延迟的生成阴影遮盖
软粒子的Z裁剪
全局体积雾效
深度域效果
动态模糊效果
补光灯(在CryEngine2中用来变暗或照亮周围)
屏幕区域环境光闭合
通过哦使用延迟着色技术,我们可以将复杂的集合场景从shader中分离出来。例如,通过shadow mask shader在场景中所有不透明物体渲染前生成阴影遮盖。这个shader使用位置插值的shadowmap来输出阴影来构建阴影遮盖。这个drawcall的繁重的pass被一个延迟的pass所替代来通过存储的像素深度值来重新建立shadowmap中的位置而不是通过为场景中所有物体执行多次drawcall来进行。只会调用一次屏幕区域的drawcall。
引擎中渲染图像的例子
Gbuffer的线性Z值。
从Gbuffer数据生成阴影遮盖
通过Gbuffer数据生成SSAO
有用的控制台命令
r_UseZPass
切换Z pass
用法:r_UseZPass [0/1]
默认值为1(开启)。设置为0来关闭z-pass
r_DeferredShading
切换延迟着色
用法:r_DeferredShading [0/1/2/3]
0 – 关闭
1- 开启(默认)
2- 开启interleaved/tiled 渲染测试(不要使用)
3- 为所有灯光添加延迟pass