UP | HOME

OffscreenParticles

Table of Contents

OffscreenParticles note.

<!– more –>

OffscreenParticles

原理

降低渲染粒子使用的 RenderTarget,从而减少粒子渲染的开销。该方法还适用于其他透明物体的渲染。

实现

downsampling depth

渲染离屏粒子时,如果直接对高分辨率的 depth rt 进行点采样,来做深度剔除,会使得边界上的锯齿比较严重。对 depth rt 进行 Downsampling,并且选取采样范围内深度最大的值作为深度,此时离屏渲染粒子时,粒子和物体交界处,即使粒子在物体后面也会显示粒子,由于粒子的 alpha 混合可以一定程度减弱边界上的锯齿。

offscreen particles

假设 blend 操作为 Blend SrcAlpha OneMinusSrcAlpha,可以推导出如下混合公式:
P3 = D(1-A1)(1-A2)(1-A3) + S1A1(1-A2)(1-A3) + S2A2(1-A3) + S3A3

为了将 (1-A1)(1-A2)(1-A3) 累计到 ParticleRT 的 alpha 通道,渲染粒子时将 RGB 的混合操作和 Alpha 的混合操作分开:
RGB 使用 Blend SrcAlpha OneMinusSrcAlpha
Alpha 使用 Blend OneMinusSrcAlpha One
RGB BlendOp 使用 BlendOp.Add
Alpha BlendOp 使用 BlendOp.Multiply

另外,开始渲染粒子前 ParticleRT 使用 (0, 0, 0, 1) 进行 Clear。

combine

混合 ParticleRT 和 ColorRT(场景颜色) 时,ParticleRT.rgb + ColorRT.rgb * ParticleRT.a

缺点

  1. 需要申请额外的 LowDepthRT ParticleRT, 还需要对深度进行 downsampling 以及合并操作, 这些都导致带宽消耗增加。当粒子所占屏幕面积不大时,粒子 Overdraw 不严重时,可能会导致负优化。
  2. 当分辨率降低比较多时,粒子和物体交界处的锯齿比较明显。
  3. 还需要对原来粒子的混合方式做修改,增加粒子材质的复杂性,导致后续维护成本增加。

参考资料