陡峭视差映射原理
朴素的陡峭视差只采样一次,陡峭视差映射基本想法是多次检测来获得比较精确的值。
主要方法是按照朴素采样得到一个总偏移量(因为交点一定不会超过这个偏移量)之后,将高度按步进次数分层数,计算每一步的偏移量,从得到的初始UV值,每一步原始UV值加上每一步的偏移量,原始高度加上每一步的分层值,然后采样得到贴图上的高度值,比较当前层数和高度值,可以发现当高度值小于层数一定是不相交的,靠这样步进可以得到一个较为精确的偏移值。

Shader代码实现
1 | Shader "Unlit/Steep Parallax Normal" |
疑点解析
Scale控制实现原理
法线贴图控制实现:normal.xy *= bumpScale;
为什么是XY方向乘以呢?
我们在黑色的模型平面上的一点A,采样法线贴图,我们知道法线贴图存储的法线是在A点的切线空间下的,我们可以知道当我们给XY加权,因为法线是要归一化使用的,于是法线就从绿色的变成了黄色的,可以表示的深度就更深。

高度贴图是实现:TotalOffset = (HighScale * viewdirTS.xy) / (abs(viewdirTS.z) + 0.001);
由公式可以知道我们还是给XY加权,这样可以降低V.z的值,这样偏移值就增大。(可以看视差映射那一张查看详细的推到)
UV偏移后,采样到的颜色像素发生了“错位”。高区域(height高)的像素向视线方向滑动,低区域的像素反向滑动。这种像素错位欺骗你的眼睛,让你**“感觉”表面有高低起伏(深度)。
所以,_HeightScale 控制的不是真正的几何深度,而是视觉上错觉强烈的程度**。_HeightScale = 0 时无错位,表面看起来就是平的;_HeightScale 越大,错位越大,“看起来”凹陷越深或凸起越高。
说些什么吧!