unity中使用commandbuffer将自定义画面渲染到主相机上

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

  • 23
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值