Unity ShaderGraph曲线着色器适配模型旋转问题求助
解决方案
改用世界空间作为曲线计算的基准
你的着色器当前依赖对象局部前向向量,一旦模型旋转,局部空间轴和世界空间轴错位,效果就会异常。解决核心是把曲线计算的参考轴切换到世界空间固定轴:- 在ShaderGraph中添加
World Space节点,提取你需要的世界轴(比如世界前向Z轴、上向Y轴),以此作为偏移计算的基准方向。 - 所有参与曲线生成的位置参数,都基于世界空间坐标来计算,而非对象局部坐标。
- 在ShaderGraph中添加
统一空间转换流程
正确的顶点偏移计算流程应该是:- 用
Object to World节点,把顶点的局部空间位置转换为世界空间位置; - 在世界空间中完成曲线偏移计算(比如用世界Z坐标作为曲线函数的输入,得到Y轴偏移量,再叠加到世界空间位置上);
- 用
World to Object节点,把修改后的世界空间位置转换回局部空间,再输出到Vertex Position端口。
- 用
避免空间混合计算
检查ShaderGraph中的所有节点,确保曲线相关的运算(比如位置采样、方向向量)都在同一空间(优先世界空间)执行,不要混合局部和世界空间的参数,否则模型旋转后必然出现方向错乱。
举个简单的实操示例:
- 拉出
Position节点(默认局部空间),连接到Object to World节点的输入; - 用
Split节点拆分Object to World的输出,提取Z分量; - 把Z分量输入到
Curve节点,调整曲线得到你需要的偏移值; - 用
Combine节点,将原世界空间位置的X、(Y+偏移值)、Z重新组合; - 把组合后的世界空间位置输入到
World to Object节点,输出端连接到Vertex Position的输入端口。
内容的提问来源于stack exchange,提问作者Joseph Star
相关产品推荐
相关产品推荐

