首页 > 代码库 > unity CommandBuffer学习

unity CommandBuffer学习

unity官方的教程:https://blogs.unity3d.com/cn/2015/02/06/extending-unity-5-rendering-pipeline-command-buffers/

文章底部附带了一个demo工程

 

用官方例子改了改,作为测试脚本

技术分享
using UnityEngine;
using UnityEngine.Rendering;
using System.Collections;
using System.Collections.Generic;

public class Test : MonoBehaviour
{
    public Mesh testMesh;
    public Material testMaterial;

    Dictionary<Camera, CommandBuffer> m_Cameras = new Dictionary<Camera, CommandBuffer>();


    void OnDisable()
    {
        foreach (var cam in m_Cameras)
        {
            if (cam.Key)
            {
                cam.Key.RemoveCommandBuffer(CameraEvent.BeforeLighting, cam.Value);
            }
        }
    }

    void LateUpdate()
    {
        var act = gameObject.activeInHierarchy && enabled;
        if (!act)
        {
            OnDisable();
            return;
        }

        var cam = Camera.current;
        if (!cam)
            return;

        CommandBuffer buf = null;
        if (m_Cameras.ContainsKey(cam))
        {
            buf = m_Cameras[cam];
            buf.Clear();
        }
        else
        {
            buf = new CommandBuffer();
            buf.name = "Test Command Buffer";
            m_Cameras[cam] = buf;

            cam.AddCommandBuffer(CameraEvent.AfterFinalPass, buf);
        }

        buf.DrawMesh(testMesh, Matrix4x4.TRS(Camera.main.transform.position + Camera.main.transform.forward * 4f, Quaternion.identity, Vector3.one), testMaterial);
    }
}
View Code

 

脚本很简单,在finalpass之后绘制一个mesh

技术分享

 

 

 

CommandBuffer支持延迟渲染和正向渲染,但需要注意如果在正向渲染中用了CameraEvent.AfterGBuffer之类的延迟渲染事件,会不起作用。

Unity的FrameDebug可以对CommandBuffer进行调试

 

技术分享

 

 

有空再完善

unity CommandBuffer学习