首页 > 其他分享 >CommandBuffer使用1

CommandBuffer使用1

时间:2024-03-27 23:56:48浏览次数:27  
标签:渲染 胶囊 Cmd 插入 使用 CommandBuffer void

是用来干嘛的?

在渲染的某个步骤, 插入额外的渲染处理。

比如:在渲染不透明物体前,渲染一个正方体;在渲染不透明物体后,渲染一个球体。

CommandBuffer支持的可插入点还是很多的,加在Camera上时,支持的可插入点在CameraEvent枚举上;加在Light上时,支持的可插入点在LightEvent枚举上。

 

和Graphic的区别

Graphic是立即渲染或下一帧就渲染,而CommandBuffer是渲染管线执行到某个步骤时,触发CommandBuffer的渲染

 

简单的例子

在渲染透明物体前,渲染我们设定的列表中的所有Renderer

[RequireComponent(typeof(Camera))]
public class CmdBuff1 : MonoBehaviour
{
    public Material m_CmdDrawRendererMat;
    public List<Renderer> m_CmdDrawRendererList = new List<Renderer>();

    private CommandBuffer m_Cmd;

    void OnEnable()
    {
        if (null == m_Cmd)
        {
            m_Cmd = new CommandBuffer();
            m_Cmd.name = "My Render Cmd";

            //轮到该cmd执行时, 先Clear再DrawRenderer
            m_Cmd.ClearRenderTarget(true, true, Color.red);

            foreach (var rd in m_CmdDrawRendererList)
            {
                m_Cmd.DrawRenderer(rd, m_CmdDrawRendererMat);
            }
        }
        GetComponent<Camera>().AddCommandBuffer(CameraEvent.BeforeForwardAlpha, m_Cmd);
    }

    void OnDisable()
    {
        GetComponent<Camera>().RemoveCommandBuffer(CameraEvent.BeforeForwardAlpha, m_Cmd);
    }

    void OnDestroy()
    {
        m_Cmd.Clear(); //清空所有渲染指令
        m_Cmd.Dispose();
        m_Cmd = null;
    }

}

 

没有CommandBuffer时,是这样的:蓝色的背景,有一个平面和一个胶囊体

 

然后我们用CommandBuffer把胶囊体用边缘光shader渲染出来,背景变成了红色,平面没了,胶囊体有绿色的边缘光

 

可以使用Frame Debug来分析CommandBuffer在什么时候被执行了

 可以看到,因为CommandBuffer执行的比较晚,所以用红色把蓝色背景,平面和一开始的胶囊体覆盖了,然后自己再绘制了一个边缘蓝色光的胶囊体。

 

注意

函数调用的先后,决定了渲染指令的先后顺序,比如先调用DrawRender,再调用ClearTarget,将得到这样的结果:

 

 

把BeforeForwardAlpha改成BeforeForwardOpaque会怎样?

背景变成了红色,但平面和胶囊体还在

再看下Frame Debug,一看就明白了

 

插入位置参考

CommandBuffer在渲染管线中的插入位置(蓝色标出)(Deferred Rendering为延迟渲染,Forward Rendering为前向渲染)

 

 

参考

unity的CommandBuffer介绍_unity commandbuffer-CSDN博客

 

标签:渲染,胶囊,Cmd,插入,使用,CommandBuffer,void
From: https://www.cnblogs.com/sailJs/p/17388700.html

相关文章

  • 使用腾讯云轻量服务器的糟心事
    去年12月份,因为图便宜,在腾讯云买了个轻量服务器。然而,却没有意识到这成了糟心的开始。如果没有时间看我的啰嗦,就记得我得到的关键一点教训就好:一定要检查腾讯云给的IP地址是否有黑底子,可以通过网上的一些搜索解析信息的网址查询,要是IP被别人解析过,还要查一下IP是否被墙,网上有教程......
  • 在 Windows Server 2022 系统中,你可以使用一些组合命令结合系统自带的工具来实现文件
    在WindowsServer2022系统中,你可以使用一些组合命令结合系统自带的工具来实现文件夹同步。以下是一个示例组合命令,结合Robocopy和TaskScheduler来实现文件夹同步:使用Robocopy进行文件夹同步:Robocopy是Windows自带的一个命令行工具,用于复制大量文件和文件夹。你可......
  • 区块链编程七大语言,使用最多的竟是Java
    SQL——结构化查询语言(StructuredQueryLanguage)或“Sequel”,是IBM开发的一种编程语言,用于与存储、查询和处理数据的数据库进行沟通。如今SQL约拥有700万名开发者。MySQL、PostgreSQL、SQLServer、DB2、Oracle等主流数据库都使用SQL来开发应用程序。使用SQL的区块链项......
  • 在Go语言中如何正确使用init函数
    1.概念        init函数是用于初始化应用程序状态的函数。既不接收参数也不返回结果,仅仅是一个func()类型的函数。当初始化包时,将对包中所有的常量和变量声明进行计算。然后执行init函数。下面是初始化main包的例子:packagemainimport"fmt"vara=func()int......
  • 文件宝App如何使用smb功能(Windows电脑)
    1.使用系统搜索“高级共享设置”,然后打开。如下图①、②2.然后在弹出的页面中勾选两项,如下图中③3.然后使用系统搜索“启用或关闭Windows功能”,然后打开,如下图①、②4.然后在弹出的页面中找到并勾选对应4项,如下图③,最后点击“确定”,然后重启电脑即可注意:后面使用文件宝App......
  • 综合架构--9--工作防火墙使用学习--38
    综合架构--9--工作防火墙使用学习--38防火墙--学习笔记防火墙分类:硬件:华为思科深信服软件:Windows:360电脑管家金山毒霸linux:firewalldiptables防火墙的作用:隔离严格过滤出站入站firewalld设计流程定义不同区域每个区域制定自己配置通过的......
  • 使用可迭代对象作为 React 组件
    源码最近看React源码的时候发现其在处理数组的同时也对可迭代协议做了处理,因此React组件可以是一个返回可迭代对象的函数。源码如下:reconcileChildFibersImplif(isArray(newChild)){returnreconcileChildrenArray(returnFiber,currentFirstChild,newChild,lanes,......
  • wire和reg型变量的组合使用
    模型功能实现寄存器之间的连线实现寄存器的声明建构时钟的时序系统模型框图`timescale1ns/1ps/**///*******************************************************************************//Company:FpgaPublish//Engineer:FP////CreateDate:2024/03/2......
  • 使用宝塔面板自建bitwarden(vaultwarden)密码管理器服务器
    参考:bitwarden(vaultwarden)密码管理器自建服务器-腾讯云开发者社区-腾讯云Docker部署Vaultwarden,并使用Nginx反向代理实现Https-Alain'sBlogInstallandSyncAllofYourDevices|Bitwarden 一、准备:域名+ssl+服务器二、步骤1、打开宝塔面板docker管理工具,在应用......
  • WPF解决当ScrollViewer中嵌套ItemsControl时,不能使用鼠标来滚动翻页
    1.在DataGrid中添加PreviewMouseWheel事件,并将事件的Handled属性设置为false,以便将滚动事件传递给ScrollViewer。示例代码如下:<DataGridPreviewMouseWheel="DataGrid_PreviewMouseWheel"><!--DataGrid的其他设置--></DataGrid>privatevoidDataGrid_PreviewMouseWh......