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 Camera与Directional Light,为球体提供完整的 HDRP 光照环境,便于直接观察属性覆盖后的渲染差异。
也就是说,示例的核心价值在于演示:在 DOTS/Entities 渲染管线中,材质不再需要为每个实体单独制作实例化的材质资源,而是通过组件数据来逐实体改写着色器属性,这正是 entities.graphics 包中 Material Property Overrides 功能在 HDRP Lit 上的典型应用。
如何运行与查看示例场景
按以下步骤打开并检查该示例:
- 打开主场景:在 Unity 编辑器中打开
HDRPLitProperties.unity(位于GraphicsSamples/HDRPSamples/Assets/SampleScenes/2. MaterialProperties/HDRPLitProperties/)。 - 进入 Subscene:在 Hierarchy(层级)窗口中选择
SubsceneSpheres子场景对象,在 Inspector 中点击Open打开该 Subscene,以查看其内部实体与 Authoring 对象。 - 选中球体:在 Hierarchy 中选择任意一个球体对象。
- 检查覆盖组件:在 Inspector 中注意观察,MeshRenderer 上挂载了若干HDRP Material Property Authoring 组件(对应颜色、光滑度、金属度等属性)。
- (可选)扩展属性覆盖:如果你想覆盖其他 HDRP Lit 材质属性,可以在此基础上添加其余类型的 HDRP Material Property Authoring 组件,并在其中填入目标值。
注意:以上步骤要求项目已配置 HDRP 渲染管线。本仓库 HDRPSamples 的 Packages/manifest.json 中声明了
com.unity.render-pipelines.high-definition: 17.2.0与com.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 属性,可以沿以下路径操作:
- 使用免代码工作流(推荐):参照
MaterialOverridesSample,在物体上添加MaterialOverride 组件,并在其引用的MaterialOverride 资源中勾选需要覆盖的属性(如_BaseColor、_Metallic、_Smoothness),直接在 Inspector 中填写值。这种方式无需手写任何覆盖组件。 - 使用自定义覆盖组件:当需要覆盖 HDRP Lit Shader 中其他暴露的属性时,仿照仓库中
HDRPMy*OverrideOverrideGenerated.cs的写法,新建一个标记[MaterialProperty("_YourProperty")]的IComponentData结构体,字段类型与 Shader 属性类型保持一致即可;覆盖组件可由编辑器生成或手写。 - 在 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),仅供参考