Unity知識點-Renderer常用材質變量

????????本篇總結了Unity中renderer的3種常用的材質相關的變量:renderer.material,renderer.sharedMaterial,renderer.MaterialPropertyBlock。以及三者對SRPBatcher的影響。

一.介紹及對比

1.概念介紹

1.material

定義:material 是Render組件(如MeshRenderer)的實例化材質。

特點

訪問renderer.material會自動復制一份材質實例(如果之前是共享的),這樣你修改這個材質只影響當前物體,不會影響其他使用同一材質的物體。適合給單個物體做特定修改,比如改顏色、貼圖等。

性能:實例化材質會額外占用內存,修改頻繁會增加GC壓力。

2. sharedMaterial

定義:sharedMaterial 是Render使用的共享材質資源,多個物體可以共用同一份材質實例。

特點

修改sharedMaterial會影響所有使用該材質的物體。適合修改全局材質,比如編輯場景中統一的材質。

性能:不會產生額外實例,節省內存。

3.materialPropertyBlock

定義:materialPropertyBlock(簡稱MPB)是用于臨時覆蓋材質屬性的一個工具,可以在不實例化材質的情況下,給單個 Renderer 設置不同的材質屬性(如顏色、紋理、浮點參數等)。

特點

不會創建新的材質實例,也不會修改共享材質本身。

只影響當前 Renderer 的渲染效果,方便批處理且性能友好。

適用于需要大量物體同用一個材質,但表現出不同屬性(顏色、亮度等)時使用。

var mpb = new MaterialPropertyBlock();
renderer.GetPropertyBlock(mpb);
mpb.SetColor("_Color", Color.green);
renderer.SetPropertyBlock(mpb);

2.對比

特性materialsharedMaterialMaterialPropertyBlock
是否實例化材質是,自動實例化否,共享材質不實例化材質,僅覆蓋屬性
是否影響所有物體否,只影響當前 Renderer是,影響所有使用該材質物體否,只影響當前 Renderer
適用場景單獨修改某個物體的材質屬性修改所有使用該材質的物體時(全局修改)

大批量物體不同屬性但共用材質的場景

單個物體臨時修改材質參數,且避免實例化材質

性能影響較大,可能導致內存和GC開銷較小較小,性能友好
數據存儲位置獨立材質實例資源文件臨時GPU參數覆蓋
注意避免頻繁使用,適合少量特殊對象慎用,通常用于編輯器或者全局風格調整盡量讓共享一組參數的物體使用相同 MPB 數據,避免每個物體都用不同數據

二.分別對SRPBatcher的影響

1.render.material

訪問render.material 會實例化材質(clone),導致該物體的材質不再是共享的。

實例化材質意味著該物體擁有自己獨立的材質狀態,哪怕其他物體材質完全一樣,也不再視為“同一材質”。

renderer.material.color = Color.red;

訪問 render.material會自動給該 Renderer 創建一份新的材質實例(也就是材質的“實例化”),然后返回這份實例。

因此,SRPBatcher 無法將該物體與使用共享材質的物體合批,會破壞批處理。

底層原因:SRPBatcher 判斷材質是否相同通常基于材質實例(Material instance)是否完全匹配。實例化后材質地址不同,狀態不一致,批處理被打斷

2. render.sharedMaterial

多個物體共享同一個sharedMaterial,材質狀態完全一致。

這符合 SRPBatcher 的批處理條件,有利于批處理的實現。(也是一種享元思想在資源內存方面的體現)

因此,使用sharedMaterial是保證 SRPBatcher 批處理有效的前提之一。

3.MaterialPropertyBlock?

MaterialPropertyBlock可以在不實例化材質的前提下,臨時覆蓋單個 Renderer 的材質參數

Unity 的 SRPBatcher 對部分類型的屬性(例如可批處理的常量緩沖區參數)支持合批處理,即使有不同的MaterialPropertyBlock。

但如果 MPB 修改了不能合批的參數(比如部分紋理資源),也可能導致批處理失敗。

總體來說,合理使用 MPB 能最大化利用 SRPBatcher 性能優勢,同時實現物體個性化表現。

