多物体共用材质时Shader Graph顶点位置节点异常问题
问题描述
使用Shader Graph对2D网格顶点做简单偏移时,物体在坐标原点表现正常,但偏离中心越远扭曲越严重;切换物体空间/世界空间后结果无变化,检测发现场景中物体相对空间未生效,实际基于世界原点计算。进一步发现仅多个物体共用同一材质时出现该问题,给每个物体分配独立材质实例后问题解决,但手写Shader无此现象,禁用动态批处理、调整SRP批处理配置均无效。
环境:URP 14.0.8、Unity 2022.3.5f、Shader Graph 14.0.8
原因分析
Shader Graph实例化属性传递缺陷
共享材质时,Shader Graph默认的部分节点(尤其是空间转换、顶点偏移相关节点)未正确绑定每个物体的实例化数据缓冲区。手写Shader会显式使用UNITY_MATRIX_M等内置矩阵处理每个物体的空间转换,而Shader Graph若未开启实例化支持或未标记相关属性为Per-Instance,会导致所有共享材质的物体复用同一空间转换参数,进而出现基于世界原点的错误偏移计算。Per-Instance属性未正确配置
若在Shader Graph中自定义了偏移相关参数,未将其设置为Per-Instance属性,共享材质时所有物体会共用同一个参数值,无法基于自身物体空间做独立偏移,最终出现随物体位置变化的扭曲。SRP批处理兼容性问题
URP的SRP批处理在处理共享材质时,会批量传递实例化数据,但Shader Graph的部分节点逻辑未兼容该流程,导致空间转换时错误忽略了每个物体的模型矩阵,直接使用世界空间原点作为参考。
解决建议
- 打开Shader Graph的Graph Settings,勾选
Enable GPU Instancing,确保共享材质时每个物体的实例化数据(如模型矩阵)能被正确传递。 - 将所有需要每个物体独立的属性(如偏移强度、自定义空间参数)设置为Per-Instance属性(在属性面板中勾选
Per Instance)。 - 调整顶点偏移计算流程:先在物体空间完成顶点偏移操作,再通过
Object to World节点转换为世界空间,避免直接使用世界空间坐标做偏移计算。
内容的提问来源于stack exchange,提问作者MrWorld

