回到目录

大家好,我是阿赵。这里继续来讲一下URP相关的东西。
这次主要说的是SRP Batcher的使用

一、在URP下实现SRP Batcher

1、设置

在我们创建的URPAsset文件的高级选项里面,有一个SRP Batcher的开关,默认就是勾上的。

2、修改shader

在把项目转换为URP后,会看到shader属性里面出现了SRP Batcher的项

如果是自己写的shader,在没有做处理之前,SRP Batcher项会是not compatible,也就是没有适配,下面有提示:Material property is found in another cbuffer than “UnityPerMaterial”(_MainTex_ST)
根据提示,可以知道是cbuffer的问题,所以要对shader做一点小修改
主要的修改地方:
把shader内部使用的变量用CBUFFER_START(UnityPerMaterial)和CBUFFER_END包住。注意这里内部使用的变量,是指在Properties里面声明了,并且在顶点或者片段程序里面再用到的变量,不包括global的全局变量。

增加完之后,再看shader的属性,会发现SPR Batcher项已经变成了compatible,也就是说该shader已经适配了SRP Batcher了

例子:
CG:

Shader "azhao/CGBatch"
{Properties{_MainTex ("Texture", 2D) = "white" {}}SubShader{Tags { "RenderType"="Opaque" }LOD 100Pass{CGPROGRAM#pragma vertex vert#pragma fragment frag#include "UnityCG.cginc"struct appdata{float4 vertex : POSITION;float2 uv : TEXCOORD0;};struct v2f{float2 uv : TEXCOORD0;float4 pos : SV_POSITION;};CBUFFER_START(UnityPerMaterial)sampler2D _MainTex;float4 _MainTex_ST;CBUFFER_ENDv2f vert (appdata v){v2f o;o.pos = UnityObjectToClipPos(v.vertex);o.uv = TRANSFORM_TEX(v.uv, _MainTex);return o;}fixed4 frag (v2f i) : SV_Target{fixed4 col = tex2D(_MainTex, i.uv);return col;}ENDCG}}
}

HLSL:Unity的URP是推荐使用HLSL的,因为这个例子先是用CG写的,后来改成HLSL,所以有些地方不太符合HLSL。之后有机会再说一下为什么要用HLSL。

Shader "azhao/HLSLBatch"
{Properties{_MainTex ("Texture", 2D) = "white" {}}SubShader{Tags { "RenderType"="Opaque" }LOD 100Pass{HLSLPROGRAM#pragma vertex vert#pragma fragment frag#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"struct appdata{float4 vertex : POSITION;float2 uv : TEXCOORD0;};struct v2f{float2 uv : TEXCOORD0;float4 pos : SV_POSITION;};CBUFFER_START(UnityPerMaterial)sampler2D _MainTex;float4 _MainTex_ST;CBUFFER_ENDv2f vert (appdata v){v2f o;float4 worldPos = mul(unity_ObjectToWorld, v.vertex);o.pos = mul(unity_MatrixVP, worldPos);o.uv = TRANSFORM_TEX(v.uv, _MainTex);return o;}half4 frag (v2f i) : SV_Target{// sample the texturehalf4 col = tex2D(_MainTex, i.uv);return col;}ENDHLSL}}
}

3、渲染效果

我这里渲染2000颗草的模型,可以看到,Saved by batching居然变成了负数。这是因为Statistics分析的数据是普通渲染管线的,它对URP的实际数据识别得有问题。不过出现负数,就证明SRP Batch已经生效了

二、多种渲染方式的对比

还是渲染2000棵草,下面对比一下Unity的多种渲染合并方式下的情况,我顺便用Frame Debug工具给大家看看实际合并渲染的情况。至于哪一种方式的性能更好,各位可以自己去看看参数了。

1、不合并


可以看到,动态Batches高达2001

从Frame Debug里面看,可以看出渲染的次数非常多

2、静态合并


把所有物体勾选上Batching Static,然后渲染

出现了颜色变亮了的问题,不过Batches变成了12了,有1989个合并被保存起来了。

从Frame Debug看,渲染的次数明显的减少了,总共渲染11次,而每一次的渲染,名称就叫做Static Batch

3、GPU Instancing

在GPU Instancing和静态合并同时勾选时,会优先静态合并,所以不要两者同时使用

GPU Instancing之后,Batches变成了9,有1992个合并被保存起来了。

从Frame Debug看,总共渲染了8次,每次的名字变成了Draw Mesh(Instanced)

4、SRP Batcher


这里显示问题就不去深究了
从FrameDebug看,同样的渲染了8次,每次的名字就叫SRP Batch。

Unity的URP下使用SRPBatcher相关推荐

  1. Unity Shader - URP ShadowCast ShadowRecieve - 投影 和 接受阴影

    文章目录 Shadow Caster Using URP Shadow Caster Pass Using Custom Shadow Caster Pass 先来看看 [没有] apply shad ...

  2. UNITY编辑器模式下static变量的坑

    UNITY编辑器模式下static变量的坑 在unity中写编辑器扩展工具,如在编辑器中加个菜单,点击这个菜单项时执行打包功能. 类如下,其中的静态变量,如果每次进来不清空,则LIST会越来越大,打包 ...

  3. URP下Alpha从Gamma空间到Linner空间转换(二)——多Alpha贴图叠加

    文章目录 URP 下取消勾选贴图SRGB, 后处理脚本 多重后处理问题 效果对比 完整参考代码 使用后处理进行一次GammaToLinner的转换,能达到正确效果 URP 下取消勾选贴图SRGB, 后 ...

  4. Unity Android平台下插件/SDK开发通用流程

    本文主要面向对Android开发不甚了解的Unity开发者,介绍了基于最新的Android Studio的标准Android开发环境与项目结构的配置流程,在此基础上,开发者可以快速的进行SDK的接入与 ...

  5. Unity Shader - URP Instancing

    URP 中的内置 GPU Instancing 的使用,和 Built-in RP 之前的宏定义名字是一样的,而且功能也是一样的,所以:使用方法和 Built-in RP 中没任何却别 Shader ...

  6. unity游戏引擎下的UGUI(2)

    unity游戏引擎下的UGUI(1)unity游戏引擎下的UGUI_m0_57997518的博客-CSDN博客 4.Image Source Image(放图片)(图片要转换为2D and UI) C ...

  7. 【Unity】Dropdown下拉按钮的一些基本操作 获取值与添加选项

    自己的老帖子,移植过来 原地址: http://www.manew.com/home.php?mod=space&uid=95681&do=blog&view=me&f ...

  8. URP下SRPBatcher,GPUInstancing,动态合批,静态合批

    同时启用时,生效优先级: SRPBatcher > GPUInstancing > 动态合批 SRPBatcher: 适用前提: 需要是同一个shader变体,可以是不同的材质球,项目需要 ...

  9. Unity在URP管线下使用TriLib插件加载模型材质不正确的问题

    目前使用Unity开发项目绝大部分已经使用URP渲染管线,但是TriLib加载进来的模型默认的还是使用内置渲染管线的材质,这会导致材质无法正常显示,解决办法如下: 1.在Assets目录下新建一个As ...

最新文章

  1. SylixOS移植时mk_time函数问题
  2. 决策树算法(一)——一些重要的数学概念
  3. .NET MessageBox 网页弹出消息框
  4. SpringBoot基础入门
  5. NLP系列学习:前向算法和后向算法
  6. centos中配置java视频教程_安装CentOs
  7. app 服务器 运营 维护,app服务器维护
  8. SaaSpace:2022年用于数据管理的15种最佳免费数据库软件
  9. android 拼音搜索
  10. Kali内Nmap端口扫描与高级扫描
  11. HttpClientUtil 工具类
  12. 心形函数表达式及合成思路
  13. Bingo说说:副业刚需时代,你有B计划吗?
  14. 054.CSS网页布局
  15. 如何复制CD音乐(电脑小技巧)
  16. Fiducial marker (Aruco)
  17. 根据离散点画直线_excel表格怎么画散点图画直线
  18. 最适合企业的手机操作系统
  19. 开放后的繁荣——-揭秘韩国游戏市场
  20. 黑色星期五c语言程序,[蓝桥杯][算法训练VIP]黑色星期五 (C语言代码)

热门文章

  1. SecurTrac™ 简介
  2. 计算机类考研数据结构,【择校必看】十三所计算机专业课只考数据结构的985院校!...
  3. 美报告称温室气体排放或将带来外星人攻击
  4. Python函数实现“学生管理系统”案例
  5. 算法学习笔记16:递归树
  6. PC-DMIS 位置度
  7. w7设置双显示器_双11钜惠抢先登场,华硕VG27AQ电竞显示器超值秒杀
  8. 真实案例 | 克罗恩病患者肠道菌群检测
  9. 错误:java.sql.SQLSyntaxErrorException: Table ‘XXX‘ doesn‘t exist
  10. java判断键盘按键按下_在Java中检测并操作键盘方向键