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

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

相关文章:

  • 【漫话机器学习系列】094.交叉熵(Cross-Entropy)
  • 【LeetCode】15.三数之和
  • Java 实现简单动态字符串
  • 机器学习--逻辑回归模型
  • MyBatis映射文件常用元素详解与示例
  • 青少年编程与数学 02-009 Django 5 Web 编程 16课题、权限管理
  • 【2025最新计算机毕业设计】基于SpringBoot+Vue药管家家庭医药品回收系统【提供源码+答辩PPT+文档+项目部署】
  • 论文阅读_用于低频隔振的高负刚度新型阵列磁性弹簧的分析与设计_1
  • MySQL智障离谱问题,删了库确还存在、也不能再创建同名库
  • linux kasan 使用举例
  • Spring-AOP
  • Windows Docker运行Implicit-SVSDF-Planner
  • Python 面试常见问题解析
  • DockerDesktop更改默认的磁盘镜像地存储位置
  • 使用python进行数据分析工作,要掌握哪些数学知识?
  • Linux下学【MySQL】常用函数助你成为数据库大师~(配sql+实操图+案例巩固 通俗易懂版~)
  • Java8新特性Optional,Function,Supplier,Consumer
  • 计算机网络之网络层(网络层的功能,异构网络互联,路由与转发,SDN基本概念,拥塞控制)
  • 【办公类-90-01】】20250213中班周计划四类活动的写法(分散运动、户外游戏、个别化(美工室图书吧探索室))
  • Redis过期机制
  • 新华时评:防范安全事故须臾不可放松
  • 是否进行了及时有效处置?伤者情况如何?辽阳市相关负责人就饭店火灾事故答问
  • 看见“看得见的手”,看见住房与土地——读《央地之间》
  • 中国海油总裁:低油价短期影响利润,但也催生资产并购机会
  • 澎湃读报丨解放日报9个版聚焦:上海,加快建成具有全球影响力的科技创新高地
  • 习近平就伊朗发生严重爆炸事件向伊朗总统佩泽希齐扬致慰问电