GPU Gems1 - 15 逐像素光照的可见性管理

这章讲到了可见性在逐像素渲染光照场景中的作用,也考虑如何使用可见性减少必须渲染的批次数量,从而改善性能。

假设一个非常简单的场景,一个房间,因为房间的不同部位是不同的材质,所以将其分为8个batch,另外在房间中还有3个不同的模型,每个模型又分成两个batch,房间里还有3个光源。

对于此场景,为了建立场景的深度值和应用环境或发射光照,必须将所有的batch渲染一次,即 8 + 3*2 = 14.针对每个光源,为阴影要渲染一次,为真实的光照再渲染一次,因此这个简单场景所需的总批次为:14 +  14 * 3 + 14 * 3 = 98.

如下伪代码说明在一个场景中必须渲染的批次数:

For each visible object
  For each pass in the ambient shader
    For each visible batch in the object
      Render batch
For each visible light
  For each visible shadow caster
    For each pass in the shadow shader
      For each shadow batch in the object
        Render batch
  For each lit visible object
    For each pass in the light shader
      For each visible batch in the object
        Render batch

正如伪代码所述,为了减少批次数,可以进行一些与非可见性相关的优化。最应该优化的是渲染每个光照所必须的通道数。批次数随通道数线性增加,因此,我们应该最小化受限于CPU的游戏通道数。

我们可以使用可见性来减少批数。其中,为了减少批次,各个部分(可见部分、光源部分、光照部分、阴影部分)的集合分开讨论并生成。

  • 可见集合:由摄像机的视点可见的所有物体组成,定义为V。
  • 光源集合:由光源位置作为视点出发,光源可见物体的集合L。
  • 照明集合:V和L的交集I,即既在摄像机可见,又能接收到光源光照。
  • 阴影集合:L的一个子集S,它包括向可见区投射阴影的所有物体。如下图所示,V视椎外的shadow Caster投射的阴影确在V中,这个shadow caster就属于集合S

     

对于集合S如何确定,本文介绍了convex hull(光源的凸包)如何计算,如下图所示:

可见性不仅能有效改善CPU的性能,也同样可以改善GPU的性能。对模板体执行逐像素光照时,填充率的消耗(模板体的填充或多次渲染大的物体)很快就变成了瓶颈,但可以使用剪切矩形(scissor rectangle)限制显卡渲染的面积,解决此问题。(这段没太看懂)

逐像素的照明需要大量的批次数和极高的填充率,所以要减少渲染的物体数和它们影响的屏幕面积。而使用这章中介绍的标准可见性算法和技术,可以充分改善运行性能。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值