news 2026/9/16 18:56:42

EntityComponentSystemSamples:在 Entities 上实现 HDRP Lit 材质属性覆盖(Material Property Overrides)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
EntityComponentSystemSamples:在 Entities 上实现 HDRP Lit 材质属性覆盖(Material Property Overrides)

EntityComponentSystemSamples:在 Entities 上实现 HDRP Lit 材质属性覆盖(Material Property Overrides)

【免费下载链接】EntityComponentSystemSamples项目地址: https://gitcode.com/GitHub_Trending/en/EntityComponentSystemSamples

本篇技术指南以 HDRPLitProperties 示例文档 为核心,讲解在 Unity ECS(Entities)工作流中,如何通过材质覆盖 Authoring 组件对 HDRP Lit 材质进行逐实体(per-instance)的属性覆盖,从而在单个 Subscene 内用同一份 HDRP Lit 材质派生出颜色、光滑度、金属度各异的球体。读完本文,你将掌握示例场景的完整操作流程、材质覆盖组件与底层生成代码的对应关系,以及如何扩展覆盖更多 HDRP 材质属性。

HDRP Lit 材质属性覆盖示例:同一基础材质下,各球体通过覆盖 BaseColor / Smoothness / Metallic 呈现出不同的视觉质感。

示例场景展示什么

HDRPLitProperties 是 Unity GraphicsSamples(HDRP 分支)下 "2. MaterialProperties" 章节的一个独立示例,位于GraphicsSamples/HDRPSamples/Assets/SampleScenes/2. MaterialProperties/HDRPLitProperties/目录。该场景的关键事实如下:

  • 场景构成:场景中的球体全部使用HDRP Lit Shader,并且位于一个Subscene中,即HDRPLitProperties/Subscenes/SubsceneSpheres.unity。从场景文件中可以看到球体以Sphere (20)Sphere (26)Sphere (27)等多实例形式排布,构成一组用于对比的演示阵列。
  • 覆盖机制:附着在球体 MeshRenderer 上的材质覆盖 Authoring 组件(HDRP Material Property Authoring components)会覆盖球体的颜色(color)、光滑度(smoothness)和金属度(metallic)三个核心 HDRP Lit 属性。
  • 顶层场景:主场景HDRPLitProperties.unity除 Subscene 外还包含Sky and Fog Volume(天空与雾效体积)、Plane(地面)、Main CameraDirectional Light,为球体提供完整的 HDRP 光照环境,便于直接观察属性覆盖后的渲染差异。

也就是说,示例的核心价值在于演示:在 DOTS/Entities 渲染管线中,材质不再需要为每个实体单独制作实例化的材质资源,而是通过组件数据来逐实体改写着色器属性,这正是 entities.graphics 包中 Material Property Overrides 功能在 HDRP Lit 上的典型应用。

如何运行与查看示例场景

按以下步骤打开并检查该示例:

  1. 打开主场景:在 Unity 编辑器中打开HDRPLitProperties.unity(位于GraphicsSamples/HDRPSamples/Assets/SampleScenes/2. MaterialProperties/HDRPLitProperties/)。
  2. 进入 Subscene:在 Hierarchy(层级)窗口中选择SubsceneSpheres子场景对象,在 Inspector 中点击Open打开该 Subscene,以查看其内部实体与 Authoring 对象。
  3. 选中球体:在 Hierarchy 中选择任意一个球体对象。
  4. 检查覆盖组件:在 Inspector 中注意观察,MeshRenderer 上挂载了若干HDRP Material Property Authoring 组件(对应颜色、光滑度、金属度等属性)。
  5. (可选)扩展属性覆盖:如果你想覆盖其他 HDRP Lit 材质属性,可以在此基础上添加其余类型的 HDRP Material Property Authoring 组件,并在其中填入目标值。

注意:以上步骤要求项目已配置 HDRP 渲染管线。本仓库 HDRPSamples 的 Packages/manifest.json 中声明了com.unity.render-pipelines.high-definition: 17.2.0com.unity.entities.graphics: 1.4.16,这也是该示例所依赖的核心包版本。

覆盖的 HDRP Lit 属性与底层数据映射

示例中球体被覆盖的三个属性——_BaseColor(基础颜色)、_Smoothness(光滑度)、_Metallic(金属度)——正是 HDRP Lit Shader 中最常用的三个材质属性。在 entities.graphics 的覆盖体系中,它们以MaterialOverride 资源 + 覆盖组件的形式组织:

  • 在仓库的同级示例 MaterialOverridesSample 中,HDRPLitOverride.asset(位于SceneAssets/下)的配置内容明确列出了_BaseColor_Metallic_Smoothness三项属性,展示了如何在无代码的情况下配置要覆盖的属性集合。
  • 每个被覆盖属性在运行时都会对应一个[MaterialProperty]特性的IComponentData组件,其字段值会直接写入着色器属性。仓库中MaterialOverridesSample/SceneAssets/目录下就保存了由编辑器自动生成的三个覆盖组件,例如 HDRPMyColorVector4OverrideOverrideGenerated.cs:
using Unity.Entities; using Unity.Mathematics; namespace Unity.Rendering { [MaterialProperty("_HDRPMyColor")] struct HDRPMyColorVector4Override : IComponentData { public float4 Value; } }
[MaterialProperty("_HDRPMyMetallic")] struct HDRPMyMetallicFloatOverride : IComponentData { public float Value; }
[MaterialProperty("_HDRPMySmoothness")] struct HDRPMySmoothnessFloatOverride : IComponentData { public float Value; }

