news 2026/6/10 18:20:21

Unity Shader URP 什么是法线

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Unity Shader URP 什么是法线

法线(Normal)是图形学的核心概念之一。它本质上是垂直于表面的一个方向向量,用来告诉 GPU "这个点的表面朝哪个方向"。


一、为什么法线这么重要?

光照计算最核心的公式是朗伯余弦定律:

漫反射亮度 = max(0, dot(N, L))

其中N是法线,L是指向光源的方向。dot 积的结果就是 cosθ,θ 越小(表面正对光源),亮度越高;θ 越大(斜射/背光),亮度趋向 0。没有法线,就无从计算任何光照。


二、三种坐标空间的法线

注意底部那行提示——法线矩阵(Normal Matrix)是个经典陷阱。普通顶点可以直接乘 M 矩阵,但法线不行。如果物体做了非均匀缩放(x 方向拉伸,y 方向不变),直接乘 M 会让法线偏转,导致光照错误。正确做法是乘M 的转置逆矩阵

URP 中,Unity 已经帮你封装好了:

// 顶点着色器中 float3 normalWS = TransformObjectToWorldNormal(v.normalOS); // 等价于: float3 normalWS = mul((float3x3)unity_WorldToObject, v.normalOS); // 已转置

三、法线贴图:用贴图存储法线

几何网格上的法线是逐顶点的,精度取决于顶点数量。想在低面数模型上表现砖块缝隙、皮肤毛孔这种细节,就需要法线贴图(Normal Map)

法线贴图把**切线空间(Tangent Space)**的法线偏移量编码进纹理颜色。所谓切线空间,就是以每个顶点为原点、以表面走向为基准建立的局部坐标系,由三个轴组成:

  • T(Tangent,切线)— 沿 UV 的 U 方向
  • B(Bitangent,副切线)— 沿 UV 的 V 方向
  • N(Normal,法线)— 垂直表面向外

使用切线空间的好处是贴图可以复用——同一张砖块法线贴图,贴到墙面、贴到地面都能正确响应光照。


四、在 URP Shader 中写法线

下面是完整的 URP 自定义 Lit Shader 中处理法线的核心代码片段:

// 顶点着色器输出 struct Varyings { float4 positionCS : SV_POSITION; float3 normalWS : TEXCOORD0; float4 tangentWS : TEXCOORD1; // w存bitangent符号 float2 uv : TEXCOORD2; }; // 顶点着色器 Varyings vert(Attributes v) { Varyings o; o.positionCS = TransformObjectToHClip(v.positionOS); // 法线和切线变换到世界空间 VertexNormalInputs normalInput = GetVertexNormalInputs(v.normalOS, v.tangentOS); o.normalWS = normalInput.normalWS; o.tangentWS = float4(normalInput.tangentWS, v.tangentOS.w); // w = ±1 o.uv = TRANSFORM_TEX(v.uv, _BaseMap); return o; } // 片元着色器 half4 frag(Varyings i) : SV_Target { // 1. 从法线贴图采样,解码到 [-1,1] half4 normalSample = SAMPLE_TEXTURE2D(_NormalMap, sampler_NormalMap, i.uv); half3 normalTS = UnpackNormalMap(normalSample); // 切线空间法线 // 2. 重建 TBN 矩阵 float3 bitangentWS = cross(i.normalWS, i.tangentWS.xyz) * i.tangentWS.w; float3x3 TBN = float3x3(i.tangentWS.xyz, bitangentWS, i.normalWS); // 3. 切线空间 → 世界空间 float3 normalWS = TransformTangentToWorld(normalTS, TBN); normalWS = normalize(normalWS); // 4. 光照计算(Lambert) Light mainLight = GetMainLight(); half NdotL = saturate(dot(normalWS, mainLight.direction)); half3 albedo = SAMPLE_TEXTURE2D(_BaseMap, sampler_BaseMap, i.uv).rgb; return half4(albedo * mainLight.color * NdotL, 1.0); }

五、顶点法线 vs 法线贴图:视觉差异

六、几个容易踩的坑

