ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

EntityComponentSystemSamples 实战:在 Entities Graphics 中正确使用多子网格(Submesh)与多材质烘焙

EntityComponentSystemSamples 实战:在 Entities Graphics 中正确使用多子网格(Submesh)与多材质烘焙 EntityComponentSystemSamples 实战在 Entities Graphics 中正确使用多子网格Submesh与多材质烘焙【免费下载链接】EntityComponentSystemSamples项目地址: https://gitcode.com/GitHub_Trending/en/EntityComponentSystemSamples本文是 EntityComponentSystemSamples 仓库中 HDRP Samples 项目的技术指南围绕 Submesh 示例场景 展开。该场景演示了 Entities Graphics 如何烘焙带多个 sub-mesh 的 Mesh以及一个 Entity 只能绑定一个 Material这一核心约束下多材质 GameObject 会被拆分为多个 Entity 的底层行为。读完本文你将理解 sub-mesh 与材质的对应关系、烘焙拆分的触发条件并能通过 Entities Hierarchy 窗口亲手验证这一拆分过程为后续处理复杂网格资源打下基础。一、示例场景概述在 HDRP Samples 项目中Submesh场景位于 6. Misc 目录是官方用于演示Entities Graphics 多子网格支持的样例。项目主 README 对它的定位是Demonstrates using a Mesh with multiple sub-meshes with Entities GraphicsGraphicsSamples/HDRPSamples/README.md。整个场景的构成非常精简一个空壳主场景 Submesh.unity只包含 Main Camera、Directional Light、一个地面 Plane 和一个带有AutoLoadScene: 1的 SubScene 组件一个 SubScene.unity内部仅有一个名为Cubes的 authoring GameObject。也就是说演示逻辑全部收敛在 SubScene 的单个 GameObject 上——这正是观察多材质被拆分为多 Entity的最干净样本。二、场景里到底有什么一个 Mesh、三个 Sub-Mesh、三个材质2.1 Mesh 资源的子网格结构SubScene 中的CubesGameObject 通过MeshFilter引用了 Cubes.asset 这个 Mesh 资源。打开该资产的 YAML 序列化文件可以看到m_SubMeshes数组中定义了三个子网格子网格firstByteindexCountvertexCount包围盒中心 (x)对应立方体SubMesh 0036240第 1 个立方体SubMesh 17236243.25第 2 个立方体SubMesh 214436241.62第 3 个立方体每个子网格indexCount: 36即 12 个三角形vertexCount: 24正好是一个立方体的标准面数/顶点数三个子网格共享同一个顶点缓冲区m_VertexCount: 72通过firstByte区分各自的索引段。从顶点数据_typelessdata中的坐标分量可以看到三个立方体被放置在 x 轴上的不同位置最终 Mesh 的整体包围盒为m_Center: {x: 1.625, y: 0, z: 0}、m_Extent: {x: 2.125, y: 0.5, z: 0.5}。2.2 材质的挂接方式Cubes的MeshRenderer组件上挂了一个长度为 3 的材质数组分别指向 SceneAssets 下的三个 HDRP Lit 材质通过.meta中的 guid 可确认对应关系Red.matguid45b59214118ecdb448f7015259ff6d38——_BaseColor为{r: 1, g: 0, b: 0}Green.matguid02e0265043393054c90dd96499c50df8——绿色Blue.matguidc45ea55d5584dec4d917f1447b823b5d——蓝色材质本身是标准的 HDRP Lit 材质m_Shader指向 HDRP Lit shaderm_SurfaceType: 0为 Opaquem_CustomRenderQueue: 2225未使用任何纹理仅通过_BaseColor区分颜色目的就是让拆分结果在 Entities Hierarchy 中一目了然。在传统 GameObject 渲染管线中MeshRenderer会把第 N 个材质按顺序应用到第 N 个子网格上即红、绿、蓝三色立方体由一个 GameObject 一次绘制完成。三、核心机制为什么一个 GameObject 会被烘焙成多个 Entity3.1 Entities Graphics 的一 Entity 一材质约束这是本示例要演示的最关键原理Entities 只支持一个 Entity 绑定一个 Material原文Entities support only a single Material per Entity。Entities Graphics 的数据组织以RenderMesh组件为核心一个 Entity 对应一份 Mesh Material 的组合。因此当烘焙器Baker遇到一个 Mesh 带多个子网格 多个材质的 authoring GameObject 时无法用一个 Entity 完整表达只能执行拆分策略把该 GameObject 按材质维度拆分为若干 Entity每个 Entity 持有原始 Mesh 的一个子网格并绑定对应的那个 Material。场景中的Cubes有 3 个子网格、3 个材质于是被烘焙成3 个独立的 Entity分别对应红色立方体、绿色立方体、蓝色立方体。每个 Entity 的 Mesh 都是原始CubesMesh 的其中一个 sub-mesh材质则各取其一。3.2 与烘焙管线的对应关系这一行为发生在 SubScene 的 baking 阶段。从场景配置可以验证Submesh.unity 中的 SubScene 组件引用 SubScene.unitySubScene 内的Cubes在烘焙时由MeshRenderer组件触发生成RenderMesh相关组件多材质导致拆分后运行时 / Entities Hierarchy 中呈现为多个 Entity但它们共享同一个网格顶点缓冲与索引缓冲体现在Cubes.asset中三份子网格共享m_VertexData只是绘制时各自取用对应的子网格索引区间和材质。换句话说拆分是逻辑层的拆分GPU 侧的顶点数据仍然是一份这保证了拆分的开销很小。四、动手验证在 Entities Hierarchy 中观察拆分结果4.1 操作步骤原文档给出了完整的验证流程逐条对照执行即可确保 Hierarchy 中 SubScene 处于关闭状态——SubScene 未打开时其中的内容以 Entity 形式存在于实体世界中而不是作为 GameObject 暴露在普通场景层级中打开菜单Window Entities Hierarchy调出实体层级窗口在窗口中定位到该 SubScene导航到 SubScene 对应节点展开其下带层级结构的 Entity即烘焙自Cubes的那组 Entity观察存在三个 Entity它们全部由同一个 authoring GameObject 烘焙而来。4.2 预期看到的验证结果展开后你会看到类似下面的结构以官方描述为准具体节点命名以打开场景时为准一个父级 Entity对应烘焙后的整体通常携带 Transform 等信息其下 3 个子 EntityEntity A —— 红色立方体Cubes 子网格 0 Red.matEntity B —— 绿色立方体Cubes 子网格 1 Green.matEntity C —— 蓝色立方体Cubes 子网格 2 Blue.mat这 3 个 Entity 的 Mesh 引用都指向同一个CubesMesh 资源区别在于子网格索引与材质引用不同。这就是多材质 GameObject → 多 Entity的最直观证据。五、延伸思考多子网格资源在实际项目中的处理建议5.1 何时该用多子网格Unity 的 Mesh 支持一个资源含多个子网格常见于以下场景共享顶点数据的组合体多个部件如汽车车身、车轮、车窗合并成一个 Mesh 资源但需要不同材质美术 DCC 工具导出的合并网格模型在建模软件中合并导出后自带多个 material slotLOD / 部件分离运行时按需绘制部分子网格。在上述场景中引入 Entities Graphics 时本示例揭示的拆分行为会自动生效无需手动改造美术资源烘焙器会自动按材质把资源拆成多个 Entity。5.2 从拆分机制出发的实用建议性能权衡拆分会增加 Entity 数量与 Draw Call 数量一个子网格一个材质 一次绘制。如果某些子网格使用同一材质可以考虑在 DCC 工具中合并减少拆分后的 Entity 数量材质一致性由于拆分粒度是按材质保证同一视觉单元的子网格尽量使用同一材质可以让烘焙结果更紧凑运行时修改拆出来的每个 Entity 拥有独立的RenderMesh数据运行时可按 Entity 单独替换材质或隐藏/显示这比在传统管线中切换整个 Renderer 的材质数组更符合 ECS 的数据驱动风格仓库中 MaterialMeshChange 场景对此有更专门的演示URP 同样适用本示例在 URPSamples 项目中也有对应副本说明该拆分行为是 Entities Graphics 的通用规则与渲染管线HDRP/URP无关。六、相关资源索引示例 READMEGraphicsSamples/HDRPSamples/Assets/SampleScenes/6. Misc/Submesh/README.md运行效果截图GraphicsSamples/HDRPSamples/READMEimages/Submesh.png主场景Submesh.unity含 SubScene 组件与基础灯光/相机SubScene 内容Subscenes/SubScene.unity含唯一的Cubesauthoring GameObject多子网格 Mesh 资源SceneAssets/Cubes.asset3 个子网格共享 72 个顶点三个材质Red.mat、Green.mat、Blue.matHDRP 项目样例总览GraphicsSamples/HDRPSamples/README.mdURP 同款示例GraphicsSamples/URPSamples/Assets/SampleScenes/6. Misc/Submesh/README.md七、小结通过本示例可以确认 Entities Graphics 对多子网格 Mesh 的处理规则一个 Entity 只能持有一种材质因此带多材质子网格的 authoring GameObject 会在烘焙时被自动拆分为多个 Entity每个 Entity 共享网格数据、各自绑定一个子网格和一个材质。在实际项目中理解这一机制有助于预估 Entity 数量与 Draw Call 开销并为美术资源合批策略提供决策依据。如果你需要进一步探索 Entities Graphics 的其他能力仓库中的 MaterialMeshChange运行时换材质/网格与 RenderMeshUtilityExample运行时创建渲染实体场景是很好的下一站。【免费下载链接】EntityComponentSystemSamples项目地址: https://gitcode.com/GitHub_Trending/en/EntityComponentSystemSamples创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表