UnityShader20:CommandBuffer初见(上)
一、命令缓冲区 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 生命周期渲染部分
渲染相关的生命周期介绍:
- 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初见(上)相关推荐
- UnityShader20.1:CommandBuffer初见(下)
接上文:UnityShader20:CommandBuffer初见(上) 四.复杂一点的例子-- CommandBuffer代码参考如下: using UnityEngine; using Unity ...
- UnityShader25:在Unity中实现泛光
一.需要提前了解的 这一章的例子非常的综合,可以说是知识点广而全,如果能独立在 Unity 中实现一个不错的泛光效果,那么 UnityShader 就算作入门成功!本章没有新的东西 曾经在 OpenG ...
- UnityShader24:最简单的屏幕后处理例子
一.需要提前了解的 其实关于屏幕后处理(Screen Post-processing Effects)相关的知识,前面已经提过了不少: 这些是 OpenGL 渲染部分: OpenGL基础35:帧缓冲( ...
- Linux - 收藏集 - 掘金
Linux 基础之常用命令篇 - 后端 - 掘金 最近一段时间工作实在是太忙了,所以好久没有写文章了,趁着周末把linux 的相关知识,整理了下.这一篇文件主要记录了一些linux的基础命令.需要读者 ...
- 关于Mongodb的全面总结,学习mongodb的人,可以从这里开始!
转载地址:http://blog.csdn.net/he90227/article/details/45674513 原文地址:http://blog.csdn.NET/jakenson/articl ...
- 使用commandbuffer绘制并且blit到屏幕上
master_commandbuffer分支 f3608cd94cc9302a12c272496408a439b6001c3c using System.Collections; using Syst ...
- 寂寥的雨花,打在你的遮阳伞上,回忆,是那样刻骨铭心,若如初见。你,与我相爱了半生,却让我下半生寂寞地守候你,你的离开,是为了自己翱翔天空的梦想,是为了在天空,也能种下我们相思相爱的杜鹃雨。 而我,只
寂寥的雨花,打在你的遮阳伞上,回忆,是那样刻骨铭心,若如初见.你,与我相爱了半生,却让我下半生寂寞地守候你,你的离开,是为了自己翱翔天空的梦想,是为了在天空,也能种下我们相思相爱的杜鹃雨. 而我,只能 ...
- AOP之PostSharp初见-OnExceptionAspect
PostSharp 这个静态植入的aop框架我就不多说了,在以前的aop文件,我们也尝试用MSBuild+Mono.Cicel理解静态植入AOP的原理.最近公司准备购买Postsharp做一些AOP, ...
- Github上传大于100M文件:LFS
文章目录 Git 简介 创建项目并推送文件 推送大文件Git Large File Storage (LFS) Reference 猜你喜欢 写在后面 Git 简介 Git是目前世界上最先进的分布式版 ...
最新文章
- 全文检索工具迅搜的安装和体验(可用于自建中文全文搜索引擎)
- 艾宾浩斯记忆表格excel_好的记忆方法是一切学习的关键(艾宾浩斯记忆法)
- 使用WPF动画编程的几点注意事项[转]
- 2018,腾讯110,感谢有你
- 启动azkaban报错_解决启动Azkaban报错问题:java.lang.NoSuchMethodError: com.google.comm
- (转)SQL Server:在 SQL Server 2005 中配置数据库邮件,发送邮件
- 洛谷 1057——台阶问题(递推与递归二分)
- matlab实现获取tof,一种结合TOF技术和双目视觉的深度信息获取装置及其方法与流程...
- 数据库: asc和desc的意思
- 正态分布的前世今生:误差分布曲线的确立
- 查看各大网站服务器操作系统
- JS 根据date日期格式返回周几
- 扣扣机器人唱歌_qq小冰唱歌指令生成器下载-qq小冰唱歌关键字命令生成器 _5577安卓网...
- python房价分析论文_用Python研究了三千套房子,告诉你究竟是什么抬高了房价?...
- Android 控件右上角角标的实现方案
- matlab 双音频信号的检测,双音频(DTMF)信号的产生与检测.doc
- FusionCharts 参数设置
- 研华板卡cvi例程_研华amp;NI LabVIEW编程对比与驱动互换视频
- APUE编程:37---文件目录(文件黏着位)
- java模拟而一个电话本操作
热门文章
- python必备入门代码-小白入门Python开发,必备技能有哪些?
- python语言-Python语言的特点有哪些?
- 中文语音识别系统搭建流程笔记
- Redis基础学习记录(1)
- vue(vue-cli+vue-router)+babel+webpack项目搭建入门(四)
- LeetCode 392 判断子序列
- LeetCode 300最长递增子序列
- python的整除运算_Python3基础 ** 幂运算 // 整除运算
- 初中计算机ps教程,初中信息技术《认识Photoshop CS2的工作界面》教案
- linux下redis开机自启动