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
英文地址,請注明出處:http://en.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. 定義與交易屬性期貨盤后空開:屬于期貨…