是用来干嘛的?
在渲染的某个步骤, 插入额外的渲染处理。
比如:在渲染不透明物体前,渲染一个正方体;在渲染不透明物体后,渲染一个球体。
CommandBuffer支持的可插入点还是很多的,加在Camera上时,支持的可插入点在CameraEvent枚举上;加在Light上时,支持的可插入点在LightEvent枚举上。
和Graphic的区别
Graphic是立即渲染或下一帧就渲染,而CommandBuffer是渲染管线执行到某个步骤时,触发CommandBuffer的渲染
简单的例子
在渲染透明物体前,渲染我们设定的列表中的所有Renderer
[RequireComponent(typeof(Camera))] public class CmdBuff1 : MonoBehaviour { public Material m_CmdDrawRendererMat; public List<Renderer> m_CmdDrawRendererList = new List<Renderer>(); private CommandBuffer m_Cmd; void OnEnable() { if (null == m_Cmd) { m_Cmd = new CommandBuffer(); m_Cmd.name = "My Render Cmd"; //轮到该cmd执行时, 先Clear再DrawRenderer m_Cmd.ClearRenderTarget(true, true, Color.red); foreach (var rd in m_CmdDrawRendererList) { m_Cmd.DrawRenderer(rd, m_CmdDrawRendererMat); } } GetComponent<Camera>().AddCommandBuffer(CameraEvent.BeforeForwardAlpha, m_Cmd); } void OnDisable() { GetComponent<Camera>().RemoveCommandBuffer(CameraEvent.BeforeForwardAlpha, m_Cmd); } void OnDestroy() { m_Cmd.Clear(); //清空所有渲染指令 m_Cmd.Dispose(); m_Cmd = null; } }
没有CommandBuffer时,是这样的:蓝色的背景,有一个平面和一个胶囊体
然后我们用CommandBuffer把胶囊体用边缘光shader渲染出来,背景变成了红色,平面没了,胶囊体有绿色的边缘光
可以使用Frame Debug来分析CommandBuffer在什么时候被执行了
可以看到,因为CommandBuffer执行的比较晚,所以用红色把蓝色背景,平面和一开始的胶囊体覆盖了,然后自己再绘制了一个边缘蓝色光的胶囊体。
注意
函数调用的先后,决定了渲染指令的先后顺序,比如先调用DrawRender,再调用ClearTarget,将得到这样的结果:
把BeforeForwardAlpha改成BeforeForwardOpaque会怎样?
背景变成了红色,但平面和胶囊体还在
再看下Frame Debug,一看就明白了
插入位置参考
CommandBuffer在渲染管线中的插入位置(蓝色标出)(Deferred Rendering为延迟渲染,Forward Rendering为前向渲染)
参考
unity的CommandBuffer介绍_unity commandbuffer-CSDN博客
标签:渲染,胶囊,Cmd,插入,使用,CommandBuffer,void From: https://www.cnblogs.com/sailJs/p/17388700.html