Unity中动态合批

文章目录

  • 前言
  • 一、动态合批的规则
    • 1、材质相同是合批的前提,但是如果是材质实例的话,则一样无法合批。
    • 2、支持不同网格的合批
    • 3、动态合批需要网格支持的顶点条件
    • 二、我们导入一个模型并且制作一个Shader,来测试动态合批
    • 1、我们选择模型的 Mesh ,可以查看模型的顶点信息
    • 2、我们先来测试一下 300 个顶点限制的动态合批
    • 3、我们来测试一下Shader中使用了 Position、normal 、uv0 、uv1 和 tangent 最多只能180个顶点以下的动态合批


前言

我们来解析一下上篇文章中提到的 Batching 中的 动态合批


一、动态合批的规则

在这里插入图片描述

动态合批是Unity默认去执行的,我们无法控制中间的步骤,我们只能按照Unity指定的规则去做

1、材质相同是合批的前提,但是如果是材质实例的话,则一样无法合批。

什么情况下会产生材质实例呢?
在之前使用协程控制Shader材质变化的文章中,修改材质使用 .material 来修改会导致生成材质实例

  • Unity中C#使用协程控制Shader材质变化

2、支持不同网格的合批

3、动态合批需要网格支持的顶点条件

  • 单个网格最多 300 个顶点,900个顶点属性。(顶点属性的上限未来可能会调整)
  • 如果Shader中用到了网格的Position、normal 和 uv 的话,则最多300 个顶点
  • 如果Shader中用到了网格的Position、normal 、uv0 、uv1 和 tangent 的话,则最多是 180 个顶点
  • 负方向缩放会导致无法动态合批,早期Unity缩放不一致也会导致无法动态合批

这里的顶点属性,指的是 顶点位置信息、顶点法线信息、顶点切线信息 等这些属性


二、我们导入一个模型并且制作一个Shader,来测试动态合批

1、我们选择模型的 Mesh ,可以查看模型的顶点信息

在这里插入图片描述

可以在Mesh信息中,了解到入下信息:

  • 顶点有 200 个,占用 9.4k
  • 顶点属性包含Position,Normal,Tangent,UV0

2、我们先来测试一下 300 个顶点限制的动态合批

Shader "MyShader/P2_6_2"
{
    Properties
    {
        
    }
    SubShader
    {
        Tags { "RenderType"="Opaque" }
        LOD 100

        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            

            #include "UnityCG.cginc"

            struct appdata
            {
                float4 vertex : POSITION;
                float2 uv : TEXCOORD0;
            };

            struct v2f
            {
                float2 uv : TEXCOORD0;
                
                float4 vertex : SV_POSITION;
            };
            

            v2f vert (appdata v)
            {
                v2f o;
                o.vertex = UnityObjectToClipPos(v.vertex);
               
                return o;
            }

            fixed4 frag (v2f i) : SV_Target
            {
                return 1;
            }
            ENDCG
        }
    }
}

  • 我们给 这个顶点数小于 300 的模型,使用这个Shader材质,我们会发现只有两个批次

在这里插入图片描述

  • 我们复制一份该模型,因为使用了同一个材质,所以被动态合批了,还是只有两个批次

在这里插入图片描述

  • 我们创建一个新的球体,因为使用了不同的材质,所以现在渲染了3批次

在这里插入图片描述

  • 但是,我们给该球使用同一材质时,会发现还是使用了3个批次

原因是:该球体的Mesh顶点数超过了300,不支持动态合批

在这里插入图片描述

3、我们来测试一下Shader中使用了 Position、normal 、uv0 、uv1 和 tangent 最多只能180个顶点以下的动态合批

如果这几个属性只是在Shader的appdata中声明,并不算真正的用到该属性

