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

news2025/2/7 18:08:45

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。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1850965.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

视频汇聚安防综合管理平台EasyCVR支持GA/T 1400视图库标准及设备接入配置

一、概述 视频汇聚安防综合管理平台EasyCVR视频监控系统已经与公安部GA/T 1400视图库标准协议实现了对接,即《公安视频图像信息应用系统》。 安防监控系统EasyCVR支持采用GA/T 1400进行对接,可实现人脸数据使用的标准化、合规化。其采用统一接口对接雪…

替换或重写Tomcat内置的404页面

替换或重写Tomcat内置的404页面 准备一个Tomcat隐藏Tomcat的相关信息纯净版的Tomcat解决Tomcat启动乱码的问题 替换或重写Tomcat内置的404页面创建新的首页和错误页面页面代码如下所示:创建首页index.html创建error_404.html页面创建其他错误页面创建编写web.xml&am…

【C++】优先队列的使用及模拟实现

💗个人主页💗 ⭐个人专栏——C学习⭐ 💫点击关注🤩一起学习C语言💯💫 目录 导读 一、什么是优先队列 二、优先队列的使用 1. 优先队列的构造 2. 优先队列的基本操作 3. 使用示例 三、优先队列模拟实…

C++初学者指南第一步---12.引用

C初学者指南第一步—12.引用 文章目录 C初学者指南第一步---12.引用1. 功能(和限制)1.1 非常量引用1.2 常量引用1.3 auto引用 2.用法2.1 范围for循环中的引用2.2 常量引用的函数形参2.3 非常量引用的函数形参2.4 函数参数的选择:copy / const…

emqx5.6.1 数据、配置备份与迁移

