Unity的URP下使用SRPBatcher

这篇具有很好参考价值的文章主要介绍了Unity的URP下使用SRPBatcher。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

回到目录

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

一、在URP下实现SRP Batcher

1、设置

Unity的URP下使用SRPBatcher,Unity引擎Shader效果,unity,游戏引擎,URP,SRP Batcher

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

2、修改shader

在把项目转换为URP后,会看到shader属性里面出现了SRP Batcher的项
Unity的URP下使用SRPBatcher,Unity引擎Shader效果,unity,游戏引擎,URP,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的全局变量。
Unity的URP下使用SRPBatcher,Unity引擎Shader效果,unity,游戏引擎,URP,SRP Batcher
Unity的URP下使用SRPBatcher,Unity引擎Shader效果,unity,游戏引擎,URP,SRP Batcher

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

例子:
CG:

Shader "azhao/CGBatch"
{
    Properties
    {
        _MainTex ("Texture", 2D) = "white" {}
    }
    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 pos : SV_POSITION;
            };
			CBUFFER_START(UnityPerMaterial)
            sampler2D _MainTex;
            float4 _MainTex_ST;
			CBUFFER_END
            v2f 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 100

        Pass
        {
			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_END
            v2f 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 texture
				half4 col = tex2D(_MainTex, i.uv);
                return col;
            }
			ENDHLSL
        }
    }
}

3、渲染效果

Unity的URP下使用SRPBatcher,Unity引擎Shader效果,unity,游戏引擎,URP,SRP Batcher

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

二、多种渲染方式的对比

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

1、不合并

Unity的URP下使用SRPBatcher,Unity引擎Shader效果,unity,游戏引擎,URP,SRP Batcher
可以看到,动态Batches高达2001
Unity的URP下使用SRPBatcher,Unity引擎Shader效果,unity,游戏引擎,URP,SRP Batcher
从Frame Debug里面看,可以看出渲染的次数非常多

2、静态合并

Unity的URP下使用SRPBatcher,Unity引擎Shader效果,unity,游戏引擎,URP,SRP Batcher
把所有物体勾选上Batching Static,然后渲染
Unity的URP下使用SRPBatcher,Unity引擎Shader效果,unity,游戏引擎,URP,SRP Batcher
出现了颜色变亮了的问题,不过Batches变成了12了,有1989个合并被保存起来了。
Unity的URP下使用SRPBatcher,Unity引擎Shader效果,unity,游戏引擎,URP,SRP Batcher
从Frame Debug看,渲染的次数明显的减少了,总共渲染11次,而每一次的渲染,名称就叫做Static Batch

3、GPU Instancing

在GPU Instancing和静态合并同时勾选时,会优先静态合并,所以不要两者同时使用
Unity的URP下使用SRPBatcher,Unity引擎Shader效果,unity,游戏引擎,URP,SRP Batcher
GPU Instancing之后,Batches变成了9,有1992个合并被保存起来了。
Unity的URP下使用SRPBatcher,Unity引擎Shader效果,unity,游戏引擎,URP,SRP Batcher
从Frame Debug看,总共渲染了8次,每次的名字变成了Draw Mesh(Instanced)

4、SRP Batcher

Unity的URP下使用SRPBatcher,Unity引擎Shader效果,unity,游戏引擎,URP,SRP Batcher
这里显示问题就不去深究了Unity的URP下使用SRPBatcher,Unity引擎Shader效果,unity,游戏引擎,URP,SRP Batcher
从FrameDebug看,同样的渲染了8次,每次的名字就叫SRP Batch。文章来源地址https://www.toymoban.com/news/detail-704572.html

