【Unity渲染】CommanderBuffer

背景

在写地图引擎的时候,因为当数据加载完成,用户无交互的情况下,地图无需渲染,只需保留之前渲染的即可,但是发现unity中内置渲染管线每一帧都会clear颜色、深度、模板缓冲区,
我使用 Graphics.DrawMesh 必须每一帧都强制绘制才行。后面发现可以在内置渲染管线中使用CommanderBuffer对自己的渲染管线进行扩展,首先,我需要先关闭相机每帧都强制clear的开关UnityEngine.Camera.main.clearFlags = CameraClearFlags.Nothing;
然后后面完全使用commanderbuffer进行对渲染管线的扩展,自己控制clear

介绍

发现有两种方式安排执行CommanderBuffer,分别是Graphics.ExecuteCommandBuffer API 立即执行 CommandBuffer,以及Camera.AddCommandBuffer API 与CameraEvent 枚举、Light.AddCommandBuffer API 与 LightEvent 枚举方式
但是发现Graphics.ExecuteCommandBuffer不能安排buffer的执行时机,且暂时发现没法用在unity2019中。

创建

public CommandBuffer renderTranslucentCommandBuffer = new CommandBuffer();

使用

使用camera安排这个buffer在哪个阶段执行,这里是在渲染半透明物体之前执行

 camera.AddCommandBuffer(CameraEvent.BeforeForwardAlpha,
                    this.renderTranslucentCommandBuffer);

下面是每一帧绘制前的clear

this.renderTranslucentCommandBuffer.Clear(); // 清空这个buffer
this.renderTranslucentCommandBuffer.ClearRenderTarget(true, true, Color.clear);

绘制mesh对象

this.renderTranslucentCommandBuffer.DrawMesh(mesh, Matrix4x4.identity, material, 0);

Graphics.ExecuteCommandBuffer 和 Camera.AddCommandBuffer 区别

Graphics.ExecuteCommandBuffer 和 Camera.AddCommandBuffer 都是用于执行 CommandBuffer 的方法,但它们有一些区别。

首先,Graphics.ExecuteCommandBuffer 是一个静态方法,而 Camera.AddCommandBuffer 是一个实例方法。因此,Graphics.ExecuteCommandBuffer 可以在任何位置调用,而不需要特定的相机实例。而 Camera.AddCommandBuffer 必须针对特定的相机对象调用,以将 CommandBuffer 添加到相应的相机上。

其次,Graphics.ExecuteCommandBuffer 只能执行一次 CommandBuffer,而 Camera.AddCommandBuffer 可以在多个渲染阶段执行 CommandBuffer。可以通过调用 Camera.AddCommandBuffer 方法来将 CommandBuffer 添加到相应的渲染阶段,然后相机在执行渲染时会依次执行添加到该渲染阶段的所有 CommandBuffer。

最后,需要注意的是,Graphics.ExecuteCommandBuffer 只能执行 CommandBuffer 中的绘制命令,而 Camera.AddCommandBuffer 可以执行 CommandBuffer 中的所有命令,包括清除屏幕、设置渲染状态等。因此,如果需要执行除绘制命令以外的命令,应该使用 Camera.AddCommandBuffer 方法。

综上所述,如果需要执行绘制命令,并且不需要在多个渲染阶段执行 CommandBuffer,可以使用 Graphics.ExecuteCommandBuffer 方法。如果需要在多个渲染阶段执行 CommandBuffer,或者需要执行除绘制命令以外的命令,应该使用 Camera.AddCommandBuffer 方法。

你可能感兴趣的:(Unity3D,unity,c#,游戏引擎)