欢迎光临散文网 会员登陆 & 注册

读书笔记2

2023-08-23 16:30 作者:中专人  | 我要投稿

视差贴图(parallax mapping)

视差贴图为每个像素指定了高度或深度(意味着高于平面或低于平面)信息。在对某一像素进行贴图采样时,根据视差贴图的位置信息和视点方向对uv坐标进行偏移,再采样diffuse、normal等贴图,从而像素颜色会根据视点的不同而变化,就好像具有真实的凹凸一般。

总结一句:视差贴图最重要的就是计算观察向量和曲线的交点。

视差贴图为深度图时,平面为0, 最低为1。视差贴图为高度图时,平面为0,最高为1。

视差贴图的计算必须要在切线空间中,主要因为切线空间的切线与副切线通常与uv坐标轴分别对齐,因此观察方向在切线空间中的xy分量代表了uv偏移的方向。

以深度图为例的视差贴图近似计算:

使用深度图的时候,为减去p。
使用高度图的时候,为加上p。

p有两种计算方法,第一种为无偏移量限制的视差贴图(Parallax Mapping),第二种为有偏移量限制的视差贴图(Parallax Mapping with Offset Limiting)。

先谈谈第二种,当视角与平面近乎平行时,xy分量的最大值也才接近1,因此像素偏移是受限的。虽然能给出较好的效果,但并不是物理正确的。第一种则通过除上z分量来保证当视角越向平面靠近时,观察向量就“看”得越远,即代表了从平面到最低或最高的投影值。通过相似三角形可以得出:深度 / uv坐标偏移 = z分量 / xy分量,解得:uv坐标偏移 = xy分量 / z分量 * 深度。特别地,当深度为1时uv坐标偏移量为总偏移量。不难看出,视角近乎与平面平行时会因uv坐标偏移过大而出现走样现象,第二种方法则可避免这个问题。

陡峭视差映射(Steep Parallax Mapping)

算法思路:

将深度分层,图中分为8层。计算出每层uv偏移量,即viewDir.xy / viewDir.z * numLayers * depthScale。从平面开始,逐层向下通过偏移uv坐标,检查视差贴图中采样的深度是否大于层深度。图中可见,当uv偏移至T3时停止,那么T0的uv坐标为T3uv坐标值。

代码:

浮雕视差贴图:

就是在陡峭视差贴图之后,得到最后两层的uv偏移,那么观察向量与深度曲线的交点必定位于两层之间,那么可以采用二分法进行进一步近似,查找指定次数或达到指定误差内结束。

代码:

视差遮蔽映射(Parallax Occlusion Mapping)

在陡峭视差映射的最后两层之间进行线性插值。

代码:

其中pre * w + cur * (1 - w)可由pre + (cur - pre) * (1 - w)化简得到。

附:有一个较容易混淆的点,就是面的切线空间和点的切线空间。在法线贴图的计算中,使用的是点的切线空间,N为点的平均法线,T为点的平均切线(注意还要施密特正交化)。而这里是在片元着色器中使用的切线空间,为面的切线空间,因此N为面的法线,T与u轴方向相同,B与v轴方向相同。

参考:

https://github.com/UPBGE/upbge/issues/1009

https://zhuanlan.zhihu.com/p/128682162

https://zhuanlan.zhihu.com/p/265317045

读书笔记2的评论 (共 条)

分享到微博请遵守国家法律