当前位置: 首页 > article >正文

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次。说明没有动态合批成功

在这里插入图片描述


http://www.kler.cn/a/158728.html

相关文章:

  • CVE-2024-2961漏洞的简单学习
  • 解决 Spring Boot 中 `Ambiguous mapping. Cannot map ‘xxxController‘ method` 错误
  • 【嵌入式】关于push老仓库到新仓库的方法
  • 【C/C++】Lambda 用法
  • 深入理解 JavaScript 中的 Array.find() 方法:原理、性能优势与实用案例详解
  • PostgreSQL序列:创建、管理与高效应用指南
  • SpringBoot+vue显示图片
  • CPP-SCNUOJ-Problem P24. [算法课贪心] 跳跃游戏
  • 鱼香ROS一键安装命令(支持微信、docker、ros等)
  • SpringSecurity6 | 默认用户生成
  • 2023年甘肃省职业院校技能大赛(中职教师组)网络安全竞赛样题(四)
  • GNN Maximum Flow Problem (From Shusen Wang)
  • 7+WGCNA+机器学习+实验+泛癌分析,多要素干湿结合
  • TCP 半连接队列和全连接队列
  • 区分(GIOU、DIOU、CIOU)(正则化、归一化、标准化)
  • 【小白推荐】安装OpenCV4.8 系统 Ubuntu 22.04LST Linux.
  • 第17章 匿名函数
  • 【PTA题目】6-1 猴子吃桃-递归 分数 10
  • 6.5 Windows驱动开发:内核枚举PspCidTable句柄表
  • 优化汽车产业用户营运:精细化策略
  • 使用C语言创建高性能网络爬虫IP池
  • 语义分割网络FCN
  • SQL Sever 基础知识 - 限制行数
  • NLP/Natural Language Processing
  • 春秋云镜ED01-CMS v20180505 存在任意文件上传漏洞
  • 【面试】Java最新面试题资深开发-JVM第一弹