当前位置: 首页 > article >正文

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

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

实现原理:

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

实现过程:

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

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

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

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

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

结果:

代码分析:

首先是在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


http://www.kler.cn/a/547573.html

相关文章:

  • 《Mycat核心技术》第14章:实现ER分片
  • VSCode配合cline实现自动编程
  • 5分钟掌握LM Studio本地部署DeepSeek R1
  • Spark 性能优化(四):Cache
  • 2025 (ISC)²CCSP 回忆录
  • 简述 tsconfig.json 中 rootDir 和 include 之间的关系
  • 设计模式——职责链模式
  • 【原理图与PCB专题】如果想要建立标准原理图有哪些思路?
  • ClickHouse的前世今生
  • 【ISO 14229-1:2023 UDS诊断全量测试用例清单系列:第十九节】
  • 集成测试总结文档
  • Node.js简介及vue项目与Node.js通信方法
  • 完全数和质数算法详解
  • HBase高级技巧:解锁更强大的数据处理能力
  • 用大模型学大模型05-线性回归
  • C++类的简单介绍
  • SolidWorks速成教程P3-6【零件 | 第六节】——草图封闭轮廓所选轮廓厚度为零的报错
  • Unity Shader Graph 2D - Procedural程序化图形循环的箭头
  • openmv vs canmv 特征点检测 在线例程对比
  • python包的管理