Shader "MyShader/P2_6_2"
{
    Properties
    {
        _Color("Color",Color) = (1,1,1,1)
    }
    SubShader
    {
        Tags { "RenderType"="Opaque" }
        LOD 100

        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            

            #include "UnityCG.cginc"

            struct appdata
            {
                float4 vertex : POSITION;
                float2 uv : TEXCOORD0;
                float3 normal : NORMAL;
                float3 tangent : TANGENT;
                float2 uv1 : TEXCOORD1;
            };

            struct v2f
            {
                float2 uv : TEXCOORD0;
                float4 pos : SV_POSITION;
                float2 uv1 : TEXCOORD1;
                float3 normal : TEXCOORD2;
                float3 tangent : TEXCOORD3;
                float3 worldPos : TEXCOORD4;
            };
            
            fixed4 _Color;
            v2f vert (appdata v)
            {
                v2f o;
                o.pos = UnityObjectToClipPos(v.vertex);
                o.worldPos = mul(unity_ObjectToWorld,v.vertex);
                o.uv = v.uv;
                o.uv1 = v.uv1;
                o.normal = v.normal;
                o.tangent = v.tangent;
                return o;
            }

            fixed4 frag (v2f i) : SV_Target
            {
                return i.worldPos.y * 0.15 + _Color;
            }
            ENDCG
        }
    }
}

  • 可以看出,虽然我们的物体还是之前的两个板凳。但是批次变成了3次。说明没有动态合批成功

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

二叉树进阶经典笔试题_1

1. 二叉树创建字符串 题目链接:606. 根据二叉树创建字符串 - 力扣(LeetCode) 题目描述:给你二叉树的根节点 root ,请你采用前序遍历的方式,将二叉树转化为一个由括号和整数组成的字符串,返回构…

C语言分支结构程序之if语句(1)

目录 if语句其一 奇数的判定 if语句其二 对奇数偶数的判断 if语句的结构图 专题 语法结构 结构图的阅读方法 结构图示例 相等运算符 关系运算符 嵌套的if语句 if语句其一 大家的一天都会怎么度过呢?我想应该不会是被设计好的程序那样循规蹈矩,我们…

字符集——带你了解UTF-8的前世今生

文章目录 字符集的来历汉字和字母的编码特点Unicode字符集字符集小结编码和解码开发约定 字符集的来历 计算机是美国人发明的,由于计算机能够处理的数据只能是0和1组成的二进制数据,为了让计算机能够处理字符,于是美国人就把他们会用到的每一…

关于 Kubernetes中Admission Controllers(准入控制器) 认知的一些笔记

写在前面 工作中遇到,简单整理记忆博文为官方文档整理涉及内置准入控制的分类理解理解不足小伙伴帮忙指正 人活着就是为了忍受摧残,一直到死,想明了这一点,一切事情都能泰然处之 —— 王小波《黄金时代》 为什么需要准入控制器 准…

【Qt开发流程】之对象模型2:属性系统

描述 Qt提供了一个复杂的属性系统,类似于一些编译器供应商提供的属性系统。然而,作为一个独立于编译器和平台的库,Qt不依赖于非标准的编译器特性,如__property或[property]。 Qt解决方案适用于Qt支持的所有平台上的任何标准c编译…

高性能网络编程 - 白话TCP 三次握手过程

文章目录 概述TCP协议头的格式TCP Finite State Machine (FSM) 状态机三次握手如何在 Linux 系统中查看 TCP 状态 概述 每一个抽象层建立在低一层提供的服务上,并且为高一层提供服务。 我们需要知道 TCP在网络OSI的七层模型中的第四层——Transport层 -----------…

百度智能云正式上线Python SDK版本并全面开源

文章目录 前言一、SDK的优势二、千帆SDK:快速落地LLM应用三、如何快速上手千帆SDK3.1、SDK快速启动3.2. SDK进阶指引 3.3. 通过Langchain接入千帆SDK4、开源社区 前言 百度智能云千帆大模型平台再次升级!在原有API基础上,百度智能云正式上线…

MicroPython标准库

MicroPython标准库 arraybinascii(二进制/ASCII转换)builtins – 内置函数和异常cmath – 复数的数学函数collections – 集合和容器类型errno – 系统错误代码gc – 控制垃圾收集器hashlib – 散列算法heapq – 堆队列算法io – 输入/输出流json – JSON 编码和解码math – 数…

周周爱学习之Redis重点总结

