Unity中Shader变体优化

文章目录

  • 前言
  • 一、在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 100Pass{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 texturefixed4 col = tex2D(_MainTex, i.uv);// apply fogUNITY_APPLY_FOG(i.fogCoord, col);return col;}ENDCG}}
}

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

创建Asp.net MVC项目Ajax实现视图页面数据与后端Json传值显示

简述回顾 继上篇文章创建的mvc传值这里说明一下Json传值。在mvc框架中,不可避免地会遇到前台传值到后台,前台接收后台的值的情况(前台指view,后台指controller),有时只需要从控制器中返回一个处理的结果&a…

开源英伟达 Vulkan 驱动程序 NVK 达到 Vulkan 1.0 标准

导读Collabora今天宣布,其开源NVK图形驱动程序Mesa现已正式符合英伟达图灵硬件上的Vulkan 1.0图形应用程序接口。 “这是任何Nouveau驱动程序首次在任何API上获得Khronos一致性徽章”。Collabora表示,NVK获得Vulkan官方认证是Nouveau图形驱动程序首次在…

人工智能对人脑的探索研究!物理限制推动类脑人工智能的发展

原创 | 文 BFT机器人 在一项开创性的研究中,剑桥科学家采用了一种新颖的人工智能方法,展示了物理约束如何深刻影响了人工智能系统的发展。 这项研究会让人想起人脑的发育和能力限制,为复杂神经系统的进化提供了新的见解。通过整合这些限制&a…

leetcode刷题详解十二

回文子串 首先回文子串问题涉及到的都是单个字符串,所以如果是单个字符串用动态规划的基本都是二维的,i-j 其次,回文字符串,都是从后往前遍历的,这个要记住。因为dp的状态转移方程特性决定的 647. 回文子串 还是用…

sizeof 和 strlen的对比及笔试题目

目录 题目1: 题目2: 题目3: 题目4: 题目5: 题目6: 二维数组题(重点): 上述题目总结: 若想了解其他的字符函数和字符串函数请移步:深入理解…

金色传说:SAP-BC-SM36/SM37后台执行报表查询结果导出时分页和标题多行问题解决

文章目录 前言一、后台执行的启动方式?二、使用步骤1.点击程序-后台执行2.结果查看和导出三、结果显示和导出问题1.结果显示不全问题解决2.结果如何导出到Excel中3.==导出的文件有分页和标题和结果都是多行显示问题解决==总结前言 例如:随着项目数据量增长,很多报表的查询时…

Django连接数据库

连接数据库 接下来讲的几个步骤不需要区分先后,但都得进行操作 settings.py的操作 #!settings.py ....别的代码DATABASES {default: { ENGINE: django.db.backends.mysql, NAME: day1121, # 数据库名字,要先创建好 USER: root, PASSWORD: 123456, HO…

HarmonyOS——UI开展前的阶段总结

当足够的了解了HarmonyOS的相关特性之后,再去介入UI,你会发现无比的轻松,特别当你有着其他的声明式UI开发的经验时,对于HarmonyOS的UI,大致一扫,也就会了。 如何把UI阐述的简单易懂,又能方便大…

hyper-V操作虚拟机ubuntu 22.03

安装hyper-V 点击卸载程序 都勾选上即可 新建虚拟机,选择镜像文件 选择第一代即可 设置内存 配置网络 双击 启动安装虚拟机 输入用户名 zenglg 密码:LuoShuwen123456 按照enter键选中openssh安装 安装中 安装完成 选择重启 输入用户名、密码

20.Oracle11g中的触发器

oracle11g中的触发器 一、触发器的概述1、什么是触发器2、触发器的类型3、触发器的组成4、触发器的作用 二、触发器的创建语法1、创建语法2、数据库启动触发器3、 用户登录触发器: 三、对触发器的基本操作点击此处跳转下一节:21.Oracle的程序包(Package)…

redis的过期策略以及定时器的实现

Redis是客户端服务器结构的程序,客户端与服务器通过网络通信,所以对于keys *这种的操作在大型企业中不太建议,生产环境下的key会非常多,Redis是但现成的服务器,执行keys*的时间非常长,就会导致redis服务器阻…

【LeetCode】101. 对称二叉树

101. 对称二叉树 难度:简单 题目 给你一个二叉树的根节点 root , 检查它是否轴对称。 示例 1: 输入:root [1,2,2,3,4,4,3] 输出:true示例 2: 输入:root [1,2,2,null,3,null,3] 输出&#…