一、命令缓冲区 CommandBuffer

根据渲染模式的不同,Unity的渲染流水线如下:

其中蓝色的部分就是 CommandBuffer 可插入的部分,CommandBuffer 本质上就是做一个插入操作,以实现在 Unity 的某个渲染步骤完成后,执行你的额外操作

其中:

  • 可以通过 Camera.AddCommandBuffer 命令插入到 Camera Rendering 渲染队列,插入点为 CameraEvent enum. 枚举中的内容
  • 可以通过 Light.AddCommandBuffer 命令插入到 Light Rendering 渲染队列,它的插入点枚举是 Rendering.LightEvent

一个例子:如果你想将在天空盒渲染完后插入你的操作,那么对应的代码就是

var cam = Camera.current;
buf = new CommandBuffer();
buf.name = "bufName123";
//……
cam.AddCommandBuffer(CameraEvent.AfterSkybox, buf);

不过需要注意的是:针对 GPU 的不同,CommandBuffer 能插入的生命周期可能会有略微不同,部分可能不支持

二、Unity 生命周期渲染部分

Unity生命周期节选

渲染相关的生命周期介绍:

  • OnPreCull: 在相机剔除不可见对象前调用此函数
  • OnBecameVisible/OnBecameInvisible: 当挂有渲染组件的对象于相机可见/不可见时调用此函数(例如进入/离开摄像机视野)
  • OnWillRenderObject: 如果对象可见,在物体渲染之前会调用此函数
  • OnPreRender: 在相机开始渲染场景之前调用此函数
  • OnRenderObject: 在完成所有常规场景渲染后调用此函数,此时可使用 GL 类或 Graphics.DrawMeshNow 绘制自定义几何图形
  • OnPostRender: 在相机完成场景渲染后调用此函数
  • OnRenderImage:在相机完成渲染后调用此函数,可以在此修改摄影机的最终图像(后处理)
  • OnGUI: 响应 GUI 事件,如果一帧有多个 GUI 事件就会响应多次
  • OnDrawGizmos 用于在场景视图中绘制小图示(Gizmos)以实现可视化目的

为什么要讲这个,因为后面对于不同的效果实现,需要在正确的生命周期下完成 CommandBuffer 的相关操作

注意:部分生命周期需要专业版的 Unity 才提供

三、最简单的 CommandBuffer 例子

代码如下,其中 CommandBuffer 中使用的 Shader 输出纯绿色

  • CommandBuffer.DrawRenderer:使用指定的材质,绘制目标对象
using UnityEngine;
using UnityEngine.Rendering;[ExecuteInEditMode]
//加上ExecuteInEditMode后,下面的代码在编辑模式中就会运行,无需每次测试都要play了
public class GreenCube: MonoBehaviour
{public Shader shader;private Material material;CommandBuffer buffer;private void OnEnable(){buffer = new CommandBuffer();material = new Material(shader);//CommandBuffer.DrawRenderer:使用指定的材质,绘制目标对象buffer.DrawRenderer(GetComponent<Renderer>(), material);Camera.main.AddCommandBuffer(CameraEvent.AfterForwardOpaque, buffer);}public void OnDisable(){if (Camera.main)Camera.main.RemoveCommandBuffer(CameraEvent.AfterForwardOpaque, buffer);Object.DestroyImmediate(material);}
}

这个脚本挂在你要渲染的 Cube 下,这个 Cube 就会额外执行你的渲染指令:

可以看到,Game视图中的正方体已经是绿的了

在 FrameDebug 中也可以看到:Cube 被渲染了两次,第二次就是 CommandBuffer 中我们自己的额外渲染命令

参考资料:

  • https://docs.unity3d.com/ScriptReference/Rendering.CommandBuffer.html
  • https://docs.unity3d.com/Manual/GraphicsCommandBuffers.html
  • https://blog.csdn.net/u012740992/article/details/88795640
  • https://www.cnblogs.com/tiancaiwrk/p/12455578.html

UnityShader20:CommandBuffer初见(上)相关推荐

  1. UnityShader20.1:CommandBuffer初见(下)

    接上文:UnityShader20:CommandBuffer初见(上) 四.复杂一点的例子-- CommandBuffer代码参考如下: using UnityEngine; using Unity ...

  2. UnityShader25:在Unity中实现泛光

    一.需要提前了解的 这一章的例子非常的综合,可以说是知识点广而全,如果能独立在 Unity 中实现一个不错的泛光效果,那么 UnityShader 就算作入门成功!本章没有新的东西 曾经在 OpenG ...

