Unity中Shader变体优化

news2024/12/26 3:57:25

文章目录

  • 前言
  • 一、在Unity中查看变体个数,以及有哪些变体
  • 二、若使用预定义的变体太多,我们只使用其中的几个变体,我们该怎么做
    • 优化一:可以直接定义需要的那个变体
    • 优化二:使用 skip_variants 剔除不需要的变体
  • 三、变体的数量增长
    • 1、使用 multi_compile 再定义 3 个变体
    • 由此可见变体数很容易达到成百上千的,所以我们要尽可能地控制变体的数量
    • 2、再用 shader_feature 定义三个变体 D E F
  • 四、变体收集器
    • 1、我们在资源管理界面,创建变体收集器
    • 2、创建了变体收集器后,我们把刚才使用的Shader加入变体收集器
    • 3、然后点击加号,可以看见变体收集器中收集的变体
  • 五、Unity 项目设置 中的 变体收集器
  • 六、测试代码


前言

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


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

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

#pragma multi_compile_fog

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

在这里插入图片描述

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

在这里插入图片描述


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

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

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

#pragma multi_compile _ FOG_LINEAR

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

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

在这里插入图片描述

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

在这里插入图片描述

  • 我们剔除 指数雾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

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

在这里插入图片描述
在这里插入图片描述

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

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

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

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

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

在这里插入图片描述

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

在这里插入图片描述
在这里插入图片描述


四、变体收集器

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

在这里插入图片描述

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

在这里插入图片描述

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

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

在这里插入图片描述


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

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

在这里插入图片描述

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

六、测试代码

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
        }
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【傻瓜级JS-DLL-WINCC-PLC交互】8.DLL读写WINCC连接的PLC数据

思路 JS-DLL-WINCC-PLC之间进行交互,思路,先用Visual Studio创建一个C#的DLL控件,然后这个控件里面嵌入浏览器组件,实现JS与DLL通信,然后DLL放入到WINCC里面的图形编辑器中,实现DLL与WINCC的通信。然后PLC与…

Java实现简单飞翔小鸟游戏

一、创建新项目 首先创建一个新的项目,并命名为飞翔的鸟。 其次在飞翔的鸟项目下创建一个名为images的文件夹用来存放游戏相关图片。 用到的图片如下:0~7: bg: column: gameover: ground: st…

电能量数据采集终端是电表采集器吗?

随着科技的发展和能源管理的日益精细化,电能量数据采集终端——电表采集器在保障电力系统稳定运行、实现节能减排等方面发挥着越来越重要的作用。下面,小编来为大家全面介绍电表采集器的功能、应用场景及其在我国能源领域的价值。 一、电表采集器的定义与…

现在嵌入式培训现在太火爆了过几年,这方面的人才会不会饱和呢?

现在嵌入式培训现在太火爆了,过几年,这方面的人才会不会饱和呢? 现在嵌入式培训现在太火爆了,过几年,这方面的人才会不会饱和呢?不会的!嵌入式在未来的几十年内人才都不会饱和。最近很多小伙伴…

Retrofit+OkHttp打印Request 请求地址参数

在移动端开发时,我们常常需要像web端一样可以方便地查看我们向服务器发送请求的报文详细日志(如请求地址,请求参数,请求类型,服务器响应的耗时时间,请求返回的结果等等)。 使用Retrofit时&…

优化机器学习:解析数据归一化的重要性与应用

在机器学习中,数据归一化是一种数据预处理的技术,旨在将数据转换为相似的范围或标准化的分布。这样做的主要目的是消除不同特征之间的量纲差异或数值范围差异,以确保模型在训练时更稳定、更有效地学习特征之间的关系。 通常,机器…

js闭包的必要条件及创建和消失(生命周期)

>创建闭包的必要条件: 1.函数嵌套 2.内部函数引用外部函数的变量 3.将内部函数作为返回值返回 >闭包是什么? 就是可以访问外部函数(作用域)中变量的内部函数 > 闭包是什么时候产生的? - 当调用外部函数…

PPP/INS紧组合代码学习

