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

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.lqws.cn/news/545743.html

相关文章:

  • 数据结构之顺序表(C语言版本)
  • 【高并发服务器项目测试报告】
  • 大事件项目记录4-用户接口开发-更新用户基本信息
  • 【论文阅读 | CVPR 2025 |MambaVision:一种混合 Mamba-Transformer 视觉骨干网络】
  • Node.js到底是什么
  • Dockerfile——AI教你学Docker
  • 【Python】实现对LGBT+ rights worldwide (2025)数据集的可视化展示
  • 还在手动部署?用Jenkins+Docker+Git实现自动化CI/CD
  • 使用ant-design-vue 写个适用于web端的条件搜索栏组件,可折叠展开
  • 2025Mybatis最新教程(七)
  • 机器学习中为什么要用混合精度训练
  • 2025.6.27总结
  • HTTP协议中Connection: Keep-Alive和Keep-Alive: timeout=60, max=100的作用
  • SpringMVC系列(四)(请求处理的十个实验(下))
  • 多模态融合相机L3CAM
  • 高斯过程动态规划(GPDP)
  • 免费无广告PDFCreator:虚拟打印软件一键转 PDF/PNG/JPG
  • printf和scanf
  • 问卷调查[bell ring]
  • 全志A733、瑞芯微RK3576与联发科MTK8371场景化应用解析在物联网与智能设备快速迭代的今天,芯片作为硬件核心直接决定了设备的性能边界与应用场景。
  • moduo之tcp客户端TcpClient
  • Webpack 自定义插件开发指南:构建流程详解与实战开发全攻略
  • Html5播放器禁止拖动播放器进度条(教学场景)
  • 神经网络的概念和案例
  • FrozenBatchNorm2d 详解
  • 聚铭网络入选嘶吼《中国网络安全细分领域产品名录》“云平台安全管理”与“态势感知”双领域TOP10
  • Linux tcp_info:监控TCP连接的秘密武器
  • CatBoost:征服类别型特征的梯度提升王者
  • 蓝牙工作频段与跳频扩频技术(FHSS)详解:面试高频考点与真题解析
  • System.Threading.Tasks 库简介