从这几个生成组件的源码可以提炼出覆盖体系的核心规律:

  • [MaterialProperty("着色器属性名")]特性将组件的值绑定到指定的 Shader 属性;属性名的字符串必须与 Shader/Shader Graph 中暴露的_XXX名称完全一致。
  • 值类型与着色器属性类型一一对应:float4对应颜色/向量型属性(如_BaseColor这类Color属性),float对应标量属性(如_Metallic_Smoothness)。
  • 组件放在Unity.Rendering命名空间并实现IComponentData,因此它天然可以作为 ECS 组件被添加到实体上,由 entities.graphics 的渲染系统在每帧构建渲染命令时读取,实现逐实体(per-instance)的材质参数差异,无需为每个球体单独复制材质资源。

如何在 Entities 工作流中扩展材质属性覆盖

结合上述原理,若要在自己的项目(而非仅限该示例)中覆盖更多 HDRP Lit 属性,可以沿以下路径操作:

  1. 使用免代码工作流(推荐):参照MaterialOverridesSample,在物体上添加MaterialOverride 组件,并在其引用的MaterialOverride 资源中勾选需要覆盖的属性(如_BaseColor_Metallic_Smoothness),直接在 Inspector 中填写值。这种方式无需手写任何覆盖组件。
  2. 使用自定义覆盖组件:当需要覆盖 HDRP Lit Shader 中其他暴露的属性时,仿照仓库中HDRPMy*OverrideOverrideGenerated.cs的写法,新建一个标记[MaterialProperty("_YourProperty")]IComponentData结构体,字段类型与 Shader 属性类型保持一致即可;覆盖组件可由编辑器生成或手写。
  3. 在 Subscene 中验证:将上述组件挂在 Subscene 内实体的 MeshRenderer 上(或在运行时动态添加组件),关闭并保存 Subscene 后,实体在运行时即会以覆盖值渲染。

如需了解覆盖体系在无代码场景中的完整配置方式,可进一步阅读 MaterialOverridesSample/README.md;若关心光探针(Light Probe)SH 系数这类内置属性的逐实体覆盖,仓库还提供了 BuiltInMaterialSHProperties 示例,演示通过MeshRenderer > Probes > Light Probes = Custom Provided配合内置材质属性 Authoring 组件覆盖球体光照。

小结

HDRPLitProperties 示例完整展示了 Entities + HDRP 组合下的材质属性覆盖能力:在 Subscene 中批量创建使用同一 HDRP Lit 材质的球体,借助 MeshRenderer 上的材质覆盖 Authoring 组件逐实体改写_BaseColor_Smoothness_Metallic,从而在保证批渲染性能的同时获得丰富的视觉差异。其底层由 entities.graphics(示例版本 1.4.16)的[MaterialProperty]覆盖组件驱动,你既可以通过 MaterialOverride 资源免代码配置,也可以仿照仓库中生成的HDRPMy*Override组件扩展任意 HDRP 材质属性,把这一机制直接复用到自己的渲染项目中。

【免费下载链接】EntityComponentSystemSamples项目地址: https://gitcode.com/GitHub_Trending/en/EntityComponentSystemSamples

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/16 18:56:38

配置Hadoop集群文件详细步骤(CentOS Stream 10)

集群化环境前置准备(三台机器都进行)部署步骤1:配置多台虚拟机步骤2:准备主机名映射步骤3:配置ssh免密登录集群化环境配置步骤4:安装jdk环境(这里使用的是 JDK8)(只在nod…

作者头像 李华
网站建设 2026/9/16 18:56:29

机器人控制器为何必须采用PCIe架构:实时性与确定性数据流的底层支撑

1. 为什么机器人控制器正在集体转向PCIe架构——不是跟风,是刚需倒逼的底层重构你拆开一台2023年后出厂的工业协作机器人控制器,大概率会看到一块标着“PCIe x4”的板卡插在主板上;再打开一台AGV调度主控箱,里面那块负责激光SLAM建…

作者头像 李华
网站建设 2026/9/16 18:55:24

MATLAB粒子群优化PSO实战:从向量化实现到工程部署

简介:本资源是一份面向MATLAB初学者与电力系统优化方向学习者的粒子群优化(PSO)算法入门实践包,聚焦于最优潮流(OPF)等典型工程优化问题的求解。压缩包共3个文件,含2个核心MATLAB源码文件&#…

作者头像 李华
网站建设 2026/9/16 18:54:58

ACTF新生赛Include 1题解:PHP文件包含与php://filter绕过

做CTF新生赛Web题有个规律,题目名字往往直白得可怕。ACTF2020新生赛里这道[ACTF2020 新生赛]Include 1,光看题名就能猜到考点是文件包含,而且专门标注了“新生赛”,难度就是给刚入门的选手入门用的。我当时第一次刷这道题的时候&a…

作者头像 李华
网站建设 2026/9/16 18:53:54

ASP新闻爬虫系统:IIS环境下的DIV+CSS轻量聚合方案

简介:这是一份面向ASP初学者与Web开发实践者的新闻数据采集实战项目,聚焦福建省本地新闻站点的自动化抓取与前端展示。资源采用经典ASP服务端技术栈,结合DIVCSS实现语义化页面布局,覆盖HTTP请求、HTML解析、数据库交互&#xff08…

作者头像 李华
网站建设 2026/9/16 18:53:38

浏览器指纹的物理本质与企业级对抗实战

1. 这不是“防关联”的问题,而是你根本没理解浏览器指纹的物理本质“求一个防关联检测工具,浏览器指纹在线检测”——这句话在技术社区里每天出现几十次,但90%的提问者连问题本身都没定义清楚。我做过三年反爬架构设计,也帮五家招…

作者头像 李华