Texture Mapping

Texture Mapping Task 实际上是这样一件事. 假设我有一张 2D 的手机纹理(描述手机外观看起来是什么样子)和一个 3D 的手机建模(描述手机的物理性质),要想在计算机里渲染出真实的手机,我就需要把 Texture 给 “map” 到手机的 3D 模型的 surface 上. 所谓的 “map” 其实指的是:对于手机 3D 模型 surface 上的一个点 (x,y,z)(x,y,z),它的颜色应该取 texture 上哪个点 (u,v)(u,v) 的颜色.

所以根据以上介绍,我们可以描述出 Texture Mapping 的大致流程:

  1. 将 texture 参数化:用 (u,v)(u,v) 表示 texture 上的每一个点
  2. 将 3D surface 参数话:用 (s,t)(s,t) 表示 surface 上的每一个点
  3. 然后定义一个 (u,v)(u,v)(s,t)(s,t) 之间的映射
  4. 在渲染物体的时候,对于在 surface 上的点 (x,y,z)(x,y,z),先找到对应的 (s,t)(s,t),随后再映射到 (u,v)(u,v),最后进行染色.

但对于那些非常复杂的物体,或者这些物体本身是由 implicit function 定义的,我们该怎么办呢?

一种方法是暴力出奇迹,将这些复杂物体先进行参数化,然后应用 texture mapping. 另一种方法是先找一个简单的中介几何,如球体、长方体,先找到复杂物体与中介几何的关系,然后对中介几何应用 texture mapping.

Function-based Extension: 纹理可用连续函数 f(u,v,w,t)f(u,v,w,t) 定义,更紧凑.

Bump Mapping

Texture Mapping 不会对物体本身的几何作变化,因此,这会导致 texture mapping 的物体通常看起来非常光滑,于是导致失真. Bump Mapping 正是用于解决过于光滑的问题,可以为渲染引入粗糙度

Bump Mapping 通过扰动法线 (normal) 模拟表面粗糙感,而几何形状不变. 扰动法线的程度通常由 bump map 控制.

Bump Mapping
Bump Mapping

就具体的原理来说,我们把 bump map 上的 normal vector 直接“平移”到 original surface 上,这样 surface 上的法线就不再是光滑平整的了.

算法流程大致如下:

  1. 读取 bump map 中对应位置值
  2. 计算两方向偏导
  3. 用偏导修正真实法线
  4. 用修改后的法线进行光照计算(如 Phong 模型)

Displacement Mapping

纹理用于实际移动表面点位置,从而改变几何形状. 与凹凸映射不同,它真正修改模型几何

算法流程:

  1. 输入:原始表面 + 高度图(height map)。
  2. 找到表面与 map 的对应。
  3. 沿法线方向移动每个点,位移量取自 height map 值。
  4. 输出:修改后的表面

相比 Bump/Texture Mapping,拥有更深的深度和更多的细节,因此能够产生真实的轮廓、阴影和自遮挡效果. 然而缺点是成本高于其他映射方式.

Function-based Extension: 几何纹理可由函数直接定义

  • 参数纹理 + 参数/隐式表面
  • 显式纹理 + 参数/隐式表面