Unity中Shader变体优化

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


前言

在Shader中,一般有两个方面的优化:一方面是内存优化(即变体优化);一方面是渲染优化(即Shader中计算的优化)。我们这篇文章来了解一下Shader变体的优化。


一、在Unity中查看变体个数,以及有哪些变体

  • 创建一个UnlitShader,里面有一个默认的Shader

#pragma multi_compile_fog

  • 选择Shader后,点击Compile and show code 右边的小箭头可以可见变体数

Unity中Shader变体优化,Unity,unity,java,jvm

  • 变体数后面有一个 Show,可以展示有哪些变体

Unity中Shader变体优化,Unity,unity,java,jvm


二、若使用预定义的变体太多,我们只使用其中的几个变体,我们该怎么做

优化一:可以直接定义需要的那个变体

  • 例如,我们只需要线性雾 FOG_LINEAR 变体,可以单独定义这个变体

#pragma multi_compile _ FOG_LINEAR

  • 空格 _ 空格 是空变体的意思

  • 可以看见我们的变体数变少了

Unity中Shader变体优化,Unity,unity,java,jvm

优化二:使用 skip_variants 剔除不需要的变体

Unity中Shader变体优化,Unity,unity,java,jvm

  • 我们剔除 指数雾1 和 指数雾2

#pragma multi_compile_fog
//优化法二 (使用 skip_variants 剔除变体)
#pragma skip_variants FOG_EXP FOG_EXP2


三、变体的数量增长

1、使用 multi_compile 再定义 3 个变体

#pragma multi_compile_fog
//我们再定义3个变体 A B C 看一下变体数量会增加到多少
#pragma multi_compile A B C

  • 我们会看见,虽然我们只定义了三个变体。但是,最后的变体数,却是相乘的数量

Unity中Shader变体优化,Unity,unity,java,jvm
Unity中Shader变体优化,Unity,unity,java,jvm

由此可见变体数很容易达到成百上千的,所以我们要尽可能地控制变体的数量

2、再用 shader_feature 定义三个变体 D E F

shader_feature定义的变体,只有在使用的时候才会生成

//我们再用 shader_feature 定义三个变体 D E F(shader_feature定义的变体,只有在使用的时候才会生成)
#pragma shader_feature D E F

  • 我们可以看见在剔除没有用到的变体前,我们的变体数由上升了 3 倍

Unity中Shader变体优化,Unity,unity,java,jvm

  • 勾选剔除后,可以把 shader_feature 没有使用的变体剔除

Unity中Shader变体优化,Unity,unity,java,jvm
Unity中Shader变体优化,Unity,unity,java,jvm


四、变体收集器

1、我们在资源管理界面,创建变体收集器

Unity中Shader变体优化,Unity,unity,java,jvm

2、创建了变体收集器后,我们把刚才使用的Shader加入变体收集器

Unity中Shader变体优化,Unity,unity,java,jvm

3、然后点击加号,可以看见变体收集器中收集的变体

变体收集器一般是由程序使用的,在游戏一开始对其进行着色器加载,比如说原神中进入游戏时,卡岩那个游戏加载。

Unity中Shader变体优化,Unity,unity,java,jvm


五、Unity 项目设置 中的 变体收集器

  • Edit->Project Setting->Graphics->Shader Stripping
  • 可以在其中自定义是否使用变体

Unity中Shader变体优化,Unity,unity,java,jvm文章来源地址https://www.toymoban.com/news/detail-757519.html

  • 还可以把用到的变体,全都打包成一个变体收集器(一般不推荐这样用,变体太多太杂了)

六、测试代码

Shader "MyShader/P2_3_2"
{
    Properties
    {
        _MainTex ("Texture", 2D) = "white" {}
    }
    SubShader
    {
        Tags { "RenderType"="Opaque" }
        LOD 100

        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            // make fog work
            #pragma multi_compile_fog
            //优化法一 ( _ 是空变体的意思)
            //#pragma multi_compile _ FOG_LINEAR

            //优化法二 (使用 skip_variants 剔除变体)
            //#pragma skip_variants FOG_EXP FOG_EXP2

            //我们再定义3个变体 A B C 看一下变体数量会增加到多少
            #pragma multi_compile A B C

            //我们再用 shader_feature 定义三个变体 D E F(shader_feature定义的变体,只有在使用的时候才会生成)
            #pragma shader_feature D E F
            
            #include "UnityCG.cginc"

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

            struct v2f
            {
                float2 uv : TEXCOORD0;
                UNITY_FOG_COORDS(1)
                float4 vertex : SV_POSITION;
            };

            sampler2D _MainTex;
            float4 _MainTex_ST;

            v2f vert (appdata v)
            {
                v2f o;
                o.vertex = UnityObjectToClipPos(v.vertex);
                o.uv = TRANSFORM_TEX(v.uv, _MainTex);
                UNITY_TRANSFER_FOG(o,o.vertex);
                return o;
            }

            fixed4 frag (v2f i) : SV_Target
            {
                // sample the texture
                fixed4 col = tex2D(_MainTex, i.uv);
                // apply fog
                UNITY_APPLY_FOG(i.fogCoord, col);
                return col;
            }
            ENDCG
        }
    }
}

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

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

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

