我开发了一个商业Unity HDRP资产PRISM Surface,其v1.1.0材质转换器是材质迁移的一个有用的案例研究:哪些值可以传递,哪些需要审查,如何使渲染器替换可逆。以下是我想讨论的实现选择和限制。

  1. 文理参考可以存活下来;UV编写的外观可能不行。

转换器创建了PRISM的世界/对象空间三维平面着色器的材质。复制基图和色调不保留网格UV岛选择。重复表面纹理可能是一个合理的候选者,但图集、裁切表或特定展开的纹理可能会失去其意图的放置。v1.1.0不会重构那些布局。检查器检查HDRP的_UVBase状态。不是已经三维平面的来源会被标记为艺术家审查。这个是采样风险警告,而不是自动图集检测。检查API也接受已知UV布局依赖性标志,并拒绝该案例,但公共场景扫描器不会推断或提供它。艺术家仍然需要判断材质在目标网格上的外观。即使已经三维平面的来源也不应被视为相同外观的保证。基图比例/偏移被复制,但它作用于投影坐标。非默认独立变换在遮罩、法线、细节或发射图上被拒绝,因为目的地不应用这些变换。这避免了静默接受无法重现的值。

  1. 兼容性需要目的地合同。

检查器明确支持精确的HDRP/Lit着色器并识别PRISM材料已经转换。它不假设任意着色器是兼容的,因为它暴露了熟悉的属性名称。报告区分完全可转换、可转换但需要调整、已转换为PRISM和不可用的材质,分别包括每个属性的映射状态和原因。拒绝的例子包括对象空间法线、非标准Lit材质模型和检测到的不可用的特性,如清漆或位移。透明度仅限于支持的Alpha模式;添加/乘法混合和折射被拒绝。转换重新检查源材质,以便于材质发生变化后可以跳过。遮罩图像保留包括金属R、AO G和光滑度A重映射范围,而不是仅仅保留纹理引用。目标着色器应用这些范围到采样通道。细节和发射仍需要审查:HDRP细节语义和发射强度/曝光设置与PRISM的控制不同。法线图像进行单独的导入检查。如果一个持久的Texture2D不能被验证为以Texture Type = Normal Map导入,转换会警告并跳过法线图像和其强度。它不会改变共享纹理的导入者。有效的切线空间法线图像会被三维平面法线采样路径重用;其UV编写的放置仍然受映射变化的影响。

  1. 保留原件并验证保存的结果。

执行器要求一个持久的项目 .mat源并创建一个新的PRISM材料旁边使用GenerateUniqueAssetPath和一个 _PRISM后缀。它复制选择的映射,而不是切换源的着色器。每次运行都可以创建另一个目的地。它应用表面的标准状态,保存/导入目的地,重新加载它并检查着色器身份、管理的标签、映射的引用/值、表面状态和渲染队列。在验证失败时,它尝试删除新目的地并报告回滚失败。这些检查验证序列化状态,而不是视觉等同性。

  1. 渲染器替换是单独的操作。

场景/选择扫描包括非活动渲染器,排除预览场景和项目资产,并去重材料,同时保留渲染器槽的使用。可选替换默认关闭。替换一个槽之前,工具重新检查渲染器是否存在,槽在范围内,并仍然引用扫描的源。过时的槽被跳过。它编辑了共享材料数组,记录了渲染器与RegisterCompleteObjectUndo进行注册之前的分配,标记渲染器/场景脏,并为回滚组合替换。回滚恢复渲染器引用;生成的.mat资产仍然保存在磁盘上。这个边界很重要:回滚一个场景分配和删除一个资产是不同的操作。对于构建类似工具的人:如何在不声称可靠检测的情况下通信UV布局风险?您是否拒绝每个网格-UV来源直到显式审查,还是允许转换时发出警告?渲染器回滚是否应该保留生成的材料以供重用,还是应作为单独的明确操作进行清理?披露/参考:我是PRISM Surface的开发者,隶属于Quantum Rift Interactive。它是一个付费资产;上述实现来自其v1.1转换器。资产商店:https://assetstore.unity.com/packages/slug/403440