EMQX 支持导入和导出的数据包括: EMQX 配置重写的内容: 认证与授权配置规则、连接器与 Sink/Source监听器、网关配置其他 EMQX 配置内置数据库 (Mnesia) 的数据 Dashboard 用户和 REST API 密钥客户端认证凭证(内置数据库密码认证、增强认证…

cas客户端流程详解(源码解析)--单点登录

博主之前一直使用了cas客户端进行用户的单点登录操作&#xff0c;决定进行源码分析来看cas的整个流程&#xff0c;以便以后出现了问题还不知道是什么原因导致的 cas主要的形式就是通过过滤器的形式来实现的&#xff0c;来&#xff0c;贴上示例配置&#xff1a; 1 <list…

海南聚广众达电子商务咨询有限公司抖音电商新引擎

在数字化浪潮席卷而来的今天&#xff0c;抖音电商作为新兴的商业模式&#xff0c;正以其独特的魅力和无限的潜力&#xff0c;引领着电子商务行业的革新与发展。海南聚广众达电子商务咨询有限公司&#xff0c;作为专注于抖音电商服务的领军企业&#xff0c;凭借其专业的团队、丰…

双例集合(三)——双例集合的实现类之TreeMap容器类

Map接口有两个实现类&#xff0c;一个是HashMap容器类&#xff0c;另一个是TreeMap容器类。TreeMap容器类的使用在API上于HashMap容器类没有太大的区别。它们的区别主要体现在两个方面&#xff0c;一个是底层实现方式上&#xff0c;HashMap是基于Hash算法来实现的吗&#xff0c…

【C语言】函数指针数组和指向函数指针数组的指针

1 函数指针数组 数组是一个存放相同类型数据的存储空间&#xff0c;那我们已经学习了指针数组。 比如&#xff1a; int *arr[10];//数组的每个元素是int* 那要把函数的地址存到一个数组中&#xff0c;那这个数组就叫函数指针数组&#xff0c;那函数指针的数组如何定义呢&am…

OS复习笔记ch11-2

上一节我们学习的内容是I/O系统的特点和设备分类和差异&#xff0c;这一节我们将主要关注I/O控制方式、OS设计问题、I/O逻辑结构等。 I/O功能的演变 在专栏的ch1-2中&#xff0c;我们详细讲解了CPU与外设的三种交互方式&#xff0c;这里简单地带过。 &#xff08;1&#xff0…

C++之STL(一)

1、泛型程序设计 目的&#xff1a;提供相同的算法&#xff0c;相同的逻辑&#xff0c;来对不同类型的数据结构进行操作。 所以需要将类型当作参数&#xff0c;也就是参数类型化。 2、什么是STL STL是基于模板实现的。编译的时候进行实例化 3、STL组件 4、容器算法迭代器关系 …

第二次IAG

IAG in NanJing City 我与南京奥体的初次相遇&#xff0c;也可能是最后一次&#xff01; 对我来说,IAG 演唱会圆满结束啦! 做了两场充满爱[em]e400624[/em]的美梦 3.30号合肥站&#xff0c;6.21号南京站[em]e400947[/em] 其实&#xff0c;没想到昨天回去看呀!(lack of money […

如何修改外接移动硬盘的区号

- 问题介绍 当电脑自身内存不够使用的时候&#xff0c;使用外接硬盘扩展内存是一个不错的选择。但是当使用的外接硬盘数量过多的时候&#xff0c;会出现分配硬盘的区号变动的情况&#xff0c;这种情况下会极大的影响使用的体验情况。可以通过以下步骤手动调整恢复 - 配置 版本…

SpringBoot 快速入门(保姆级详细教程)

目录 一、Springboot简介 二、SpringBoot 优点&#xff1a; 三、快速入门 1、新建工程 方式2&#xff1a;使用Spring Initializr创建项目 写在前面&#xff1a; SpringBoot 是 Spring家族中的一个全新框架&#xff0c;用来简化spring程序的创建和开发过程。SpringBoot化繁…

【C语言】操作符(上)

目录 1. 操作符的分类 2. 原码、反码、补码 3. 移位操作符 3.1 左移操作符 3.2 右移操作符 4. 位操作符&#xff1a;&、|、^、~ 5. 单目操作符 6. 逗号表达式 最近准备期末考试&#xff0c;好久不见啦&#xff0c;现在回归—— 正文开始—— 1. …

WPF文本绑定显示格式StringFormat设置-数值类型处理

绑定显示格式设置 在Textblock等文本控件中&#xff0c;我们经常要绑定一些数据类型&#xff0c;但是我们希望显示的时候能够按照我们想要的格式去显示&#xff0c;比如增加文本前缀&#xff0c;后面加单位&#xff0c;显示百分号等等&#xff0c;这种就需要对绑定格式进行处理…

【Java】已解决java.io.ObjectStreamException异常

文章目录 一、分析问题背景二、可能出错的原因三、错误代码示例四、正确代码示例五、注意事项 已解决java.io.ObjectStreamException异常 在Java中&#xff0c;java.io.ObjectStreamException是一个在序列化或反序列化对象时可能抛出的异常基类。这个异常通常表示在对象流处理…

iMazing3软件下载-详细安装教程视频

​值得肯定的是智能备份&#xff1a;iMazing为使用者提供了免费的备份服务&#xff0c;并且支持两种连接方式&#xff1a;USB数据线连接备份和Wi-Fi无线连接&#xff0c;所备份的文件不会被覆盖。我们必须承认iMazing软件特色&#xff1a;使用你的 iOS 设备像外部驱动器。基本上…

MSPM0G3507——特殊的串口0

在烧录器中有串口0&#xff0c;默认也是串口0通过烧录线给电脑发数据。 如果要改变&#xff0c;需要变一下LP上的跳线帽。 需要更改如下位置的跳线帽

SpringBoot 搭建sftp服务 实现远程上传和下载文件

maven依赖&#xff1a; <dependency><groupId>com.jcraft</groupId><artifactId>jsch</artifactId><version>0.1.55</version> </dependency>application.yml sftp:protocol: sftphost: port: 22username: rootpassword: sp…