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

发布于:2024-06-23 ⋅ 阅读:(130) ⋅ 点赞:(0)

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


网站公告

今日签到

点亮在社区的每一天
去签到