简要整理了部分常用的UnityShader案例,并编写了相关的代码以供以后编写新shader时作为参考
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

38 lines
1.8 KiB

# 法线贴图
法线贴图是一种用于表现平面倾斜度的数据。
法线的取值范围是一个半球,如下图所示,处于半球边缘的任意点都可以代表法线的朝向。
法线贴图实际是将每个点的法线方向,按照颜色rgba的方式存储。其中r代表x轴旋转度,g代表y轴旋转度,b实际是轴本身的旋转,几乎无意义所以基本恒为1。
由于颜色值rgba属性中,不能为负值,取值范围为0-1之间的四组数值。所以将0.5作为垂直表面的法线基准值。故无凹凸表现的平面颜色值为(0.5,0.5,1,1);即为图中蓝点。
![avatar](./img/normalMapPosition.png)
图1 将坐标转换成颜色的图解
由于法线贴图不包含海拔信息,故向右凸起等于向左凹陷,反之向左凸起等于向右凹陷。比如下方图片旋转180度,感受一下是不是就像是凹陷了一样。
![avatar](./img/bumpTest4.png)
图2 实际的法线贴图(包含一个凸出的八边形,如果旋转180度,则是凹陷的八边形)
# UnpackNormal函数应用
上一节讲了,由于法线贴图不能包含负值,所以在UnityShader的使用过程中,需要对法线进行一次变换,使之范围从原来的【 0 ~ 1 】转换为【 -1 ~ 1 】
故而 UnpackNormal ( packednormal ) = packednormal.xyz * 2 – 1
图2 执行完该方法后,会变成图3所示的样子
![avatar](./img/UnpackNormal.png)
图3 UpackNormal 方法执行后
到这里可能会有人奇怪了,为什么左方跟下方都是一样的颜色。这个方法执行之后,实际上黑的部分是负数,负数的颜色是没法正确表现的,故变成了黑色。我们进行一次abs绝对值函数处理,就能看到对应颜色啦。
![avatar](./img/abs_UnpackNormal.png)
图4 abs绝对值处理