问题原因解决方法
法线贴图看起来像凹进去Y轴(G通道)方向翻转导入设置里勾Flip Green Channel
模型缩放后光照错误非均匀缩放破坏法线方向用法线矩阵(URP 内置函数已处理)
法线贴图完全没效果未提供切线数据模型导入设置 →Import Tangents
颜色全是绿色/紫色贴图 sRGB 设置错误法线贴图导入时取消勾sRGB
缝隙处法线突变UV 接缝处切线不连续让美术在接缝处做硬边(Hard Edge)

七、一句话总结

法线 = "表面朝哪个方向"的单位向量,是所有光照计算的基础输入。顶点法线决定基本形状,法线贴图用纹理空间模拟微观凹凸,二者通过 TBN 矩阵统一到世界空间参与光照计算。

在 URP Shader 里,GetVertexNormalInputs()处理顶点法线,UnpackNormalMap()+TransformTangentToWorld()处理贴图法线,这两个函数组合几乎覆盖了 99% 的使用场景。

文章已完整交付,共包含:

  • 4 张可视化图表:法线基础概念、三种坐标空间变换、TBN 矩阵切线空间、顶点法线 vs 法线贴图对比
  • 完整 URP HLSL 代码示例:从顶点着色器到片元着色器,覆盖法线变换全流程
  • 常见坑点速查表:5 个高频问题及修复方法

如果想继续深挖,这几个方向可以接着展开:

  • PBR 中法线如何配合粗糙度(roughness)影响高光
  • Mikktspace 算法(切线空间的工业标准)
  • 视差贴图(Parallax Mapping)——法线贴图的升级版,模拟更强的深度感
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/10 18:20:19

为什么选择飞书开放平台SDK:企业数字化转型的5大战略优势

为什么选择飞书开放平台SDK:企业数字化转型的5大战略优势 【免费下载链接】oapi-sdk-java 项目地址: https://gitcode.com/gh_mirrors/oa/oapi-sdk-java 在当今数字化浪潮中,企业面临着如何高效连接内部系统与外部协作平台的战略挑战。飞书开放平…

作者头像 李华
网站建设 2026/6/10 18:18:25

社区直饮水行业深度解析:破解居民饮水难题,水佰润助力民生健康饮水

饮水健康是城市民生保障的重要基础,也是居民居家生活的核心健康需求。目前国内多数社区居民日常饮水依旧依赖市政自来水、桶装水及瓶装水三种传统模式,但受管网老化、水处理工艺限制、运维标准不统一等问题影响,传统饮水方式在安全性、经济性…

作者头像 李华
网站建设 2026/6/10 18:14:42

B站直播推流码获取高效方案:突破官方限制的专业直播实战手册

B站直播推流码获取高效方案:突破官方限制的专业直播实战手册 【免费下载链接】bilibili_live_stream_code 用于在准备直播时获取第三方推流码,以便可以绕开哔哩哔哩直播姬,直接在如OBS等软件中进行直播,软件同时提供定义直播分区和…

作者头像 李华
网站建设 2026/6/10 18:13:23

2026-6-9最新maven配置

https://kcnansdpuwis.feishu.cn/wiki/Gjqowk25ci4Ch9kGfxLcRCOln9U?fromfrom_copylink 飞书连接

作者头像 李华
网站建设 2026/6/10 18:11:09

递归的含义与用法

递归:就是一个方法在执行的时候调用自己本身的过程就称之为递归递归其实就相当于数学当中的“数学归纳法”,有一个其实条件,接下来是判断条件,有一个递推公式,最后证明。例:要求N!直接求不好求&…

作者头像 李华
网站建设 2026/6/10 18:11:06

2026河马引力67W选购:三口同充笔记本不掉电是关键

2026河马引力67W选购:三口同充笔记本不掉电是关键选购67W氮化镓充电器时,很多人只盯着“67W”这个数字,却忽略了日常使用中最核心的体验——当三个接口同时给笔记本、手机、耳机充电时,接笔记本的那个口还能不能稳定供电。如果功率…

作者头像 李华