[计算机图形学]纹理的高级应用(前瞻预习/复习回顾)

 一、前言

上节课我们讲了纹理的放大缩小产生问题后,我们的解决方法,那么纹理是什么呢?在现代GPU中,我们可以理解为是内存+范围查询(滤波),也就是对一块区域做点查询/范围查询,并且做的非常快,也就是说我们完全可以把纹理看作是一块可以进行不同查询的数据,而不仅仅是一张图片。而由此,我们可以在许多地方应用纹理实现许多不同的效果。

二、Environment—Map环境贴图

什么是环境贴图,如上图中的茶壶可以接收到来自四面八方的光,不管是漫反射,高光还是环境光,我们把它表面上每个位置接受到的光信息记录下来绘制在一张图上,这就是环境贴图。(这里其实是一种假设,假设四面八方的环境光都来自无限远,也就是只考虑方向,而不考虑强度。哪怕是同一间屋子相距很近的不同位置,距光源的距离也会使光的强度发生变化,但环境贴图不考虑这些事情,所以只是一个近似的假设)

1.Spherical Environment Map—球形环境图

既然我们可以把光都存储在一个纹理上,我们为什么不更进一步呢?我们假设有一个无比光滑的球,那么这个球就可以反射记录在这个环境内的所有环境光,而在该环境下的所有物体接受到的环境光都可以用这个球上记录的光信息表示,这就是球形环境贴图—Spherical Environment Map

 但是这会有一个很大的问题,在顶部和底部会有严重的扭曲,也就是说按两极点展开描述是不均匀的。这就要说到另一种办法Cube Map

2.Cube Map—立方体贴图

我们仍然假设用一个球储存当前环境的光照信息,但是我们用一个正方体将这个球包围住,然后由球心出发向四面八方,穿过球面直到达到正方体上,也就是说把球分成6个面分别贴到正方体的6个面上,从而舍弃球面,换为用正方体储存光照信息,这就是Cube Map

 而将这么一个正方体展开,我们就得到了上面这么一张图。它成功避免了扭曲。唯一的问题是:想找到光照信息的时候,我们需要球面到正方体面的二次映射,也就是二次计算。

三、Bump/Normal mapping—凹凸/法线贴图

前面我们讲了,纹理贴图不仅仅只是可以定义物体表面的颜色/漫反射系数,还可以定义其它的东西,比如物体表面不同位置相对于原始表面的相对高度,法线高度等。那么这有什么用呢?如果我想表示上图右边类似的表面极其粗糙的物体,那么如果在模型上做更改会导致增加非常多的三角形,这对性能的开销显然是非常大的,而通过定义法线贴图,我们就可以通过人为的改变法线的相对高度和方向进而影响光照计算,从而达到以假乱真的效果,也就是说实际上我们并没有改变模型的形状,它仍是一个所谓光滑的模型,只是我们改变了不同法线的相对高度,产生了假的阴影效果,让我们觉得它是一个粗糙的表面,而这种方法相对于改变模型,大大减少了性能开销。

 上图中黑线表示原本的模型表面,橙色线表示贴图上定义的相对高度表面

那么如何求变化之后的法线方向呢?这里我们先考虑简单的情况,也就是2维,上图中蓝色表示的是用法线贴图变换后的平面,而法线与切线是垂直的,所以只需求切线方向就可以了,而切线方向可以通过求导来得到,上图演示了这一过程。求出切线方向后,应用旋转公式旋转90度再做归一化即可得到法线方向。

我们类比到3D空间中,只需要分别求u方向和v方向的偏导,也就可以知道切线的方向了,同时再次应用旋转公式再归一化即可得到法线方向。注意:在第一条中我们把每条法线都定义成了(0,0,1),但是显然实际上物体表面的法线是朝着各个方向的,这里其实我们是在物体表面的每个法线处都定义了一个局部坐标系,名为切线空间,它是由法线切线副切线组成的一个坐标系,而在这个坐标系中,法线即为z轴,所以在这个空间下,法线的方向永远是(0,0,1)。而通过纹理映射在这个切线空间下改变法线方向,再重新计算回世界空间并和光照计算得出的结果才是我们通过法线贴图看到的结果。

四、Displacement mapping—位移贴图

位移贴图和凹凸贴图的纹理相同,但是不同的是,位移贴图并不是通过换算法线的位置得到虚假的光照计算结果,而是真的改变了顶点的位置。这样做的好处是更加真实,因为原本的凹凸贴图并没有改变集几何形状,这导致虽然看上去有凹凸感,但是外轮廓仍然没有变化,例如上图左边的球形外轮廓仍然是圆的,而右边使用了位移贴图的则不同,其次,在凹凸的部分,位移贴图还会因为自己的凸起而在自己身上产生投影,而法线/凹凸贴图则没有。

当然位移贴图也有代价,那就是它要求原本的模型的三角形划分的必须足够多,足够细。也就是说模型顶点的间隔要比纹理定义的顶点变化速度快(采样率足够高),才能使用位移贴图。(在微软的图形API:DX中,提供了一种动态曲面细分的方法:即先用法线贴图,当检测到需要模型足够细的时候,会自动将三角形细分成更多小三角形,然后再使用位移贴图,这样就可以根据需求,选择最适合的方法减少多余的性能消耗)

五、其他纹理应用

1.三维纹理

之前我们定义的纹理都是二维的,也就是仅仅停留在物体表面,它只定义了物体表面每个点的属性,而三维纹理定义了空间中每个点的属性。例如同样对一个球采用二维和三维纹理,那么把它们切开,应用二维纹理的球中间是空心的,而应用了三维纹理的球仍然可以在中间看到颜色,可以理解为实心球。当然我们并不会真的一个一个的去定义空间中每个点的属性,而是定义了三维空间中的一个噪声函数,这样就可以取得三维空间中的每一个值进一步操作,如二值化或其它操作,变成我们想要的样子,如上图中的大理石材质和Perlin Noise。 

2.着色的预计算

我们说过,纹理可以储存信息,其中就包括事先计算好的信息,如上图中眉骨处的投影。通过预计算投影并储存在纹理上再乘上原本不含投影的着色结果就可以实现在模型上直接得到投影而不需要实时计算。(当然也有实时计算的方法,叫做环境光遮蔽,这里不做详细介绍。)

这样我们就知道,纹理可以储存各种各样预计算的信息(不只是颜色),从而达到各种各样的效果。

3.体积渲染

体积渲染被广泛应用在医学中,通过核磁共振/CT扫描,得到三维空间中的信息,如某个点的密度,然后通过这些信息得到一个渲染结果,这就是体积渲染。扫描得到的结果也就是一张三维纹理。

六、总结

那么到这里,GAMES101的着色部分也为大家介绍完毕了,本篇主要介绍了一些纹理的高级应用如Cube Map,Bump Mapping,而实际上像是法线贴图等应用在游戏领域应用的非常广泛,因为只需要很小的工程量和性能就能达到相对好的效果,在游戏场景中自己观察,你会发现许多场景中的许多物体都应用了这些东西。那么接下来下篇将为大家继续介绍几何部分:这其中包括几何的表示方法,曲线,曲面,还有曲面细分,曲面简化的一些算法。

参考:

Lecture 10 Geometry 1 (Introduction)_哔哩哔哩_bilibili

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值