版本4.23.1
- GPUParticles Perpass
UE4渲染一个场景首先会进行GPU粒子的预pass,主要是进行粒子系统的模拟
2. 场景的perpass
通过这一次场景的perpass,会生成场景的Depthbuffer
值得注意的是,虚幻4是,对于Z取反了的,越近 取值为1,越远越接近为0。这样可以在深度范围内实现更高的精度(浮点数的表示),并减少远处网格物体上的z-fighting。可用于虚幻4的延迟贴花渲染,ssr,ssao之类的
3. ComputeLightGrid(Light assignment)
计算光源的的覆盖网格,跟分簇渲染的光源渲染方式类似,计算每个光源的影响范围
5个光源 2个反射probe
4. shadowFrusumQueries
//可能是为了提升shadowmap的精度,查询阴影视椎体。
5. BeginOcclusionTests
遮挡测试,也是一个比较大的环节。
viewOccusionTest, z注意到其中除了view的测试,还有shadowFrusumQueries,也是为了剔除掉不在view和shadowview共同视锥体下的object
虚幻4的剔除默认使用的是hardware occlusion querises方式
1)渲染场景的所有东西到depth bufer。
2)创建occlusion query,用以判断object是否被遮挡。Queuery会返回通过z-test的像素数量,如果像素为0,则说明完全被遮挡。通常来说渲染整个pop mesh进行遮挡测试是相当昂贵的,所以通常仅适用prop的边界作为判断依据。
3)将查询结果回传到CPU,来决定submit哪些prop到GPU端进行渲染。(即使只有很小的像素被覆盖也有可能进行提交渲染,另一个方面也说明,渲染的模型不要很大很大整个,这样会导致即使有很小的一角没被遮挡,整个pop也会提交渲染)
这样的方式缺点就在于依然是由“drawcall”以及CPU-GPU的数据上传带宽,数据同步的问题。从GPU到CPU数据传输是很慢的。
CPU-GPU同步之间,一般都是有帧缓存的,所以UE跟其他一样,采取的queries的方式,一次提交多帧进行pass,也就是说我们可能还是会submit到没有出现在当前场景中的props
(实际中,还会使用相机视锥体去进行遮挡剔除,所以也不是很大的问题)。这个问题并不容易解决,UE4采用了如下方式去 缓解:首先渲染所有不透明的物体到z-buffer,之后为每个props单独进行遮挡测试,最后,在每一帧的结尾从前一帧或后一帧,查询检索数据,并确定props的可见度,如果可见,则标记为下一帧可渲染。(跟图片上对应的,所显示group queries然后是individual queries)另一方面来说,如果没通过,那么就会加到最多8一个一组的group中,进行更大的boundingbox 判断,如果下一帧这个group变得可见,那么会进行拆分进行单个的可见性判断
6. Hi-Z buffer generation
像mipmap一样的分层次 精度的Z-buffer
7. shadow rendering
为各种光源生成shadowmap,cascaded map
虚幻4采用的altas的方式收集渲染到一张shadowmap上,而对于动态的点光源,虚幻4采用的是传统的cubemap方式。对于stationary 光源进行性能测试时,最好先bulid,不然虚幻4可能仍会当做移动光源渲染cubemap
8. Volumetric Fog
UE4实现体积雾通过以上三步
1)InitializeVolumeAttributes 计算并存贮fog参数到体积纹理,并且存贮一个全局的发光强度到第二个体积纹理。
2)Lightscattering 结合方向光的阴影,天空光照,局部光照计算每个cell的光源散射(也是有TAA和Computeshader 的输出的)
3)FinalIntegration ,简化Z轴的光源匹配3Dtexture,计算散射光以及透过率
9. G-prepass
可以看出UE4先渲染的是SKY,虽然一般可能最后渲染sky,因为sky最远,很多像素上其实最后还是要被覆盖的,但是由于前面已经有Z-pass了,所以可以利用zbuffer,渲染sky
Gbuffer使用的rendertarget


还有E留给custom Data
还可以从输入中看到许多预计算的信息
10 Velocity rendering
计算移动props到分散的buffer中,屏幕上二维的动量,所以精度可以高一些使用R16G16的buffer,用于像 TAA,动态模糊之类的
11 Ambient Occlusion

AmbientOccusionSetup主要是为了ambitentOccusionps提供1/4分辨率normal(depthbuffer由之前的hi-zbuffer提供),会有随机采样加抖动的方式来进行AA
12 Lighting
虚幻4照亮半透明物体,采用的是插入2x64x64x64,RGB16的体纹理,两张纹理存放球谐函数的参数,每个光源的近似方向等等。对于近的物体采用高分辨率,而对于较远的物体就采用级联阴影的方式。
虚幻4会将光源分为两组,一组nonshadowlights,一组shadownedlights
NonshadowLights分为两周经,sample light(粒子效果使用的灯光),非阴影的普通场景灯光。两者之间的区别是 普通场景灯会使用深度包围测试,近似避免光照像素超出光源体积。另一个区别是场景光源不会写到半透明光源体积中。
对于shadowedlights
首先计算屏幕空间的阴影(shadowProjectionOnopaque),之后它会被插入对于光源的贡献(InjectTranslucentVolume)到半透明光源体积最后计算场景光源(standarddeferredlighting)
13 Image sapce lighting
SSR 屏幕空间反射
UE用的光线匹配方式,利用computeshader计算SSR
UE4还有静态的反射预计算,可以从上图中缺少了moveable的椅子,而static桌子还在
Fog and atmospheric effects
Transparency rendering
半透明物体渲染,
Ue4有两次 Transaprency
一次是场景的半透明物体,一次是粒子系统中的半透明粒子
在渲染场景中普通的半透明物体时,也会受环境光照,直接光照,bake贴图等的影响,使用复杂的半透明shader。
计算particle 的时候,也会像半透明物体一样,在顶点计算大气散射,雾等
Distortion
进入distortion 后分为两步
1)distortionaccum,所有的半透明物体和粒子将重新pass,写入distortion vector到resolutionbuffer中用于第二步计算折射。
2)Distortionapply,也就是 refraction calculation,在这一步进行折射的计算,输出一张refraction的texture。在这一步中有两次pass,一次添加refraction,一次添加粒子。
14. Post processing
虚幻4有大量的后处理,TAA,motion blur,bloom,tonemap。
虚幻4的TAA是用两次pass,一次直接blenderfactor 融合history,另一次将当前帧与historybuffer再次融合,factor为0.25,应该是为了减少ghosting。