相关文章

  • Unity Shader - UI/Default shader 优化示例

    Unity : 2020.3.37f1 Pipeline : BRP 做性能优化都是慢慢都扣出来的 当然,优先处理 top 热点的 但是一些就算不是 top,但是像素面积有多,overdraw 也多不可小觑 当然,如果你能找到性能热点,那还是优先分析一下哪些 shader 占的 cycles 最高,和 A, L/S, T, 最高 还有 register 的数量尽可能

    2024年02月07日
    浏览(41)
  • Unity中Shader指令优化(编译后指令解析)

    我们先读懂Shader编译后代码,才能对Shader进行合理的优化 我们目前先只编译到 D3D 平台 这是编译后的代码(我们来逐步分析):

    2024年02月04日
    浏览(42)
  • Unity中Shader抓取屏幕并实现扭曲效果(优化)

    对上一篇中实现的shader进行优化 1、定义结构体用于传入顶点坐标系 struct appdata { float4 vertex : POSITION; //从应用程序阶段的输入,多加一个uv,用于对扭曲纹理的采样 float2 uv : TEXCOORD; }; 2、因为UnityObjectToClipPos是从本地空间转换到裁剪空间,但是没有进行透视除法,所以需要对其

    2024年02月03日
    浏览(47)
  • Unity中的渲染优化技术 -- Shader入门精要学习(15)

    本章中,我们将阐述一些 Unity 中常见的优化技术。这些优化技术都是和渲染相关的,例如,使用批处理、LOD 技术等。 游戏优化不仅是程序员的工作,更需要美工人员在游戏的美术上进行一定的权衡。例如,避免使用全屏的屏幕特效,避免使用计算复杂的 Shader,减少透明混合

    2024年01月18日
    浏览(39)
  • Unity 性能优化Shader分析处理函数:ShaderUtil.GetShaderGlobalKeywords用法

    点击封面跳转下载页面 在Unity开发中,性能优化是一个非常重要的方面。一个常见的性能优化技巧是使用ShaderUtil.GetShaderGlobalKeywords函数来获取着色器的全局。本文将介绍如何正确使用该函数,并提供一个实例代码来演示其用法。 ShaderUtil.GetShaderGlobalKeywords是Unity引擎中

    2024年02月09日
    浏览(35)
  • Unity 性能优化之Shader分析处理函数ShaderUtil.HasProceduralInstancing: 深入解析与实用案例

    点击封面跳转到Unity国际版下载页面 在Unity中,性能优化是游戏开发过程中非常重要的一环。其中,Shader的优化对于游戏的性能提升起着至关重要的作用。本文将深入解析Unity中的Shader处理函数 ShaderUtil.HasProceduralInstancing ,并提供一些实用案例来展示其用法。 ShaderUtil.HasProce

    2024年02月09日
    浏览(40)
  • Unity -- 预制体与变体

     1.一个游戏物体的图标为蓝色的时候,表明这个游戏物体是通过预制体创建的 当我们在修改预制体的时候,通过预制体创建的游戏物体也会同步修改(给预制体添加组件的时候,通过预制体创建的游戏对象也会添加对应的组件) 而当我们修改通过预制体创建的游戏物体时,

    2023年04月27日
    浏览(33)
  • Unity ShaderVariant 变体收集方案分析

    最近遇到一个问题,在editor中场景渲染正确,打包android之后,渲染异常。 经过排查得出原因: 工程把所有shader单独打包Assetbundle,editor打包ab包的时候,未收集到正确的shader变体,未将场景中使用的shader变体打包到ab包中,所以发布apk之后,渲染异常。 什么是shader变体:Sh

    2024年02月16日
    浏览(39)
  • Unity中AssetBundle的变体(Varient)使用教程

    在使用Unity的AssetBundle过程中,选中资源物体之后,发现右下角的AssetBundle面板,除了有一个命名标签外,还有一个Varient标签,这边文章主要介绍下这个标签的用法,如下图: 多语言 :在做游戏开发的过程中,会遇到多语言问题,特别是现在推行的游戏全球化,所以支持多语

    2024年02月16日
    浏览(40)
  • 详解Unity预制体和预制体变体(Prefab Variant)

    一、预制体变体的创建 二、预制体与变体的绑定 三、预制体到变体的继承关系 四、变体常见API 五、变体用途 通过一个预制体创建预制体变体可以通过以下两种方法: 1.在需要创建变体的预制体上右键选择图中选项即可在预制体当前目录下创建预制体变体。  2.通过脚本进行

    2024年01月17日
    浏览(40)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包