Unity Shader Graph修改顶点时的切线/副切线与法线映射问题
贝塞尔曲线变形网格的法线映射失效问题
我实现了一套Shader,可将线性道路网格沿贝塞尔曲线变形,同时支持常规UV映射与世界空间映射。但在随网格扭曲法线和切线后,部分区域出现着色异常。
排查结果
- 已确认法线和切线的旋转逻辑正确,但网格存在镜像区域,必须借助
tangent.w分量翻转副切线才能保证法线映射计算正确。 - Shader Graph的Vertex输出仅支持3分量Tangent输入,无法传入副切线(即
tangent.w),这是法线映射失效的核心原因。 - 尝试手动覆盖UV会导致着色异常,推测是因为Shader仍在使用原始网格切线,而非自定义计算后的切线。
额外疑问
- FBX与gltFast导入网格时,切线生成逻辑不一致,导致
tangent.w的取值存在差异。 - 调用
Mesh.RecalculateTangents()确认镜像UV对应的tangent.w为-1,但URP Shader仍无法正确利用该值完成着色。 - Shader Graph支持网格变形与自定义UV采样,但缺少避免法线映射出错的必要输入:Vertex节点没有副切线/
tangent.w输入,也无法在此阶段修改UV;虽可在片元阶段修改UV,但切线无法在此调整。
相关材料
- 自定义HLSL函数
- Shader Graph截图
- 着色异常区域截图
- 法线与切线可视化截图
内容的提问来源于stack exchange,提问作者Hexcoder