前言: 本文是基于IGNAV的PPP/INS紧组合学习,在此之前需要具备GNSS/INS松组合知识,武汉大学的i2nav实验室的KF-GINS项目可以作为学习模板。可以参考这篇优秀博文,链接:KF-GINS源码阅读_李郑骁学导航的博客-CSDN博客 IG…

数据链路层——以太网协议、ARP协议

目录 以太网协议 以太网协议的简介 以太网协议所处的位置 以太网帧(或者说MAC帧)的格式 局域网通信原理 碰撞避免算法(包含MTU的知识点) 局域网攻击原理 ARP协议 ARP协议所在的位置 为什么要存在ARP协议(或者…

win10 下 mvn install 报错:编码GBK不可映射字符

问题背景 由于jenkins需要部署不同的项目,需要使用不同的jdk版本,所以需要配置单独的settings.xml,使用指定的jdk版本进行编译,这里需要单独的maven设置,在配置完后进行mvn的install的时候,由于存在中文注释…

文件操作利器:Python十大库全面解析

更多资料获取 📚 个人网站:ipengtao.com Python拥有多个库用于文件操作,提供了各种功能来管理、读取和写入文件。这些库覆盖了从基本的文件系统交互到高级的文件压缩和数据格式处理等多个方面。文件操作是编程中不可或缺的一部分&#xff0c…

【海思SS528 | VDEC】MPP媒体处理软件V5.0 | 视频解码模块——学习笔记

😁博客主页😁:🚀https://blog.csdn.net/wkd_007🚀 🤑博客内容🤑:🍭嵌入式开发、Linux、C语言、C、数据结构、音视频🍭 🤣本文内容🤣&a…

Golang开发之------ Beego框架

1.安装go(配置环境变量) 2.安装gorm(Goland编辑器举例): go env -w GO111MODULEon go env -w GOPROXYhttps://goproxy.cn,direct 3.初始化项目(首先需要在工作目录新建bin文件夹,pkg文件…

[Python入门系列之十二]安装Jupyter notebook与代码运行

引言 Jupyter Notebook将代码、图片和文本完美结合在一起,为编程学习带来了前所未有的便捷性。本文旨在为初学者提供一个关于Jupyter Notebook的入门指南。 什么是Jupyter Notebook Jupyter Notebook是一个开源的Web应用程序,允许你创建和共享包含代码…

五、初识FreeRTOS之FreeRTOS的任务创建和删除

本节主要学习以下内容: 1,任务创建和删除的API函数(熟悉) 2,任务创建和删除(动态方法)(掌握) 3,任务创建和删除(静态方法)&#xf…

大数据之 Hadoop

hadoop主要解决:海量数据的存储和海量数据的分析计算 hadoop发展历史 Google是hadoop的思想之源(Google在大数据方面的三篇论文) 2006年3月,Map-reduce和Nutch Distributed File System(NDFS)分别被纳入到Hadoop项目&#xff0c…

计算机视觉:使用dlib实现人脸检测

1 dlib介绍 Dlib是一个广泛使用的开源库,在计算机视觉和机器学习领域具有重要影响。它是由Davis King在2002年开发,主要用C语言编写,但也提供了Python接口。Dlib结合了高效的算法和易用性,使其成为学术界和工业界的热门选择。 1.…

C++基础 -18-继承中类继承的区别

无论使用公有,保护,私有继承 都无法访问基类私有成员 在多级继承中 使用公有继承 派生的派生可以访问基类的公有,保护成员 在多级继承中 使用保护继承 派生的派生可以访问基类的公有,保护成员 在多级继承中 使用私有继承 派生的派…

车辆动力学 | 轮胎纵滑和侧滑下的简化模型

1、轮胎模型的定义: ——反应轮胎力学性能(所有侧向力、纵向力以及会正力矩等)与侧偏角和运动状态(滑转率和滑移率)关系的数学模型 2、四个组成部分 胎面层、带束层、胎体、轮辋 3、简化模型的假设条件 4、起滑点&am…

电脑微信多开怎么操作?电脑微信多开bat代码

电脑微信多开怎么操作? 方法一:电脑微信多开bat代码方法二 微信是我们日常使用率很高的社交软件,在工作中因工作需要可能会用到两个微信号,如果是只登录一个微信,另外一个微信的聊天信息很容易漏看,这时候微…