计算机图形学(五):纹理应用-下

计算机图形学(五):纹理应用-下

上一章介绍了凹凸贴图,凹凸贴图可以提升粗糙mesh细节表现,凹凸贴图其实没有改变表面的几何结构,仅仅是通过法线的扰动影响了着色而已,因此产生的问题就是,在特定角度观察或者观察物体边缘或阴影时,问题就暴露出来了,这是因为没有考虑高程带来的视差和遮挡。因为mesh信息没有提供对应的深度变化,在zbuffer深度测试时,不会对被遮挡的顶点做深度测试,因此不会产生应有的自遮挡现象。

bummmap

视差贴图 (ParallaxMapping

视差贴图解决了凹凸贴图带来的问题(凹凸贴图没有考虑自遮挡问题),如下图当我们从相机观察到P点时,由于高程的存在,我们应该看到的是pideal,但实际上在凹凸贴图用的是p点的着色信息,所以看起来不够真实:

bummmap

2001年,Kaneko引入了视差贴图的概念,并对其进行了改进并由Welsh普及。 视差是指当观察者移动时,对象彼此相对移动。 随着观察者的移动,凹凸应该看起来有高度。 视差映射的关键思想是采用通过实时检查像素的高度来有根据地猜测应该在像素中看到什么(遮蔽现象)。

ParallaxMapping所需要的信息通常存储在一张高度图(heightfieldTexture)中。当观察物体表面某一着色点时,首先会根据纹理查询该点对应的高度值,然后基于这个高度值和观察角度计算出一个偏移量offset,这个偏移量实际上就是p点的偏移量,即我们实际上应该看到的像素点padj,而不是p点。如上右图所示,所做的事情就是:根据p点的高程,以及 v的方向,对p点偏移一段距离到达padj,以接近pideal

padj=p+hvtbvn

当高程变化平缓时,这个方法表现很好,但当高程在p点出变化剧烈或者v与表面法线的角度很大时,就有可能导致padjpideal相差很远,如下图所示:

bummmap

为了解决这个问题,Welsh对此进行了改进:为了防止p点偏移的过于厉害, Welsh将偏移量限制在h范围内,此方法对于这种局部高程变化剧烈的撞墙图表现的很好:

bummmap

如下图所示,光线有时会被更高的其他点遮挡,但是上面并没有考虑这一点:

一种类似于RayMarching的思想,从p点出发,向前检查有限数量的点,看这些点的高程是否与光线相交,如果相交,取交点最近的像素点,如padj,并用此处的光照去代替p点的光照信息。

bummmap

浮雕贴图(ReliefMapping

关于浮雕贴图,有人把它誉为凹凸贴图的极致,ParallaxMapping是针对NormalMapping的改进,利用HeightMap进行了近似的TextureOffset,而ReliefMapping是精确的TextureOffset,所以表现上比较完美。

  • 法线贴图和浮雕贴图的对比,法线贴图没有子遮挡。
    bummmap

  • 视差贴图和浮雕贴图的对比,浮雕贴可以实现更深的凹凸深度:
    bummmap

  • 法线贴图,视差贴图 ,浮雕贴图三种效果对比:
    bummmap

改变表面结构

之前介绍的凹凸贴图,视差贴图,浮雕贴图,都只是在计算光照时对法线进行了扰乱,并没有修改表面结构。此处介绍的位移贴图(DisplacementMapping)则实际修改了表面结构,主要依赖于渲染管线的曲面细分。根据贴图中对三角形进行曲面细分,生成足够多更小的三角形,并对每个三角形的顶点位置都进行位移,实际上得到了更为精细的几何体。这种方法类似于法线贴图,位移贴图的每一个纹素中存储了一个向量,这个向量代表了对应顶点的位移。注意,此处的纹素并不是与像素一一对应,而是与顶点一一对应,因此,纹理的纹素个数与网格的顶点个数是相等的。在vertexShader阶段,获取每个顶点对应的纹素中的位移向量,施加到局部坐标系下的顶点上,然后进行mvp即可。

改变光源(TexturedLight)

纹理还可以被用于增加光源的细节表现(图案等),允许改变复杂的光照分布。最简单的二维光源,类似投影仪的工作原理:把一张纹理放在聚光灯下,那么光照就带有各种图案:

bummmap

参考

图形学基础 - 纹理 - 纹理映射盘点

Real-Time Rendering

《Real-Time Rendering 3rd》 提炼总结