深入URP之Shader篇15: Shader關鍵字和變體

之前說了很多shader關鍵字的事情,本篇好好說一下關鍵字和變體。

關鍵字是干什么的

我們寫shader的時候,經常會遇到需要處理不同的情況,比如是否啟用霧,光源是平行光還是點光源,是否使用法線貼圖等等。如果為每一種情況都寫一個單獨的shader,那么這些不同的條件就會組合出非常多的可能性,要寫太多的shader顯然不現實。那么另外一種方法就是像寫程序那樣在shader里面進行邏輯判斷,如果直接用if就屬于動態分支了,對效率有一定的影響,另外就是像c語言預處理宏那樣使用#if#ifdef這類,而此時的條件就是關鍵字。編譯器會對關鍵字進行預處理,從而產生匹配當前所使用的關鍵字的shader版本,比如開啟霧,使用平行光但不使用法線貼圖的shader版本。

什么是變體

每種關鍵字的組合對應的shader版本就是一個shader變體。所謂變體,就是同一份shader源碼,由于啟用了不同的關鍵字組合,經過編譯器預處理就得到了最終不一樣的shader代碼。

使用關鍵字還是使用動態分支

使用關鍵字可以避免動態分支,從單個shader的效率來說是最高的。但是使用關鍵字會造成變體增多,這就意味著GPU需要切換更多的變體來完成渲染。之前我們討論的SRP Batcher的原理就是只要變體不切換,可以高效的重新綁定CBuffer完成draw call,如果變體切換了只能調用一次set pass call,這就打斷了SRP Batcher。根據Unity的建議,盡量減少變體,讓SRP Batcher包含的draw call數目盡量多是首選。當然了,按照我自己的經驗,如果動態分支實在太費,比如會增加貼圖的采樣次數,或者非常復雜的計算,且這個分支在一個warp中是不可能一致的,那么就還是用關鍵字來代替動態分支吧。當然最靠譜的是需要經過profile來決定。

聲明shader keywords

有兩種聲明關鍵字的指令

#pragma multi_compile

  • 聲明一組關鍵字,比如
#pragma multi_compile QUALITY_LOW QUALITY_MEDIUM QUALITY_HIGH QUALITY_ULTRA
  • 默認情況下關鍵字是全局作用域的(即針對所有的shader)
  • 并且影響所有的shader stage(如VS, FS)
  • 構建系統會包含該組中所有關鍵字,例如#pragma multi_compile a b c,會分別編譯出包含定義了a,b和c的shader變體。

#pragma shader_feature

multi_compile有兩點不同:

  • 構建系統只會包含該組中被使用的關鍵字。比如我們可以將shader feature關鍵字在Properties中設置:
Properties
{[MaterialToggle(_USE_FOG)] _UseFog("Use Fog", int)=0 
}
#pragma shader_feature _USE_FOG

當材質啟用_USE_FOG時,這個關鍵字就被使用。當然,如果是multi_compile也可以在材質屬性里面設置,但是無論是否設置該組中的某個關鍵字,這些關鍵字都還是會被編譯,但shader_feature就只有選擇的那些關鍵字會被編譯。

  • 雖然也是聲明一組關鍵字,但是隱含了一個任何關鍵字都沒啟用的情況。
  • 但是如果將shader設置到圖形設置窗口的Always Included Shaders中,那么所有的關鍵字都會被包含。

全局關鍵字和本地關鍵字

上面的聲明方式都是全局關鍵字,所謂全局就是可以使用Shader.EnableKeyword針對所有使用該shader的材質統一開啟或關閉的關鍵字。
而本地關鍵字聲明的時候要加上_local,比如#pragma multi_compile_local,使用Material.EnableKeyword修改,只影響這個材質。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/697721.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/697721.shtml
英文地址,請注明出處:http://en.pswp.cn/news/697721.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

基于springboot+vue的大創管理系統(前后端分離)

