Unity Renderer2D中Light2D与Shader Graph法线贴图渲染异常求助
问题描述
在Unity 2022.3.4f1(搭配Universal RP 14.0.8、Shader Graph 14.0.8)环境下,使用Renderer2D + Light2D + 带法线贴图的Sprite Lit Shader Graph时,出现渲染异常:
- 相机无旋转正对时渲染完全正常;
- 相机旋转后,光照区域出现明显的错误偏移;
- 排查后发现UV本身存在扭曲现象;
- 切换为Unlit Shader时一切正常,但项目需要法线贴图的光照效果。
相关素材说明:
- Shader Graph结构极简
- 相机旋转时的异常动态演示效果
- UV扭曲示意图
- 测试用基础纹理与法线贴图
修复方案
1. 修正Shader Graph的法线空间转换逻辑
2D场景的空间计算和3D存在差异,相机旋转会导致切线空间到世界空间的转换出现偏差,需针对性调整:
- 采样法线贴图后,使用
Transform Node将法线从Tangent空间转换为World空间,务必勾选节点的2D Mode选项(URP 2D的Shader Graph中该选项默认未开启,这是核心问题所在); - 光照方向计算需适配2D相机变换:使用
Light Direction Node获取World空间的光照方向,或直接使用Camera Space下的光照方向参与计算,避免相机旋转带来的空间偏移。
2. 检查Sprite的UV与网格设置
- 在Sprite Inspector面板中,将
Mesh Type设置为Full Rect,避免Tight Mesh在相机旋转时引发UV拉伸扭曲; - 开启
Generate Mip Maps,并将Filter Mode设为Bilinear,提升纹理采样的稳定性,减少UV偏移概率。
3. 调整Light2D的渲染设置
- 将Light2D的
Render Mode改为Per Pixel,确保光照计算基于像素级的UV采样,而非顶点插值,避免旋转时的光照偏移; - 确认
Culling Mask仅包含需要光照的Sprite层,排除无关层的计算干扰。
4. 临时规避方案
如果暂时无法调整Shader Graph,可通过场景设置绕过问题:
- 固定相机旋转,通过旋转Sprite对象本身来实现视角变化;
- 使用正交相机并保持其角度不变,通过移动Sprite的位置和旋转来模拟视角移动需求。
内容的提问来源于stack exchange,提问作者amenonegames
相关产品推荐
相关产品推荐

