UE4实时渲染——渲染前和遮挡

上一节:UE4实时渲染需要注意的点——RTR(Real Time Rendering)

实时渲染一般由三个主要线程构成:
1、CPU线程
2、Draw线程(主要由CPU运算,部分由GPU运算)
3、GPU线程

本节主要介绍部分的CPU线程工作 ,以及Draw线程中的遮挡剔除工作
GPU线程渲染工作将在其他节中讲述。

CPU线程:

在交给GPU渲染之前,CPU会进行大量的计算,主要计算包括:
1、动画
2、模型和对象的位置
3、物理效果
4、人工智能
5、对象的生成和销毁、显示或隐藏
但这里不多介绍这些,因为这个系列是介绍实时渲染,而不是幕后的具体逻辑运算。

Draw线程:

CPU计算后,我们得到了所有对象和模型的位置,以及所有我们想要在CPU运算出来的信息,但这还不能进行渲染,因为我们不可能把所有的信息都渲染出来,这样性能是吃不消的,我们必须有选择的把必要信息渲染出来即可,那么这里就用到了一个Draw的线程(主要由CPU运算,部分由GPU运算,但这里我们假设全是CPU运算)。

Draw线程——遮挡剔除
既然提到“有选择性的”,那么就要用到遮挡剔除的相关技术来屏蔽掉那些当前帧不需要渲染的事物。
遮挡是按照对象来的,而不是按照多边形。
一般,遮挡剔除分为4个步骤:(这四个步骤通常结合使用,结合在一起使用通常会让之后的渲染更加高效),经过这4个步骤后,会类似的形成两个表,一个是可见对象的表,另一个是不可见对象的表。
1、距离剔除:
比较暴力地,将距离摄像机X距离以外的对象(你可以为,这个或这组对象设置距离剔除属性)剔除掉,但默认情况下,距离剔除是不开启的,你需要手动去开启,效果如下:
在X距离内:
在X距离内
在X距离外:
在X距离外

2、视锥体剔除:
视锥体剔除是没有办法关闭的,它时刻都是开启的。
效果如下:
(左图为Viewport,右图为摄像机视野)
我们可以清晰的从右图中看到,视锥体剔除,是以对象为单位的,而不是以多边形为单位。就算同一个对象,一部分在视锥体内,一部分在视锥体外,它也会被保留在空间中不被剔除。
在这里插入图片描述

3、预计算可见性:
不会在默认情况下开启,与距离剔除一样,需要手动开启。
这个功能开启后,将会将世界分割成多个3D单元网格盒(盒子大小可以调整),当camera处于某个网格盒中时,如果询问引擎哪些对象可见,引擎会将一个预计算的对象列表返回给你,告诉你在这个网格盒的位置时,哪些对象可见,哪些对象不可见。效果如下:
在这里插入图片描述
在这里插入图片描述

4、遮挡剔除:
(最精确,通常处理大部分工作,但也是放在最后的原因)
它会精确的计算每个模型的可见性状态,做法类似于遍历所有的未被先前步骤剔除的对象,类似这样:

foreach(all objects)
{
	if(我可以看见这个对象)
	{
		设置该对象可见
		continue;
	}
	else
	{
		设置该对象不可见
		continue;
	}
}

这也是为什么这一步,遮挡剔除,所消耗的性能很大的缘故。
(我们可以使用Freezerendering命令,来对比遮挡剔除前后的效果,Freezerendering作用,根据camera所处的位置以及遮挡效果,让世界渲染效果冻结在当前时空)
效果如下:
遮挡剔除之前
在这里插入图片描述
当我们把camera移动到"翅膀"这里时,我们可以看到,其实很多对象都已经不见了,所以我们也不应该渲染这些看不到的对象了,这时我们开启Freezerendering
在这里插入图片描述
开启Freezerendering,把camera远离翅膀后,我们可以看到一些对象,确实没有在渲染了,包括背后的对象。但有一些还在,包括外景中的树,以及右边的窗户(因为Freeze时他们确实出现在Viewport中,所以他们不能剔除掉),包括远处的山、天空、地面地形(他们太大了,如此庞大的对象,一般设置为一直渲染,不会选择剔除)
在这里插入图片描述
----------------------四种剔除介绍完毕-----------------

有一个命令为“stat Initviews”,有助于我们看这些剔除的工作状态,输入后可以打开这样一个界面,这个界面为我们显示,当前位置和角度的camera,剔除的相关信息:
在这里插入图片描述
图片看不太清,我这里列一下:
比较重要的:
Counters:
Processed Primitives:809
当前角度809个对象

Frustum Primitives:339
有339个对象因为视锥体剔除

Staticly Occluded Primitives:55
静态遮挡图元有55个(也就是“预计算可见性”上面提到的蓝色的单元格)

----------------------归纳总结如下-----------------
1、距离剔除并不是默认设置,所以第一步我们要将距离剔除加上。这尤其有利于外景。

2、场景中如果超过1万个对象,这时就要谨慎处理,尽可能的剔除一些不可见对象。

3、这种影响主要是对CPU会产生瓶颈,也可能影响GPU。

4、大型开放式场景可能没法很好的应用遮挡,因为我们很容易就看到所有对象,如果能看到一切,我们就没办法隐藏,如果一切对象都在视野中,我们就没办法遮挡。

5、几乎任何可见对象都能被遮挡,包括粒子这类对象(粒子对象通过bounding box进行遮挡)。

6、大型模型很少被遮挡,并且会增加GPU的损耗。

7、将模型拼凑在一起会降低CPU运行效率,因为就算Viewport中显示这个拼凑好的大型模型中的一个像素点,这个大型模型也不会被剔除掉,虽然计算遮挡的工作量变少了(因为要检测遮挡的对象变少了),但是要渲染的内容变多了。
【这部分是视频原话,但我仍留存疑,如果说拼凑成大型模型,让计算遮挡的工作量变少了,那不就相当于CPU效率增加了吗?确实,渲染的内容变多了,但这只是给GPU增加了负担而已吧,我反复琢磨了他的原话,仍对此感到不解。我觉得他想表达的就是:没有完美的实时渲染过程,你要么减少CPU的效率,增加GPU的负担;要么增加CPU计算量,减少GPU的负担。
----------------------归纳总结End-----------------

Draw线程中的遮挡剔除计算后,会形成一个类似于可见对象的列表,并将这个可见对象的列表传输给GPU,进行下一步的渲染。

下一节:UE4实时渲染——几何结构渲染一

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值