博主主頁:貓頭鷹源碼 博主簡介:Java領域優質創作者、CSDN博客專家、阿里云專家博主、公司架構師、全網粉絲5萬、專注Java技術領域和畢業設計項目實戰,歡迎高校老師\講師\同行交流合作 ?主要內容:畢業設計(Javaweb項目|小程序|Pyt…

【selenium】執行 Javascript 腳本 滾動、元素的特殊操作等

某些特殊情況下,使用selenium的api無法操作頁面元素,點擊、滾動實現的某些功能,可以考慮通過執行js來完成。 為什么不用js寫自動化?——selenium第一版是js寫的,但js兼容性存在問題,所以引入webdriver 現在…

ad15 PCB3D模型導出到SOLIDWORKS

注意,工程文件目錄不能用中文,否則導出的文件會不存在 將這個文件直接拖到 SOLIDWORKS 中 下一步很關鍵 顯示出來了 另存為一個轉配體就可以了

12 個對開發人員有用的 Python 腳本

目錄 Create strong random passwordsExtract text from a PDFText processing with PandocManipulate audio with PydubFilter textLocate addressesConvert a CSV to ExcelPattern match with regular expressionsConvert images to JPGCompress imagesGet content from Wiki…

FPS游戲之漫談網絡抖動引發客戶端的卡頓優化

話說各位大神 你們遇到過因為網絡抖動導致客戶端的卡頓現象嗎,或者說測試反饋模擬弱網環境的時候某個功能點會卡頓一下,然后通過各種定位,發現原來是一次性下發了好多包???? 問題來了如果我們在…

海思SD3403,SS928/926,hi3519dv500,hi3516dv500移植yolov7,yolov8(14)

自己挖了一個坑,準備做SS928/SD3403的Yolov8的移植,主要是后臺私信太多人在問相關的問題。先別著急去寫代碼,因為在hi3516dv500下的移植還是比較順利。之前在hi3519av100和hi3559av100系列時遇到過一些問題,所以沒有繼續去移植新的算法。 SS928架構乍一看和hi3559av100特別…

Ubuntu系統本地部署Inis博客結合內網穿透實現遠程訪問本地站點

文章目錄 前言1. Inis博客網站搭建1.1. Inis博客網站下載和安裝1.2 Inis博客網站測試1.3 cpolar的安裝和注冊 2. 本地網頁發布2.1 Cpolar臨時數據隧道2.2 Cpolar穩定隧道(云端設置)2.3.Cpolar穩定隧道(本地設置) 3. 公網訪問測試總…

git 使用總結

文章目錄 git merge 和 git rebasegit mergegit rebase總結 git merge 和 git rebase git merge git merge 最終效果說明: 假設有一個倉庫情況如下,現需要進行 merge: merge 操作流程: merge 的回退操作: git reba…

Java適配器模式 - 靈活應對不匹配的接口

Java適配器模式 - 靈活應對不匹配的接口 引言: 在軟件開發中,我們經常遇到不同系統、庫或框架之間的接口不兼容問題。為了解決這些問題,我們可以使用適配器模式。適配器模式是一種結構型設計模式,它允許不兼容的接口之間進行協作…

用Python采集動態網頁Requests就不那么好用了,試試Selenium

Requests + BeautifulSoup + 額外的庫: 對于一些簡單的動態內容,你能通過分析網絡請求來找到并直接獲取這些數據。 使用 requests 庫來發送 HTTP 請求,并使用 BeautifulSoup 來解析 HTML。 對于 AJAX 請求,你可能需要使用額外的庫(如 mitmproxy 或 BrowserMob Proxy)來…

武漢AAA企業信用等級認證

AAA企業信用等級認證 1. 什么是AAA企業信用等級認證 AAA企業信用等級認證是由國家知名的第三方機構對企業的信用狀況進行評估和認證的一種方式。它是根據企業在市場經濟中所展示出的信用水平、經營實力、企業形象等方面的表現來確定企業的信用等級,以此為企業提供…

在線進制轉換工具

在線進制轉換 - BTool在線工具軟件,為開發者提供方便。 在線進制轉換器提供了二進制,八進制,十進制,十六進制等相互轉換功能。

Putty中運行matlab文件

首先使用命令 cd /home/ya/CodeTest/Matlab進入路徑:到Matlab文件夾下 然后鍵入matlab,進入matlab環境,如果main.m文件在Matlab文件夾下,直接鍵入main即可運行該文件。細節代碼如下: Unable to use key file "y…

LeetCode 2828.判別首字母縮略詞

給你一個字符串數組 words 和一個字符串 s ,請你判斷 s 是不是 words 的 首字母縮略詞 。 如果可以按順序串聯 words 中每個字符串的第一個字符形成字符串 s ,則認為 s 是 words 的首字母縮略詞。例如,“ab” 可以由 [“apple”, “banana”…

【OpenAI官方課程】第三課:ChatGPT文本總結Summarizing

歡迎來到ChatGPT 開發人員提示工程課程(ChatGPT Prompt Engineering for Developers)!本課程將教您如何通過OpenAI API有效地利用大型語言模型(LLM)來創建強大的應用程序。 本課程由OpenAI 的Isa Fulford和 DeepLearn…

【數據分析——Python Pandas庫——數據清洗——電商數據分析】

引言 現如今,我們在電商平臺上購物已經成為日常生活的一部分。對于電商公司而言,如何準確理解消費者的需求,提供更好的服務是非常重要的。在這里,數據分析成為提供關鍵洞察力的工具。Python語言與其數據處理庫Pandas,…

K8S部署Java項目 pod報錯 logs日志內容:no main manifest attribute, in app.jar

天行健,君子以自強不息;地勢坤,君子以厚德載物。 每個人都有惰性,但不斷學習是好好生活的根本,共勉! 文章均為學習整理筆記,分享記錄為主,如有錯誤請指正,共同學習進步。…

hash,以及數據結構——map容器

1.hash是什么? 定義:hash,一般翻譯做散列、雜湊,或音譯為哈希,是把任意長度的輸入(又叫做預映射pre-image)通過散列算法變換成固定長度的輸出, 該輸出就是散列值。這種轉換是一種壓縮映射&…

Ubuntu/WSL下生產密鑰腳本

說明: 有時候需要為開發人員配發密鑰,為方便寫了個小腳本,在linux下運行,要求 python10, putty-tools。 使用時,在staffList定義用戶列表,運行后程序自動產生對應目錄及密鑰。 安裝: apt inst…

jenkins報錯:Pseudo-terminal will not be allocated because stdin is not a terminal

jenkins的流水線部分代碼如下 sh ssh root192.168.2.234 << remotessh cd /var/lib/jenkins/workspace/txkc /usr/local/maven/apache-maven-3.8.6/bin/mvn clean package -U ls remotessh執行流水線出現報錯&#xff1a;Pseudo-terminal will not be allocated because…