法线贴图真相:别再错用normalize了

发布时间:2026/10/17 10:53:26
法线贴图真相:别再错用normalize了 逐段解读normalize(i.normal normalTex.rgb * 2.0 - 1.0)这行代码的意图是用法线贴图让表面看起来凹凸不平。拆成三块来看float3 normal normalize( i.normal (normalTex.rgb * 2.0 - 1.0) ); // ①原始法线 ②从贴图里读出的扰动方向 // ③ 归一化一、normalTex.rgb * 2.0 - 1.0把颜色还原成方向为什么要这样算法线是一个方向每个分量范围是-1 到 1可以朝左也可以朝右。但贴图存的是颜色每个通道范围是0 到 1存不了负数。所以制作法线贴图时先把方向压缩进颜色范围存的时候颜色 (方向 1) / 2 -1~1 → 0~1 取的时候方向 颜色 × 2 - 1 0~1 → -1~1 ← 就是这一句举例贴图颜色× 2 − 1 后含义(0.5, 0.5, 1.0)(0, 0, 1)正对外完全平坦(1.0, 0.5, 0.5)(1, 0, 0)朝右倾斜(0.5, 0.0, 0.5)(0, -1, 0)朝下倾斜这也是为什么法线贴图大多是淡蓝紫色平坦区域的颜色是 (0.5, 0.5, 1)蓝色通道最大。二、i.normal ...把扰动加到原始法线上i.normal模型本身的法线从顶点着色器传过来代表表面大致朝向贴图解出来的方向代表这个像素该往哪边歪一点两个向量相加结果就会朝贴图指定的方向偏过去i.normal 扰动 相加后 ↑ ↗ ↗往右偏了一些于是光照计算时光线照在这个像素上的角度变了明暗随之变化平面就看起来有了凹凸。三、normalize(...)把长度重新变成 1两个向量相加后长度不再是 1例如 (0,1,0)(0,0,1) 长度约 1.41。光照公式比如dot(normal, lightDir)要求法线长度为 1否则会偏亮或偏暗。所以最后必须normalize只保留方向。四、⚠️ 重点这行代码其实是简化/不严谨的写法问题在哪法线贴图里的方向是相对于表面自己的叫切线空间“蓝色 (0,0,1)” 的真实意思是“垂直于这块表面朝外”而不是世界的 Z 方向。但i.normal通常是世界空间的方向。两个坐标系不同的向量直接相加就像把往前走 1 步和往北走 1 步直接相加——只有你正好面朝北时才对。用一个例子看出错误一面朝右的墙i.normal (1, 0, 0)贴图是完全平坦的 (0, 0, 1)正确结果平坦贴图不该改变法线 → 仍然是 (1, 0, 0) 这行代码(1,0,0) (0,0,1) (1,0,1) → 归一化后朝右前方歪了 45° ❌一张平坦的贴图竟然把法线掰歪了 45°结果就是模型某些朝向的面光照正常另一些朝向的面明暗诡异。什么时候它看起来能用表面恰好大致朝向 Z比如一张面朝屏幕的平面风格化、不追求正确光照的效果只想要有点凹凸感教程里的入门演示五、正确写法先把贴图方向转到世界空间需要借助每个顶点的切线tangent搭出表面自己的坐标系TBN 矩阵把贴图方向翻译成世界方向再用它替换原法线而不是相加// 顶点着色器算出世界空间的 切线T、副切线B、法线N float3 N UnityObjectToWorldNormal(v.normal); float3 T UnityObjectToWorldDir(v.tangent.xyz); float3 B cross(N, T) * v.tangent.w; // w 处理镜像 UV o.T T; o.B B; o.N N; // 片元着色器 float3 tn UnpackNormal(tex2D(_BumpMap, i.uv)); // Unity 内置代替 *2-1兼容压缩格式 float3 normal normalize(tn.x * i.T tn.y * i.B tn.z * i.N); // 往切线方向歪 往副切线歪 沿原法线朝外含义很直观tn.z越大 → 越贴近原法线Ntn.x、tn.y→ 分别往表面的横向和纵向倾斜再验证刚才那面朝右的墙平坦贴图 (0,0,1) →0·T 0·B 1·N N (1,0,0)✅两个顺带提醒注意原因Unity 中用UnpackNormal而不是手写*2-1Unity 的法线贴图常被压缩成只存 xyDXT5nm/BC5手写会读错法线贴图导入类型设为Normal map不能当颜色贴图sRGB处理否则数值会被改变一句话总结* 2 - 1把颜色还原成方向 i.normal让法线朝贴图指定的方向偏normalize把长度恢复为 1。但贴图里的方向是相对表面的直接和世界法线相加只是近似正规做法是用TBN 矩阵把它转到世界空间再使用。

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询