redis重点总结 在正常的业务流程中,用户发送请求,然后到缓存中查询数据。如果缓存中不存在数据的话,就会去数据库查询数据。数据库中有的话,就会更新缓存然后返回数据,数据库中也没有的话就会给用户返回一个空。 1.缓…

【6】PyQt信号和槽

1. 信号和槽简介 信号和槽机制是 QT 的核心机制,应用于对象之间的通信 信号和槽是用来在对象间传递数据的方法当一个特定事件发生的时候,signal会被emit出来,slot调用是用来响应相应的signal的Qt中对象已经包含了许多预定义的 signal&#…

全网最新最全的Appium自动化:使用appium后安卓手机无法调出键盘解决方法

问题:用appium进行真机调试后,使用手机的app进行输入时无法调出键盘。 原因:appium调试时,将手机输入法设置成了Unicode IME 注:按键详细操作参考:转载至 作者:oscarforever 地址&#xff1…

Java链接数据库

本文介绍的是Java链接数据库中的JDBC操作,JDBC虽然现在用的不多,但面试的时候会问道。需要有相应的了解。下面以链接MySQL为例子。 JDBC 什么jdbc Java DataBase Connectivity是一种用于执行SQL语句的Java API,它由一组用Java语言编写的类和…

制作一个RISC-V的操作系统五-RISC-V汇编语言编程一

文章目录 RISC-V汇编语言入门汇编语言概念简介 汇编语言语法介绍(GNU版本) RISC-V汇编语言入门 汇编语言概念简介 高级:可以理解就是更贴近人的理解 低级:可以理解就是更贴近机器的 难移植:汇编指令基本上和机器指令…

对标Gen-2!Meta发布新模型,进军文生视频赛道

随着扩散模型的飞速发展,诞生了Midjourney、DALLE 3、Stable Difusion等一大批出色的文生图模型。但在文生视频领域却进步缓慢,因为文生视频多数采用逐帧生成的方式,这类自回归方法运算效率低下、成本高。 即便使用先生成关键帧,再生成中间帧新方法。如…

网络模拟与网络仿真

目录 一、概念界定 二、模拟(simulation)与仿真(emulation) 2.1 模拟(simulation) 2.2 仿真(emulation) 2.3 区分 三、网络模拟与网络仿真 3.1 网络模拟 3.2 网络仿真 3.…

软件测试要学习的基础知识——黑盒测试

黑盒测试概述 黑盒测试也叫功能测试,通过测试来检测每个功能是否都能正常使用。在测试中,把程序看作是一个不能打开的黑盒子,在完全不考虑程序内部结构和内部特性的情况下,对程序接口进行测试,只检查程序功能是否按照…

解析 Smilee Finance:基于无偿损失的链上期权方案

“有了 Smilee Finance,无偿损失或许不再是一种损失,它也更可能是一种可组合性的收益” 无偿损失 流动性挖矿是引燃 DeFi Summer 的导火索,在 AMM DEX 中,它允许用户将资产按照比例添加到 AMM 流动性池中成为 LP,以为交…

POJ 3233 Matrix Power Series 动态规划(矩阵的幂)

一、题目大意 给出一个矩阵A, 输出矩阵B的每一项对M取余数的值。 二、解题思路 以二维矩阵为例,首先计算K2的情况,我们设结果矩阵为B 有如下表达式 那么不难看出,需要的矩阵其实就是以下的两个矩阵相乘后的左上角的N*N个 然后…

RoPE旋转位置编码浅析

RoPE旋转位置编码浅析 本文介绍了旋转位置编码RoPE在大模型中的广泛应用,包括Llama、Mistral 7B、Baichuan、ChatGLM、Qwen、…等。由于计算资源限制,大模型通常在较小的上下文长度中进行训练,导致在推理超出预训练长度时性能显著下降。为了解决这个问题,涌现了许多基于Ro…

火山引擎DataTester升级MAB功能,助力企业营销决策

更多技术交流、求职机会,欢迎关注字节跳动数据平台微信公众号,回复【1】进入官方交流群 DataTester,火山引擎推出的 AB 测试与智能优化平台,近日宣布对其 MAB(Multi-armed Bandit)功能进行了升级&#xff0…