Unity CommandBuffer绘制粒子系统网格显示

CommandBuffer是 Unity 提供的一种在渲染流程中插入自定义渲染命令的机制。在渲染粒子系统时,常规的渲染流程可能无法满足特定的渲染需求,而CommandBuffer允许开发者灵活地设置渲染参数、控制渲染顺序以及执行自定义的绘制操作。通过它,可以精确地定义如何将粒子系统的网格渲染到指定的目标纹理上,实现一些特殊的视觉效果或性能优化。

实现原理:

通过模拟粒子系统的状态,将粒子系统的网格信息烘焙出来,然后利用 CommandBuffer 自定义渲染流程,将烘焙好的网格渲染到指定的 RenderTexture 上。通过控制粒子系统的模拟频率和渲染流程,可以实现对粒子系统渲染的精确控制。

实现过程:

首先需要准备一张RT,用于显示后别好的网格

准备一个粒子系统的材质球,在项目中可根据实际选择对应的shader已后续需要设计的材质属性,选择Unlit/Texture shader,并给主贴图赋值

粒子就变成了如下的样子:

然后新建空物体,新建一个脚本,并将脚本挂载到空物体上,并设置参数如下:

新建一个RawImage用于显示RT的内容,并将RawImage的Texture赋值上述建立的RT

扫描二维码关注公众号,回复: 17582132 查看本文章

结果:

代码分析:

首先是在Update方法中按照一定的速率驱动粒子系统更新,然后烘焙粒子的mesh,之后调用CommadBuffer绘制

    // 模拟根粒子系统的更新
    _rootParticleSystem.Simulate(_updateRate, true, false, false);
    // 为每个渲染器烘焙网格
    for (int i = 0; i < _allSystemRenderers.Length; i++)
    {
        _allSystemRenderers[i].BakeMesh(_meshes[i], false);
    }
    // 调用_drawNow方法进行绘制
    _drawNow();

在drawNow方法中,进行CommandBuffer命令的装载:

      CommandBuffer cmd = new CommandBuffer();

      // 设置视图矩阵,用于确定相机的位置和方向
      cmd.SetViewMatrix(Matrix4x4.TRS(new Vector3(0.0f, 0.0f, -10.0f), Quaternion.identity, Vector3.one));
      // 设置投影矩阵,用于确定相机的投影方式
      cmd.SetProjectionMatrix(Matrix4x4.Ortho(-_virtualCameraSize, _virtualCameraSize, -_virtualCameraSize, _virtualCameraSize, 0.1f, 10.0f));

      // 设置渲染目标为输出纹理
      cmd.SetRenderTarget(_outputTexture);
      // 如果需要在绘制时清除渲染目标,则清除渲染目标
      if (_clearOnDraw)
          cmd.ClearRenderTarget(true, true, _clearColor, 1.0f);

再调用DrawMesh方法绘制网格:

 for (int i = 0; i < _meshes.Count; i++)
 {
     cmd.DrawMesh(_meshes[i], Matrix4x4.TRS(new Vector3(x * _wrapSize, y * _wrapSize, 5.0f),
                                               Quaternion.identity, Vector3.one),
                  _allSystemRenderers[i].sharedMaterial, 0, 0, _mirrorBlock);
 }

最后执行命令缓冲区中的所有命令:

Graphics.ExecuteCommandBuffer(cmd);

参考链接:

The power of command buffers in Unity | JellyCar Worlds - YouTube