DirectX11学习笔记十一 法线映射

回顾光照公式

前面学的局部光照里用到了与法线有关的计算公式,也就是漫反射,以点光源为例回顾一下:
在这里插入图片描述
其中 漫反射光D = 漫反射材质系数 点乘 (入射光反方向 点乘 法向量) 点乘 入射光颜色,如下图所示
在这里插入图片描述
镜面高光S = 镜面高光材质系数 点乘 (出射光向量 点乘 顶点或像素到摄像机向量)^高光系数 点乘 入射光颜色,如下图所示:
在这里插入图片描述
之前计算光照用到的法线都是网格上根据三角形两条边叉乘得到的,但这样的缺点是相邻像素插值得到的法线之间变化非常小,导致整个plane看起来像一个光滑的平面,如果能为texture的每一个像素都提前规定一个法线,就可以表现出平面上凹凸不平的光照现象。
在这里插入图片描述

法线纹理

办法就是用一张图片存储法线信息,在渲染时两张图都采样,一张为texture纹理,一张为normal纹理,光照公式不需要动,只需要处理法线。
而法线纹理分Object-space和Tangent-space两种。

来源https://www.zhihu.com/question/23706933
前者(左边)颜色信息代表模型空间,后者为切线空间,数据范围[0,1],通过rgb*2-1来扩大值域范围到[-1,1]。
具体的含义就是,模型空间下的法线纹理,与模型本身密切相关;举个例子,比如有一面竖着的墙(plane),其模型空间下的法线纹理大多朝向-z轴(对着摄像机),而墙的网格本身也是正面对着摄像机,那么法线经过采样并做model变换后,渲染出来的结果就是正确的。However, 如果我又找了一个地板的模型,想套用墙的法线纹理,但是地板的网格法线在模型空间下的的朝向是+y,而墙的法线纹理还是超向-z,那么两者的方向就会不一致,渲染的结果就错了。可以理解为,模型空间下的法线纹理只能跟特定的网格配合渲染。
在这里插入图片描述

而切线空间下的法线纹理,其坐标系是以像素在以网格法线为z轴,UV方向为X轴和Y轴所组成的某种局部坐标系,知乎大佬说可以理解为是对像素网格法线的扰动。因此,由图像可以看到,其颜色普遍偏蓝,就是因为其z轴靠近1。
在这里插入图片描述
那么就可以根据切线坐标系将法线转换到世界坐标系。

数学原理

在这里插入图片描述

在这里插入图片描述
P1P2P3代表网格中的一个三角形,T和B分别代表tangent和bitangent轴,与UV轴对其,UV坐标和三个顶点的模型坐标皆已知。
P 1 − P 2 = E 1 = Δ U 1 T + Δ V 1 B P 3 − P 2 = E 2 = Δ U 2 T + Δ V 2 B P_1 - P_2 = E_1 = \Delta U_1T + \Delta V_1B \newline P_3 - P_2 = E_2 = \Delta U_2T + \Delta V_2B P1P2=E1=ΔU1T+ΔV1BP3P2=E2=ΔU2T+ΔV2B
可变为
( E 1 x , E 1 y , E 1 z ) = Δ U 1 ( T x , T y , T z ) + Δ V 1 ( B x , B y , B z ) ( E 2 x , E 2 y , E 2 z ) = Δ U 2 ( T x , T y , T z ) + Δ V 2 ( B x , B y , B z ) (E_{1x}, E_{1y}, E_{1z}) = \Delta U_1(T_x, T_y, T_z) + \Delta V_1(B_x, B_y, B_z)\newline (E_{2x}, E_{2y}, E_{2z}) = \Delta U_2(T_x, T_y, T_z) + \Delta V_2(B_x, B_y, B_z) (E1x,E1y,E1z)=ΔU1(Tx,Ty,Tz)+ΔV1(Bx,By,Bz)(E2x

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值