Demo演示
视差贴图
- 视差/高度/位移贴图(黑--白):和法线贴图一样视差贴图能够极大提升表面细节,使之具有深度感。
- 第一种思路(置换顶点):对于一个quad ,分成约1000个顶点,根据储存在深度贴图中的几何信息对平面特定区域的顶点的高度进行位移或偏移。但计算量太大了
- 视差贴图:修改纹理坐标使一个fragment的表面看起来比实际的更高或者更低,所有这些仅根据观察方向和高度贴图,不需要额外的顶点数据(例如quad只需6个顶点),
- 模拟:假设,根据高度贴图模拟了真正的高度,我们视线看到的实际位置,不再是平面上A点,而是高度上的B点。
如何确定点B坐标?
- 尝试通过对从视线𝑉进行缩放的方式解决这个问题,缩放的大小是𝐴处fragment的高度H(A),缩放得到的向量𝑃¯,视差贴图采样的是H(P)点,
- 问题(需要陡峭视差映射解决):因为我们通过H(A)确立采样的位置,当表面的高度变化很快的时候,很有可能和(高度模拟中)我们应看到的H(B)不同
- 反色高度贴图 / 深度贴图:模拟深度比模拟高度更容易
思路:
- 从深度贴图采样当前坐标点的深度值,
- 计算vec2的偏移量:视线的方向.xy / z(因为原实体是立着的quad,转变为vec2)* 深度值
- 计算新的纹理坐标(原片段坐标 - 偏移坐标),从而根据新坐标位置diffuse和normaltexture的采样
- 因为/z:所以当我们视线越平行于平面,z越趋近于0,偏移量p会越大,视觉上有更多的偏移
法线贴图VS视差贴图:
- 根据观察方向高度的叠压操作
- 纹理边缘有失真:纹理坐标超出了0到1的范围进行采样,根据重复的纹理的环绕方式,解决的方法是当它超出默认纹理坐标范围进行采样的时候就丢弃discard这个fragment:
法线矩阵 VS TBN变换:
- 法线矩阵:将局部坐标转变为世界坐标,保持法线方向永远垂直于表面
- TBN变换:将局部坐标(法线/视差 贴图)转变为切线空间(法线的局部空间),保证从贴图采样的转变为正确方向,TBN*Model后转变为世界空间
陡峭视差映射:在陡峭的高度仍然有不正确的结果
- 原理:通过增加采样的数量提高了精确性,不同于原理取当前纹理坐标的深度,以视线方向分段(偏移量)采样,直到当某一层的深度高于储存在深度贴图中的值
- 将深度和p方向分段,都划分为相同的层数,while当前深度<当前分段的(新的纹理坐标)深度值,就继续循环,直到结束会返回当前纹理坐标
- 为了优化性能:我们可以在垂直看时使用更少的样本,以一定角度看时增加样本数量:
视差遮蔽映射:
- 原理:在触碰之前和之后,在深度层之间进行线性插值。比陡峭视差映射更精确。
- 计算:因为刚才计算的就是第一次深度值>深度 坐标位置,直接对本次的差值,和采样获取上一次坐标位置,计算差值,然后计算的线性插值作为权重weight,将两个纹理坐标位置*权重 / 1-权重,获得最终的纹理坐标