URP | Normal法线贴图
法线概念
法线是有 正反区别(-1,1)

DirectX12 里Y轴是N方向

不同平台使用的贴图正反是不一样的。
不同平台使用的法线格式

HLSL调用法线贴图注意哪些
结构体
在顶点结构体中,我们需要获取模型的顶点法线,顶点切线。

输出到片元着色器结构体中

这里说一下UV信息,为什么是float4类型,
这里的uv.xy储存的是漫反射贴图的uv,uv.zw储存的法线的uv信息。
这样的好处是合并到一起。
法线,切线,副切正常类型是,
定义变量
属性里定义一张法线贴图。以及控制法线的变量


把一些变量放到C-buffer里。贴图采样也是。

顶点阶段
顶点阶段,需要把顶点法线,顶点切线转换成世界空间下。
第一部分 储存的颜色贴图,法线贴图的UV采样信息

第二部分,把顶点法线,顶点切线转换成世界空间,输出。
计算出副切线的数值。并在乘切线的w值判断正负,在乘负奇数缩放影响因子。

这里注意,
v.tangentOS.w
值为-1或者1,由DCC软件中的切线自动生成,和顶点的环绕顺序有关。
unity_WorldTransformParams.w
定义于unityShaderVariables.cginc中.
模型的Scale值是三维向量,即xyz,当这三个值中有奇数个值为负时(1个或者3个值全为负时),unity_WorldTransformParams.w = -1,否则为1.
第三部分 计算出世界空间下的顶点坐标。储存到法线,切线,副切线的W通道中。

注意:这里为什么需要把顶点位置穿片元着色器,我们是需要计算 视角向量(ViewDir)
还有第二套写法,
扩展 在顶点着色器阶段,计算视角向量。
片元结构体
切线和法线,都是float3的类型了,

在顶点阶段计算出viewDirWS 世界空间下的视角方向。

片元着色器
在片元着色器阶段计算出TBN矩阵,这里需要把法线的信息和模型的法线信息混合起来,
因为我们上面是使用模型顶点信息计算的高光,或者漫反射。 那单独看一下模型法线信息。

这个结果就缺少细节,,看一下漫反射。

现在法线信息 是有俩部分组成 ,法线贴图是增加细节的。
新法线信息 = 模型顶点法线 + 法线贴图
第一部分读取法线贴图
读取贴图,
计算TBN 在读取贴图,增加一个控制贴图的强度的数值。
贴图信息和TBN结合
获取视角方向,光照方向 计算出半角向量
使用新法线计算出漫反射

增加上前面学习到的漫反射,高光发射
效果

代码实现