  3. UnityShader24:最简单的屏幕后处理例子

    一.需要提前了解的 其实关于屏幕后处理(Screen Post-processing Effects)相关的知识,前面已经提过了不少: 这些是 OpenGL 渲染部分: OpenGL基础35:帧缓冲( ...

  4. Linux - 收藏集 - 掘金

    Linux 基础之常用命令篇 - 后端 - 掘金 最近一段时间工作实在是太忙了,所以好久没有写文章了,趁着周末把linux 的相关知识,整理了下.这一篇文件主要记录了一些linux的基础命令.需要读者 ...

  5. 关于Mongodb的全面总结,学习mongodb的人,可以从这里开始!

    转载地址:http://blog.csdn.net/he90227/article/details/45674513 原文地址:http://blog.csdn.NET/jakenson/articl ...

  6. 使用commandbuffer绘制并且blit到屏幕上

    master_commandbuffer分支 f3608cd94cc9302a12c272496408a439b6001c3c using System.Collections; using Syst ...

  7. 寂寥的雨花,打在你的遮阳伞上,回忆,是那样刻骨铭心,若如初见。你,与我相爱了半生,却让我下半生寂寞地守候你,你的离开,是为了自己翱翔天空的梦想,是为了在天空,也能种下我们相思相爱的杜鹃雨。 而我,只

    寂寥的雨花,打在你的遮阳伞上,回忆,是那样刻骨铭心,若如初见.你,与我相爱了半生,却让我下半生寂寞地守候你,你的离开,是为了自己翱翔天空的梦想,是为了在天空,也能种下我们相思相爱的杜鹃雨. 而我,只能 ...

  8. AOP之PostSharp初见-OnExceptionAspect

    PostSharp 这个静态植入的aop框架我就不多说了,在以前的aop文件,我们也尝试用MSBuild+Mono.Cicel理解静态植入AOP的原理.最近公司准备购买Postsharp做一些AOP, ...

  9. Github上传大于100M文件:LFS

    文章目录 Git 简介 创建项目并推送文件 推送大文件Git Large File Storage (LFS) Reference 猜你喜欢 写在后面 Git 简介 Git是目前世界上最先进的分布式版 ...

最新文章

  1. 全文检索工具迅搜的安装和体验(可用于自建中文全文搜索引擎)
  2. 艾宾浩斯记忆表格excel_好的记忆方法是一切学习的关键(艾宾浩斯记忆法)
  3. 使用WPF动画编程的几点注意事项[转]
  4. 2018,腾讯110,感谢有你
  5. 启动azkaban报错_解决启动Azkaban报错问题:java.lang.NoSuchMethodError: com.google.comm
  6. (转)SQL Server:在 SQL Server 2005 中配置数据库邮件,发送邮件
  7. 洛谷 1057——台阶问题(递推与递归二分)
  8. matlab实现获取tof,一种结合TOF技术和双目视觉的深度信息获取装置及其方法与流程...
  9. 数据库: asc和desc的意思
  10. 正态分布的前世今生:误差分布曲线的确立
  11. 查看各大网站服务器操作系统
  12. JS 根据date日期格式返回周几
  13. 扣扣机器人唱歌_qq小冰唱歌指令生成器下载-qq小冰唱歌关键字命令生成器 _5577安卓网...
  14. python房价分析论文_用Python研究了三千套房子,告诉你究竟是什么抬高了房价?...
  15. Android 控件右上角角标的实现方案
  16. matlab 双音频信号的检测,双音频(DTMF)信号的产生与检测.doc
  17. FusionCharts 参数设置
  18. 研华板卡cvi例程_研华amp;NI LabVIEW编程对比与驱动互换视频
  19. APUE编程:37---文件目录(文件黏着位)
  20. java模拟而一个电话本操作

热门文章

  1. python必备入门代码-小白入门Python开发,必备技能有哪些?
  2. python语言-Python语言的特点有哪些?
  3. 中文语音识别系统搭建流程笔记
  4. Redis基础学习记录(1)
  5. vue(vue-cli+vue-router)+babel+webpack项目搭建入门(四)
  6. LeetCode 392 判断子序列
  7. LeetCode 300最长递增子序列
  8. python的整除运算_Python3基础 ** 幂运算 // 整除运算
  9. 初中计算机ps教程,初中信息技术《认识Photoshop CS2的工作界面》教案
  10. linux下redis开机自启动