简要整理了部分常用的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.
 

1.8 KiB

法线贴图

法线贴图是一种用于表现平面倾斜度的数据。

法线的取值范围是一个半球,如下图所示,处于半球边缘的任意点都可以代表法线的朝向。

法线贴图实际是将每个点的法线方向,按照颜色rgba的方式存储。其中r代表x轴旋转度,g代表y轴旋转度,b实际是轴本身的旋转,几乎无意义所以基本恒为1。

由于颜色值rgba属性中,不能为负值,取值范围为0-1之间的四组数值。所以将0.5作为垂直表面的法线基准值。故无凹凸表现的平面颜色值为(0.5,0.5,1,1);即为图中蓝点。

avatar

图1 将坐标转换成颜色的图解

由于法线贴图不包含海拔信息,故向右凸起等于向左凹陷,反之向左凸起等于向右凹陷。比如下方图片旋转180度,感受一下是不是就像是凹陷了一样。

avatar

图2 实际的法线贴图(包含一个凸出的八边形,如果旋转180度,则是凹陷的八边形)

UnpackNormal函数应用

上一节讲了,由于法线贴图不能包含负值,所以在UnityShader的使用过程中,需要对法线进行一次变换,使之范围从原来的【 0 ~ 1 】转换为【 -1 ~ 1 】

故而 UnpackNormal ( packednormal ) = packednormal.xyz * 2 – 1

图2 执行完该方法后,会变成图3所示的样子

avatar

图3 UpackNormal 方法执行后

到这里可能会有人奇怪了,为什么左方跟下方都是一样的颜色。这个方法执行之后,实际上黑的部分是负数,负数的颜色是没法正确表现的,故变成了黑色。我们进行一次abs绝对值函数处理,就能看到对应颜色啦。

avatar

图4 abs绝对值处理