到了这里,关于Unity的URP下使用SRPBatcher的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Unity URP Shader(HLSL)踩坑日记(一)

    最近开始转TA,刚开始学习,资料比较杂乱,其中遇到的问题和一些计算方式,记录一下,后续会一直完善补充。 注意此时Properties中的属性,如果要开启SRP合批,需要放到CBUFFER代码块中。 应用阶段准备的数据---- 顶点着色处理数据(返回值为处理后的数据)---- ------ 片元着色器

    2024年01月17日
    浏览(44)
  • Unity Spine 3.8 (URP) 踩坑(Shader报错修改)

    今天搜索spine优化,看到一篇文章项目导入多个Spine动画 合批 降低DrawCall -- UWA问答 | 游戏开发者互动问答社区 | 侑虎科技 提供了新思路,打算尝试一下URP。但美术使用的spine版本是3.8,项目用的Unity2021.3.11f1c2,直接导入spine URP包,shader报错:half4 不能转成 SurfaceData2D;遂改下

    2024年02月12日
    浏览(49)
  • 【unity实战】使用shader和shader Graph实现2d图片描边效果(附源码)

    最近在学习shader Graph相关内容,其实关于实现2d图片描边效果,网上可以看到很多教程,但是我发现大多数都是基于比较老旧的2018unity版本,可是我们实际开发使用可能是比较新的2021及以上版本,差别还是有的,实际在升级或者使用过程中,会遇到诸多问题,而且也很少有人

    2024年02月16日
    浏览(55)
  • unity URP 利用particle system制作简单的shader交互

    首先这里制作了一个简单交互,使用shader grapgh,根据计算距离和变化数值的差实现交互后的扩散,同时计算消散遮罩让它逐渐谈去。 将他赋予材质物体,根据脚本传入位置和逐渐变化的大小后,呈现这样的效果。 但是,shader graph这样的工具,在做这种效果非常快的同时,也

    2024年02月07日
    浏览(44)
  • Unity URP Shader “Redefinition of _Time“ error

    强烈建议先尝试阅读本文之后自行解决:https://zhuanlan.zhihu.com/p/360566324 我这里记录一下我的思路: 首先检查URP升级是否正确,主要看Asset是否设置,ShaderGraph表现是否正常 尝试排除是否是未定义宏导致的问题,主要是对比ShaderGraph自动生成的代码 确认自己的代码是否使用了

    2024年02月15日
    浏览(36)
  • unity build-in 渲染管线升级urp渲染 shader篇

            由于工作原因需要对项目进行升级,从build-in渲染管线升级到urp渲染管线,我自己对应的unity版本是2018.版本升级到2021.3.2版本,由于最近几年unity版本升级比较快,个体版本差异有所不同,如遇与版本不一致问题敬请谅解。以下是根据官网等系列网站整理的内容

    2023年04月16日
    浏览(59)
  • 【实现100个unity特效之2】使用shader和shader Graph实现2d图片描边效果(附源码)

    最近在学习shader Graph相关内容,其实关于实现2d图片描边效果,网上可以看到很多教程,但是我发现大多数都是基于比较老旧的2018unity版本,可是我们实际开发使用可能是比较新的2021及以上版本,差别还是有的,实际在升级或者使用过程中,会遇到诸多问题,而且也很少有人

    2024年01月21日
    浏览(66)
  • Unity Shader 学习笔记(4)URP渲染管线带阴影PBR-Shader模板 -- 新增可自定义阴影颜色

    材质面板截图 功能实现(URP渲染管线下): 1、进一步优化Shader结构和算法; 2、包含PBR材质; 3、投射和接收阴影,并升级 支持自定义阴影颜色 ; 4、支持点光源照射(但不支持点光源阴影)。 通用渲染截图 自定义阴影颜色截图 完整代码: 写在最后: 1、在我的上一篇文

    2024年02月12日
    浏览(50)
  • 【Unity】URP屏幕后处理UI模糊效果实现

     这里Canvas(1)设置为Overlay能渲染出指定UI高清,其他UI模糊,然而这做法非常不好,如果此时再打开UI 以及 关闭模糊效果 要将这些置顶UI 恢复到原本Canvas里,也就是要管理2套Canvas Shader代码实现模糊  1个Canvas和2个摄像机 主要以上内容,实际上就是因为Render Pass Event是只能Af

    2024年02月10日
    浏览(41)
  • Unity中URP下的菲涅尔效果实现(URP下的法线和视线向量怎么获取)

    我们在这篇文章中,了解一下URP中Shader怎么实现菲涅尔效果,同时学习一下URP下怎么获取法线 和 视线向量。 Lambert光照模型公式: Diffuse = Ambient + Kd * LightColor * max(0,dot(N,L)) 实现灯光照射中间亮 周围暗的效果,核心是dot(N,L) Unity中Shader的Lambert光照的实现 光照效果下, 视线单

    2024年02月02日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包