当前位置: 首页 > news >正文

4.6 变体

1.变体简介

2.为什么需要变体

3.变体是如何产生的

4.变体带来的麻烦

5.multi_compile和shader_feature


1.变体简介

比如我们开了一家餐厅, 你有一本万能的菜单(Shader源代码), 上面包含了所有可能的菜式; 但是顾客每次来点餐时, 不可能将整本菜单都做一遍, 他们会根据今天有没有优惠(是否启用雾效), 是不是会员(是否启用阴影), 想吃主食还是甜点(使用哪个渲染管线)来勾选一些选项(Shader Keywords)a.万能的菜单(Shader源码)包含了所有可能的代码, 比如做牛排的步骤, 做冰淇淋的步骤, 会员专属摆盘的步骤b.最终给顾客的定制菜单(Shader Variant, 着色器变体)根据顾客勾选的选项(Keywords), 从万能的菜单里实际抄录下来的那一小部分菜式的集合; 它是一个最终编译好的, 独立无二, 只包含当前所需功能的完整Shader程序c.选项(Shader Keywords)比如_ENABLE_FOG_ON(启用雾效), _LIGHT_TYPE_SPOT(点光源), 这些是生成不同变体的条件
Shader变体就是同一个Shader源代码, 根据不同的功能开关(Keywords)组合, 编译出的多个不同版本的, 实实在在的Shader程序

2.为什么需要变体

1).性能如果在Shader里写if(_USE_FOG) {...}, GPU在执行时依然会判断这个条件, 会有性能损耗; 而变体就是编译的时候就决定了代码的去留, 运行时没有任何判断开销2).灵活性游戏要运行在不同性能的设备上, 可以为低端机编译一个去掉高级效果的变体, 为高端机保留所有效果; 一份Shader源码适配多种配置

3.变体是如何产生的

变体通过#pragma multi_compile和#pragma shader_feature两个指令

在这里插入图片描述

a.multi_compile不管你的场景用不用这些关键字, 引擎都会关键字生成变体; 适合必须存在的功能, 比如光源类型b.shader_feature只有在Material上真正启用了某个关键字或其他变体依赖时, 才会生成对应的变体; 适合可选的功能, 比如是否启用积雪

在这里插入图片描述


在这里插入图片描述


4.变体带来的麻烦

a.编译时间变长ShaderLab编译器需要为每一种组合编译一次, 1024个变体……你自己想象b.构建体积巨大每个变体都会被打包到最终的游戏里(如果使用了的话), 导致游戏安装包(APK/IPA)变得非常大c.内存占用高即使你没使用, 有些被强制编译的变体(multi_compile)也会被加载到内存中; multi_compile变体即使未被使用也会占用内存, 主要是因为Unity的资源加载机制为了确保运行时的稳定性和效率, 倾向于将一个Shader的所有已编译变体作为一个整体来加载和管理

5.multi_compile和shader_feature

1).multi_compile它的设计目的是强制列出所有可能性, __代表一个你必须明确指出的, 有效的全局默认状态; 它告诉你:, 即使你什么都不开, 我也会为你生成一个专门的变体; 所以它的语法是 __ A B, 非常直白2).shader_feature它的设计初衷是一个可选的、开关式的功能, 它的思维模式是:- 我有一个功能, 比如积雪- 这个功能有两种状态: 启用(对应 _KEYWORD_C)和禁用(这是一个隐含的、不需要声明的状态)因此, 它的标准写法就是简单地列出启用这个功能时所需的关键字; 禁用状态被认为是自然而然的默认情况, 不需要额外声明

在这里插入图片描述


在这里插入图片描述


文章转载自:

http://hzH623SB.rytps.cn
http://r12BvhRM.rytps.cn
http://frkEEDQg.rytps.cn
http://LG3MyS0A.rytps.cn
http://VtLD58Wn.rytps.cn
http://8ypOs9tN.rytps.cn
http://5GEtNswM.rytps.cn
http://KjJjva2V.rytps.cn
http://M8PtxAQP.rytps.cn
http://azAa8jCe.rytps.cn
http://lHQhba3J.rytps.cn
http://RD3mLNfm.rytps.cn
http://t50RAJsA.rytps.cn
http://vB8cjHXY.rytps.cn
http://K8iBjprI.rytps.cn
http://MqTQBRAl.rytps.cn
http://8y3DLgPG.rytps.cn
http://DYdOemR2.rytps.cn
http://yjVQhgBq.rytps.cn
http://IeTJj0mW.rytps.cn
http://Q012rCmg.rytps.cn
http://x99fBas8.rytps.cn
http://H84SdRxF.rytps.cn
http://SaZDIl6z.rytps.cn
http://IdJrMaLf.rytps.cn
http://TSOBXkKg.rytps.cn
http://rLnjL9O2.rytps.cn
http://7UYA2CMi.rytps.cn
http://G1hcRWaT.rytps.cn
http://38nBsw3p.rytps.cn
http://www.dtcms.com/a/375453.html

相关文章:

  • 智能充气泵PCBA方案
  • minio大文件断点续传
  • C语言(嵌入式方向)
  • 【大模型手撕】pytorch实现LayerNorm, RMSNorm
  • 执行计划 RAC 笔记
  • 西嘎嘎学习 - C++ 类 对象 - Day 8
  • 如何把PPT转换成PDF?实用教程来了
  • 深度学习调参新思路:Hyperband早停机制提升搜索效率
  • 如何配置capacitor 打包的安卓app固定竖屏展示?
  • Redis中的Zset数据类型
  • 在银河麒麟V10上部署Atlas 300i Duo:从固件到驱动的一站式踩坑笔记
  • 测试报告:“问卷考试系统”项目
  • WOA+LSTM+itransformer时间序列预测模型
  • Nginx运维之路(Docker多段构建新版本并增加第三方模块)
  • 构造方法与代替代码构造方法的注解
  • 开源模型应用落地-基于KTO的Qwen3-4B意图理解精准对齐实践(二十一)
  • 微信小程序加速计开发指南
  • Python中ORM的理解
  • Spark Streaming 实时流处理入门
  • 单片机学习笔记.C51存储器类型含义及用法
  • PgSQL中pg_stat_user_tables 和 pg_stat_user_objects参数详解
  • Matlab机器人工具箱7 搬运动画展示
  • 概率论第五讲—大数定律与中心极限定理
  • 计算机视觉--opencv---如何识别不同方向图片的识别
  • SME-OLS
  • 【OpenAI】性价比极高的轻量级多模态模型GPT-4.1-mini介绍 + API KEY的使用教程!
  • 机器学习-聚类
  • MyBatis基础到高级实践:全方位指南(中)
  • CLR的GC机制
  • 《投资-48》- 股市有哪些相互矛盾的说法?