CommandBuffer 保存渲染命令列表(例如设置渲染目标或绘制给定网格)。您可以指示 Unity 在内置渲染管线中的各个点安排和执行这些命令,因此,您可以自定义和扩展 Unity 的渲染功能。
这句话意味着你可以通过command buffer让相机渲染自己想要的画面,而不是像以前一样搞个画布搞张RawImage贴在相机前全屏,然后为了能看到模型再搞个相机去单独渲染模型画面贴在前面。在现在的unity2022中你以前大可不必进行这一繁琐的操作了,只需要拿到你需要渲染的纹理,然后通过command buffer让相机去进行渲染,而不必再担心模型被遮住的问题。
直接上例子吧:
public class CommandBufferSample : MonoBehaviour
{
public Camera _camera;//主相机
public Material _bgMat;
private CameraClearFlags m_cameraClearFlags;
private CommandBuffer _commandBuffer;
public RenderTexture _renderTexture;
// Start is called before the first frame update
void Start()
{
_commandBuffer=new CommandBuffer();
_commandBuffer.name="AR Background";
_commandBuffer.SetRenderTarget(_renderTexture);//
_commandBuffer.ClearRenderTarget(true,true,Color.clear);
_commandBuffer.Blit(null,_renderTexture,_bgMat);
_commandBuffer.Blit(_renderTexture,BuiltinRenderTextureType.CameraTarget);
_camera.AddCommandBuffer(CameraEvent.BeforeForwardOpaque,_commandBuffer);
_camera.AddCommandBuffer(CameraEvent.BeforeGBuffer,_commandBuffer);
}
// Update is called once per frame
void Update()
{
}
}
核心api:Camera.AddCommandBuffer
AddCommandBuffer (Rendering.CameraEvent evt, Rendering.CommandBuffer buffer);
参数一:CameraEvent
在摄像机的渲染中定义一个用来附加 CommandBuffer 对象的位置。
通过在摄像机渲染中的不同点添加所谓的“命令缓冲区”可以扩展 Unity 的渲染循环。例如,您可以添加一些自定义几何形状,以便在绘制天空盒后立即绘制。
变量:
BeforeDepthTexture | 在摄像机的深度纹理生成之前。 |
AfterDepthTexture | 在摄像机的深度纹理生成之后。 |
BeforeDepthNormalsTexture | 在摄像机的深度 + 法线纹理生成之前。 |
AfterDepthNormalsTexture | 在摄像机的深度 + 法线纹理生成之后。 |
BeforeGBuffer | 在渲染延迟渲染 G 缓冲区之前。 |
AfterGBuffer | 在渲染延迟渲染 G 缓冲区之后。 |
BeforeLighting | 在延迟渲染中的光照通道之前。 |
AfterLighting | 在延迟渲染中的光照通道之后。 |
BeforeFinalPass | 在延迟光照中的最后一个几何形状通道之前。 |
AfterFinalPass | 在延迟光照中的最后一个几何形状通道之后。 |
BeforeForwardOpaque | 在前向渲染中的不透明对象之前。 |
AfterForwardOpaque | 在前向渲染中的不透明对象之后。 |
BeforeImageEffectsOpaque | 在不透明对象和透明对象之间发生的图像特效之前。 |
AfterImageEffectsOpaque | 在不透明对象和透明对象之间发生的图像特效之后。 |
BeforeSkybox | 在绘制天空盒之前。 |
AfterSkybox | 在绘制天空盒之后。 |
BeforeForwardAlpha | 在前向渲染中的透明对象之前。 |
AfterForwardAlpha | 在前向渲染中的透明对象之后。 |
BeforeImageEffects | 在图像特效之前。 |
AfterImageEffects | 在图像特效之后。 |
AfterEverything | 在摄像机完成所有渲染之后。 |
BeforeReflections | 在延迟渲染中的反射通道之前。 |
AfterReflections | 在延迟渲染中的反射通道之后。 |
BeforeHaloAndLensFlares | 在光环和镜头光晕之前。 |
AfterHaloAndLensFlares | 在光环和镜头光晕之后。 |
参数二:CommandBuffer
要执行的图形命令的列表。
命令缓冲区可保存渲染命令列表(“设置渲染目标、绘制网格等等”)。可将渲染命令设置为在摄像机渲染(请参阅 Camera.AddCommandBuffer)、光源渲染(请参阅 Light.AddCommandBuffer)期间的各个点执行,或者立即执行(请参阅 Graphics.ExecuteCommandBuffer)。
通常,它们将用于以一些自定义方式扩展Unity的渲染管道。例如,可以在完成所有常规对象之后将一些附加对象渲染到延迟渲染G缓冲区中,或者对光影贴图进行自定义处理。有关更多详细信息,请参阅命令缓冲区概述页。
命令缓冲区创建后,可根据需要多次执行。
变量:
name | 此命令缓冲区的名称。 |
sizeInBytes | 此命令缓冲区的大小,以字节为单位(只读)。 |
构造函数:
CommandBuffer | 创建新的空命令缓冲区。 |
具体api链接:Rendering.CommandBuffer - Unity 脚本 API
我们通常用的方法是
CommandBuffer.Blit
参数:
source | 要从中进行 blit 操作的源纹理或渲染目标。 |
dest | 要作为 blit 操作目标的目标。 |
mat | 要使用的材质。 |
pass | 要使用的着色器通道(默认为 -1,表示“所有通道”)。 |
scale | 应用于源纹理坐标的缩放。 |
offset | 应用于源纹理坐标的偏移。 |
sourceDepthSlice | 要从中执行 blit 操作的纹理数组源切片。 |
destDepthSlice | 要对其执行 blit 操作的纹理数组目标切片。 |
描述
添加“对渲染纹理执行 blit 操作”命令。
这与 Graphics.Blit 相似 - 主要用于从一个(渲染)纹理复制到其他纹理,可能使用自定义着色器。
源纹理或渲染目标将作为“_MainTex”属性传递给材质。
可通过若干种方式指示要使用的渲染纹理:RenderTexture 对象、用 GetTemporaryRT 创建的临时渲染纹理或内置的临时纹理之一 (BuiltinRenderTextureType)。上述所有形式的渲染纹理都用 RenderTargetIdentifier 结构来表示,该结构使用隐式转换运算符,实现键入时保存。
请注意,Blit 会更改当前处于活动状态的渲染目标。在 Blit 执行后,dest
会变为活动渲染目标。
通常不需要保留 Blit dest
的先前内容。在这种情况下,建议使用 SetRenderTarget 以适当的加载和存储操作显式激活 dest
渲染目标。然后,应将 Blit dest
设置为 BuiltinRenderTextureType.CurrentActive。