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://www.pswp.cn/web/96579.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/96579.shtml

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

相关文章

猿辅导Android开发面试题及参考答案(下)

为什么开发中要使用线程池,而不是直接创建线程(如控制线程数量、复用线程、降低开销)? 开发中优先使用线程池而非直接创建线程,核心原因是线程池能优化线程管理、降低资源消耗、提高系统稳定性,而直接创建线程存在难以解决的缺陷,具体如下: 控制线程数量,避免资源耗尽…

【网络通信】IP 地址深度解析:从技术原理到企业级应用​

IP 地址深度解析:从技术原理到企业级应用​ 文章目录IP 地址深度解析:从技术原理到企业级应用​前言一、基础认知:IP 地址的技术定位与核心特性​1.1 定义与网络层角色1.2 核心属性与表示法深化二、地址分类:从类别划分到无类别路…

grafana实践

一、如何找到grafana的插件目录 whereis grafana grafana: /etc/grafana /usr/share/grafana插件安装目录、默认安装目录: 把vertamedia-clickhouse-datasource-3.4.4.zip解压到下面目录,然后重启就可以了 /var/lib/grafana/plugins# 6. 设置权限 sudo …

uniapp 文件查找失败:main.js

重装HbuilderX vue.config.js 的 配置 有问题main.js 框架能自动识别 到,不用多余的配置

KEIL烧录时提示“SWD/JTAG communication failure”的解决方法

最新在使用JTAG仿真器串口下载调试程序时,老是下载不成功,识别不到芯片,我尝试重启keil5或者重新插拔仿真器连接线、甚至重启电脑也都不行,每次下载程序都提示如下信息:在确定硬件连接没有问题之后,就开始分…

红日靶场(三)——个人笔记

环境搭建 添加一张网卡(仅主机模式),192.168.93.0/24 网段 开启centos,第一次运行,重启网络服务 service network restart192.168.43.57/24(外网ip) 192.168.93.100/24(内网ip&am…

车载网关框架 --- 车内网关IP转CAN链路解析 done

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 做到欲望极简,了解自己的真实欲望,不受外在潮流的影响,不盲从,不跟风。把自己的精力全部用在自己。一是去掉多余,凡事找规律,基础是诚信;二是…

lvgl修改输入设备驱动使其支持鼠标右键、双击、滑轮...

我在前几章移植 lvgl 到linux上时讲过注册鼠标驱动部分,那时候使用的时默认提供的驱动,支持的鼠标功能很少,只有左键点击,那时候我提过我们可以修改驱动使其支持,下面是具体的实现。看上面代码,我们当时是直…

SpringBoot 中单独一个类中运行main方法报错:找不到或无法加载主类

1. 报错SpringBoot项目,在随机某个类使用main方法,点击运行/调试报错错误: 找不到或无法加载主类 com.central.workorder.config.PropertyEncrypt 原因: java.lang.ClassNotFoundException: com.central.workorder.config.PropertyEncrypt2. 原因缩短命令…

React 核心 Hook 与冷门技巧:useReducer、useEffect、useRef 及 is 属性全解析

📚 前言React 的函数组件 Hooks 模式已经成为现代前端开发的主流。相比类组件,Hooks 让状态管理和副作用处理更加简洁和可复用。但在实际开发中,除了常用的 useState 和 useEffect,还有很多“进阶武器”值得我们掌握。本文将深入…

通义灵码产品演示: 数据库设计与数据分析

作者:了哥 演示主题:AI 进行数据库设计以及做数据分析 演示目的 演示通义灵码对于数据库的设计能力以及数据分析能力。 演示准备 准备数据库,这里为了简单实用 sqlite3 brew install sqlite3使用 vscode,同时安装好通义灵码的插件…

MySQL主从同步参数调优案例

#作者:stackofumbrella 文章目录一、前言二、故障概述2.1 基础信息2.2 故障现象描述三、故障诊断分析3.1 排查过程3.2 问题根因四、故障解决方案 📊4.1 解决方案 🛠️五、总结附件一、前言 在磐基系统中大量使用MySQL作为后端的数据存储&…

【代码随想录算法训练营——Day10】栈与队列——232.用栈实现队列、225.用队列实现栈、20.有效的括号、1047.删除字符串中的所有相邻重复项

LeetCode题目链接 https://leetcode.cn/problems/implement-queue-using-stacks/ https://leetcode.cn/problems/implement-stack-using-queues/description/ https://leetcode.cn/problems/valid-parentheses/description/ https://leetcode.cn/problems/remove-all-adjacent-…

Asp .Net Core 系列:Asp .Net Core 集成 Hangfire+MySQL

在 .NET 或 .NET Core 应用中,若需在不依赖 Windows 服务、独立进程的前提下实现后台处理,Hangfire 是最成熟、简单的方案之一 —— 它可直接嵌入现有应用(如 ASP.NET Core Web 应用),无需额外部署,同时提供…

网站漏洞扫描要怎么处理?

在网络安全领域,网站漏洞是黑客攻击的重要突破口,而网站漏洞扫描能及时发现这些隐患。但很多小白在完成漏洞扫描后,不清楚后续该如何处理,导致漏洞一直存在,给网站安全埋下风险。下面从准备工作、处理步骤、验证维护等…

淘宝RecGPT:通过LLM增强推荐

导论背景 (Background)​​推荐系统的核心挑战​​:怎么 准确推断 用户行为背后快速变化的真实意图,以实现用户、商户和平台的三赢。​​现有方法的局限性​​:传统的基于历史日志共现模式(“从点击学习点击”)的模型&…

【Go系统编程】07 网络化IPC:Go的王牌——Socket编程

大家好,我是Tony Bai。欢迎来到我们《Go 系统编程》专栏的最后一讲。在过去的旅程中,我们探索了管道、消息队列、共享内存等一系列强大的 IPC 机制。它们各有所长,但都有一个共同的、致命的局限性:它们都只能在同一台物理机上工作…

claude code使用小窍门

视频地址 B站 1 /init 在项目最开始的时候,使用/init可以将项目通读一遍。cc会将学习到的关于项目的知识都保存到CLAUD.MD文件中 2、 /compact 用来压缩对话的上下文,claude会将之前的一些乱七八糟或者重复的对话删除压缩,有利于提高AI的…

The learning process of Decision Tree Model|决策树模型学习过程

----------------------------------------------------------------------------------------------- 这是我在我的网站中截取的文章,有更多的文章欢迎来访问我自己的博客网站rn.berlinlian.cn,这里还有很多有关计算机的知识,欢迎进行留言或…

期货盘后空开是认购期权行权?

本文主要介绍期货盘后空开是认购期权行权?期货盘后空开与认购期权行权是两个独立的概念,无直接关联,需从交易机制、操作逻辑及市场规则三方面区分。期货盘后空开是认购期权行权?1. 定义与交易属性期货盘后空开:属于期货…