CommandBuffer简单使用

是用来干嘛的?

在渲染的某个步骤, 插入额外的渲染处理。

比如:在渲染不透明物体前,渲染一个正方体;在渲染不透明物体后,渲染一个球体。

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博客

使用 CommandBuffer 来扩展内置渲染管线 - Unity 手册 (unity3d.com)

 

posted @ 2024-03-27 23:44  yanghui01  阅读(5)  评论(0编辑  收藏  举报