计算机图形学-纹理的应用,环境贴图凹凸贴图法线贴图位移贴图

Posted 点燃火柴

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了计算机图形学-纹理的应用,环境贴图凹凸贴图法线贴图位移贴图相关的知识,希望对你有一定的参考价值。

纹理映射


纹理可以理解为GPU上的一块内存,内存上有一块区域可以做点查询也可以做范围查询,并且很快,可以认为纹理是一块数据,可以做不同类型的查询,不限于把它理解成图像,纹理可以表示很多东西,比如环境光照(环境光映射/环境贴图)

1 环境贴图(Environment Map)

例如在一个房间中的某一位置,任何一个方向都可以照射到这个位置,将所有照射到这里的光记录下来就是环境贴图
下图中左侧,向房间中每个方向望去,把看到四面墙展开放在一张图上,这张图像可以理解为从四周进入到人的眼睛的光,右侧是渲染的犹他茶壶,这个茶壶会被环境光照亮,也就是说会被房间里任何方向的光照射,同时也会反射出任何方向的环境光进入人的眼睛,如果你仔细观察会发现茶壶表面会一一对应左侧的环境光贴图,我们用一张贴图描述环境光,这就比用点光源来描述更加简单方便

1.1 Spherical Environment Map

可以把环境光记录在球面上,可以通过鱼眼摄像机获取或者多拍几张照片360/720度合成

之后呢可以把球面展开,得到一张二维图,会发现顶部和底部有明显的扭曲问题

球形环境贴图,做到了描述一个球体,但不是一个均匀的描述,会在靠近球体两极的地方出现扭曲(例如地球南极北极地区实际比在地图上看起来要更大)

1.2 Cube Map

针对球形环境贴图无法对环境进行一个均匀的描述,人们想出了另外一个办法,在原来球体上取一个包围盒,一个立方体,把环境光的信息存放在立方体上

立方体有六个面,展开后如下所示

与球形环境光贴图相比,解决了两极的扭曲问题,计算时需要先找到对应的面在去查询而不是直接根据角度在球面上读取,但是这个计算过程非常快,几乎没什么影响,所以立方体贴图在环境光照的实现中被广泛使用

2 凹凸贴图

纹理处理可以描述颜色之外,还可以定义不同位置的任何属性,可以定义一点的相对高度,这个相对高度指的是先定义一个基础表面,在这个基础表面上沿着法线向上向下变化的偏移量,这个相对高度的集合就是凹凸贴图

如上图,右侧橘子表面会不规则的上下凹凸,如果这种效果通过若干个三角形来渲染,那计算量会非常大,但是我们可以通过凹凸贴图实现同样的效果,首先定义三角形的顶点上的纹理坐标,有一张上下凹凸的纹理贴图,就可以通过查询出来的任意一个点的相对高度,也就是说通过凹凸贴图,可以在不把几何形体变复杂的情况下,影响到法线的变化,着色后会产生明暗对比,人们的视觉就认为物体表面有凹凸的东西

3 法线贴图(Bump Mapping)

法线贴图与凹凸贴图其实是一回事,不过是通过定义不同位置的高度和邻近位置的高度差来重新计算它的法线,给任何一个像素的法线做个扰动。可以通过高度的变化改变法线,如下图黑色线是原本光滑的表面,该表面上的一点p,进过凹凸贴图应用后变成了黄线上的那个点,很明显两个点的法线发生巨大变化

如何知道它是怎么变化的呢,
我们把问题简单化,假设原本表面是一维函数,几何法线方向是向上的,在P点的法线为(0,1)
凹凸贴图定义了下图中的蓝色波浪线,先计算曲线上任意一个点的切线(梯度、函数的导数),假设这个点沿水平方向向右移动一个单位,向上移动的距离就是 dp = c * [h( p + 1 ) -h( p )] c表示凹凸贴图影响大小,这时向量 (1,dp) 就是要求的切线

我们知道法线和切线相互垂直,这时只需要将切线逆时针旋转90就是法线,根据旋转矩阵的特性将y变负,x和y对调,就是逆时针旋转90度,即要求的法线为 (-dp,1) 最后归一化就得到了新的法线

实际使用(3d)


如上图,实际使用实在三维空间中,思路是一致的,大致归纳一下:

  1. 先假设原本的平面法线为(0,0,1)
  2. 计算切线,贴图有U方向和V方向,对应的需要分别求出任一点U方向的上的切线(dp/du)和V方向的切线(dp/dv)
  3. 逆时针旋转并归一化,(-dp/du,-dp/dv,1).normalized() 计算的结果就是新的法线 (或者使用U、V方向切线向量叉乘得到新法线)

注意:第一步假设平面法线坐标为(0,0,1)使用的局部坐标系,计算完法线后需要转换回世界坐标系

4 位移贴图(Displacement Mapping)

位移贴图和凹凸贴图使用的是一样的纹理,输入是一样的,但位移贴图会真的把三角形的顶点做一个位置移动。呈现的效果也是不一样的,如下图左侧凹凸贴图在渲染过程中改变法线,欺骗人们的眼睛,仔细观察会发现表面虽然看起来凹凸不平,凸起的部分也没有阴影,而位移贴图是实际改变了几何体的顶点,凸起部分会有阴影,效果也更加真实,但是是需要代价的,几何体的顶点数量要足够多,多到可以支持凹凸部分平滑变化

能不能二者兼得或者有更好的思路呢,有的,起初模型较粗糙点(三角形少一点),在应用位移贴图的过程中检测一下是否需要把三角形变得更细,需要的话先拆分再做位移贴图。Direct X就这么做的但是只能windows系统,另外UE5的Nanite也是这个道理

5 三维纹理

5.1 三维纹理

二维纹理只应用在物体表面,是没法看的物体内部的构造,这时三维纹理就出现了,在空间中定义了任何一个点的值的集合就是三维纹理


通常三维纹理不是保存起来的图片,而是通过噪声函数生成,三维空间中的点都有一个解析式可以算出来噪声的值,这个噪声可以进行一系列的处理:二值化、加、减、乘等运算,如上图中大理石材质就是利用有名的柏林噪声(perlin noise)产生的三维纹理渲染的

5.2 体渲染(Volume Rendering)

三维的纹理广泛的应用于体积的渲染,除了在医学领域应用,也可以用于地质勘探、气象分析、分子模型构造等领域。体绘制技术也能用于自然界中很多视觉效果是不规则的体,如流体、云、烟等,它们很难用常规的几何元素进行建模,使用粒子系统的模拟方法也不能尽善尽美,而使用体绘制可以达到较好的模拟效果

6 AO(环境光遮蔽)贴图


在上图中比较第一幅图和第三幅图,人的眼窝越深的地方越暗,这就是环境光遮蔽的效果,越深的地方被眉骨凸起部分遮挡的可能越大,接收光照越少就会越暗,这个效果是通过一张预计算好的贴图,在渲染时采样的该贴图的值,作为可见性与原来的色相乘得到的,这张贴图就是AO贴图
这个效果利用一些光照算法也可以达到,但计算复杂难开销较大以做到实时应用 。在实时渲染中一般选AO贴图模拟。

以上是关于计算机图形学-纹理的应用,环境贴图凹凸贴图法线贴图位移贴图的主要内容,如果未能解决你的问题,请参考以下文章

计算机图形学-纹理的应用,环境贴图凹凸贴图法线贴图位移贴图

计算机图形学(OPENGL):法线贴图

什么是从纹理创建法线贴图背后的逻辑?

✠OpenGL-10-增强表面细节

用PS做法线,高光贴图的最简图文教程

NormalMap 贴图