不合理用法:多個物體使用不同的MPB

 foreach (var cube in cubes){var renderer = cube.GetComponent<Renderer>();var mpb = new MaterialPropertyBlock();// 每個物體顏色不同,都會生成不同的MPB數據mpb.SetColor("_Color", Random.ColorHSV());  renderer.SetPropertyBlock(mpb);}

合理用法:統一MPB數據

   var mpb = new MaterialPropertyBlock();mpb.SetColor("_Color", color);  // 所有物體共享同一個顏色參數foreach (var cube in cubes){var renderer = cube.GetComponent<Renderer>();// 共享同一個 MPB 數據,SRPBatcher 可合批renderer.SetPropertyBlock(mpb);}

本篇完

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

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

相關文章

【算法】??如何判斷時間復雜度?

文章目錄 1. 什么是時間復雜度&#xff1f;為什么需要時間復雜度&#xff1f; 2. 常見時間復雜度對比3. 如何分析時間復雜度&#xff1f;&#xff08;Java版&#xff09;&#x1f539; 步驟1&#xff1a;找出基本操作&#x1f539; 步驟2&#xff1a;分析循環結構&#xff08;1…

MySQL使用C語言連接

文章目錄 版本查看以及編譯mysql接口介紹初始化鏈接數據庫下發mysql命令mysql_query獲取執行結果mysql_store_result獲取結果行數mysql_num_rows獲取結果列數mysql_num_fields獲取列名mysql_fetch_fields獲取結果內容mysql_fetch_row關閉mysql鏈接mysql_closeC語言操作mysql查看…

堅持每日Codeforces三題挑戰:Day 7 - 題目詳解(2025-06-11,難度:1200,1300,1500)

每天堅持寫三道題第七天&#xff1a; Problem - A - Codeforces 1200 Problem - B - Codeforces 1300 Problem - A - Codeforces 1500 目錄 題目一: 題目大意: 解題思路: 代碼(C): 題目二: 題目大意: 解題思路: 代碼(C): 題目三: 題目大意: 解題思路: 代碼(C): …

洛谷 P4305:[JLOI2011] 不重復數字 ← unordered_set

【題目來源】 https://www.luogu.com.cn/problem/P4305 【題目描述】 給定 n 個數&#xff0c;要求把其中重復的去掉&#xff0c;只保留第一次出現的數。 【輸入格式】 第一行一個整數 T&#xff0c;表示數據組數。 對于每組數據&#xff0c;第一行一個整數 n。第二行 n 個數…

STM32固件升級設計——SPIFLASH模擬U盤升級固件

目錄 概述 一、功能描述 1、BootLoader部分&#xff1a; 2、APP部分&#xff1a; 二、BootLoader程序制作 1、分區定義 2、 主函數 3、配置USB 4、配置fatfs文件系統 5、程序跳轉 三、APP程序制作 四、工程配置&#xff08;默認KEIL5&#xff09; 五、運行測試 六…

解鎖阿里云日志服務SLS:云時代的日志管理利器

引言&#xff1a;開啟日志管理新篇 在云計算時代&#xff0c;數據如同企業的血液&#xff0c;源源不斷地產生并流動。從用戶的每一次點擊&#xff0c;到系統后臺的每一個操作&#xff0c;數據都在記錄著企業運營的軌跡。而在這些海量的數據中&#xff0c;日志數據占據著至關重…

Keye-VL-8B-Preview:由快手 Kwai Keye 團隊精心打造的尖端多模態大語言模型

&#x1f525; News 2025.06.26 &#x1f31f; 我們非常自豪地推出Kwai Keye-VL&#xff0c;這是快手Kwai Keye團隊精心打造的前沿多模態大語言模型。作為快手先進技術生態中的核心AI產品&#xff0c;Keye在視頻理解、視覺感知和推理任務方面表現卓越&#xff0c;樹立了新的性…

Web前端之JavaScript實現圖片圓環、圓環元素根據角度指向圓心、translate、rotate

MENU 前言效果HtmlStyleJavaScript 前言 代碼段創建了一個由6個WiFi圖標組成的圓形排列&#xff0c;每個圖標均勻分布在圓周上。 效果 Html 代碼 <div class"ring"><div class"item"><img class"img" src"../image/icon/W…

1 Studying《Computer Vision: Algorithms and Applications 2nd Edition》11-15

目錄 Chapter 11 Structure from motion and SLAM 11.1 幾何內稟校準 11.2 姿態估計 11.3 從運動中獲得的雙幀結構 11.4 從運動中提取多幀結構 11.5 同步定位與建圖&#xff08;SLAM&#xff09; 11.6 額外閱讀 Chapter 12 Depth estimation 12.1 極點幾何 12.2 稀疏…

phpstudy 可以按照mysql 數據庫

phpstudy 可以按照mysql 數據庫 PHPStudy&#xff08;小皮面板&#xff09;是一款專為開發者設計的集成環境工具&#xff0c;涵蓋服務器配置、開發環境搭建、網站部署等多項功能。以下是其核心用途及優勢的詳細解析&#xff1a; 一、開發環境快速搭建 一站式集成環境集成Apa…

Python搭建HTTP服務,如何用內網穿透快速遠程訪問?

Python的內置HTTP服務模塊是開發者工具箱中的瑞士軍刀&#xff0c;只需一行命令即可啟動一個功能完備的Web服務器。無論是前端工程師調試頁面、數據科學家共享Jupyter Notebook&#xff0c;還是后端開發者快速驗證API原型&#xff0c;Python HTTP服務都能以零配置的方式滿足需求…

撥號音識別系統的設計與實現

撥號音識別系統的設計與實現 摘要 本文設計并實現了一個完整的撥號音識別系統&#xff0c;該系統能夠自動識別電話號碼中的數字。系統基于雙音多頻(DTMF)技術原理&#xff0c;使用MATLAB開發&#xff0c;包含GUI界面展示處理過程和結果。系統支持從麥克風實時錄音或加載音頻文…

數據結構-樹詳解

樹簡介 樹存儲和組織具有層級結構的數據&#xff08;例&#xff1a;公司職級&#xff09;&#xff0c;就是一顆倒立生長的樹。 屬性&#xff1a; 遞歸n個節點有n-1個連接節點x的深度&#xff1a;節點x到根節點的最長路徑節點x的高度&#xff1a;節點x到葉子節點的最長路徑 …

【安卓Sensor框架-2】應用注冊Sensor 流程

注冊傳感器的核心流程為如下&#xff1a;應用層調用 SensorManager注冊傳感器&#xff0c;framework層創建SensorEventQueue對象&#xff08;事件隊列&#xff09;&#xff0c;通過JNI調用Native方法nativeEnableSensor()&#xff1b;SensorService服務端createEventQueue()創建…

新版本沒有docker-desktop-data分發 | docker desktop 鏡像遷移

在新版本的docker desktop中&#xff08;如4.42版本&#xff09;&#xff0c;鏡像遷移只需要更改路徑即可。如下&#xff1a; 打開docker desktop的設置&#xff08;圖1&#xff09;&#xff0c;將圖2的原來的地址C:\Users\用戶\AppData\Local\Docker\wsl修改為你想要的空文件…

EtherCAT SOEM源碼分析 - ec_init

ec_init SOEM主站一切開始的地方始于ec_init, 它是EtherCAT主站初始化的入口。初始化SOEM 主站&#xff0c;并綁定到socket到ifname。 /** Initialise lib in single NIC mode* param[in] ifname Dev name, f.e. "eth0"* return >0 if OK* see ecx_init*/ in…

84、原理解析-SpringApplication創建初始化流程

84、原理解析-SpringApplication初始化流程 # SpringApplication創建初始化流程原理解析 SpringApplication的創建和初始化是Spring Boot應用啟動的關鍵步驟&#xff0c;主要包括以下過程&#xff1a; ## 1. 創建SpringApplication實例 ### 1.1 調用構造函數 - 當調用SpringApp…

【數理邏輯】 選擇公理與集值映射

目錄 選擇公理1. 有限指標集 I I I2. 可數無限指標集 I I I &#xff08;簡稱為 ACC 或 ACω&#xff09;3. 不可數無限指標集 I I I4. 選擇公理的層級與數學應用5. 選擇公理的深層意義 集值映射的選擇函數1. 選擇公理的核心作用2. 不同情況下的依賴性分析3. AC 的必要性證明…

微信小程序使用wx.chooseImage上傳圖片時進行壓縮,并添加時間水印

在微信小程序的開發過程&#xff0c;經常會使用自帶的api(wx.chooseImage)進行圖片拍照或選擇圖片進行上傳&#xff0c;有時圖片太大&#xff0c;造成上傳和下載時過慢&#xff0c;現對圖片進行壓縮后上傳&#xff0c;以下是流程和代碼 一、小程序的版本選擇了3.2.5&#xff0…

RAII簡介

&#x1f4e6; 一、技術原理簡介&#xff1a;RAII是個“托管狂魔” 想象你有個健忘的朋友&#xff0c;每次借東西都會忘記歸還。RAII&#xff08;Resource Acquisition Is Initialization&#xff0c;資源獲取即初始化&#xff09;就是C派來的“超級管家”&#xff1a; “你負…