Suzanne 模型(三维空间中的点)
Suzanne 的 UV 展开图(二维纹理空间)
VBO中存储了逐顶点的属性,如位置$(x,y,z)$,法线$(nx,ny,nz)$
纹理对象是VRAM中的一块内存,存储了图像数据
要应用纹理对象,需要有另一组关键数据:UV坐标,即纹理坐标
UV坐标如何计算?
以桔子建模为例
纹理映射,即指用于将二维的纹理图像“粘贴”到三维物体表面,使三维模型看起来更具视觉真实感。关键在于建立三维物体表面点与纹理图像上的点的对应关系,即纹理坐标
环境映射,反射贴图(Environment mapping),用环境图片作为纹理映射,可模拟高反射表面
凹凸映射,Bump mapping,通过扰动法线向量来模拟表面细节,形成表面凹凸的效果
几何模型平滑着色
纹理映射
环境映射
凹凸映射
纹理映射在渲染流水线的最后阶段实现,此时面片已完成了裁剪处理,因此效率很高
纹理映射,其基本原理是将二维图像映射到三维物体表面,其实现涉及多个坐标系间的转换
纹理映射过程中涉及的坐标系包括:
映射的本质是,找到一个函数$f$,为三维模型表面上的每一个点$P(x,y,z)$,都能指定一个二维纹理图像上的对应点$T(u,v)$,即有:
$$ f(x,y,z)=(u,v) $$
拓扑学上的挑战在于,将一个封闭的三维物体的表面,在不产生任何撕裂或拉伸的情况下,完全展平成二维的矩形
对于复杂模型,无法完全用数学公式建立映射,需要三维建模专业人员介入
计算出最终的$(u,v)$坐标后,永久存储在模型的VBO中
对于简单的几何体,可以找到映射关系,将纹理坐标上的一个点,对应到最终成像图像上的位置,该映射关系可表示成
$$ \begin{cases} x=x(s,t)\\ y=y(s,t)\\ z=z(s,t) \end{cases} $$
求解映射问题,可以从两方面考虑:
两步映射法,先将三维空间中的点$(x,y,z)$映射到参数空间$(s,t)$,再将参数空间$(s,t)$映射到纹理空间$(u,v)$,即有:
$$ \begin{cases} s=s(x,y,z)\\ t=t(x,y,z) \end{cases} $$
$$ \begin{cases} u=u(s,t)\\ v=v(s,t) \end{cases} $$
这种方法的关键在于,如何定义参数空间$(s,t)$,以及如何建立从三维空间$(x,y,z)$到参数空间$(s,t)$的映射关系。常见的参数空间定义方法有:
假设一个圆柱半径为$r$,高度为$h$,如果用参数$(u,v)$表示圆柱体上一点,则其对应点坐标$(x,y,z)$可定义为:
$$ \begin{cases} x=r\cos{2\pi u}\\ y=vh\\ z=r\sin{2\pi u} \end{cases} $$
即完成了从图像坐标$(u,v)$到圆柱体表面一点$P(x,y,z)$的映射
再将纹理空间$(s,t)$映射到参数空间$(u,v)$,则有:
$$ \begin{cases} s=u\\ t=v \end{cases} $$
这样,就实现了从纹理空间$(s,t)$到三维空间$(x,y,z)$的映射
反向映射时,给定圆柱体上一点$P(x,y,z)$,如何计算出对应的纹理坐标$(u,v)$?
假设圆柱沿$Y$轴放置,半径为$r$,高度$h$,从$y_{min}$到$y_{max}$
目标: $f(x, y, z) = (u, v)$
1. V坐标(高度):是$y$坐标的归一化,有
$$v=\frac{y-y_{min}}{y_{max}-y_{min}}=\frac{y-y_{min}}{h}$$
2. U坐标(环绕):需要$P$点绕$Y$轴的角度 $\theta$
$$\theta = atan2(z, x)$$
3. 归一化 U: $atan2$ 返回值在 $[-\pi, \pi]$。我们需要将其映射到 $[0, 1]$。
$$u = \frac{\theta + \pi}{2\pi}$$
假设一个球体半径为$r$,如果用参数$(u,v)$表示球体上一点,则其对应点坐标$(x,y,z)$可定义为:
$$ \begin{cases} x=r\sin{(\pi v)}\cos{(2\pi u)}\\ y=r\sin{(\pi v)}\sin{(2\pi u)}\\ z=r\cos{(\pi v)} \end{cases} $$
即完成了从图像坐标$(u,v)$到球体表面一点$P(x,y,z)$的映射
再将纹理空间$(s,t)$映射到参数空间$(u,v)$,则有:
$$ \begin{cases} s=u\\ t=v \end{cases} $$
这样,就实现了从纹理空间$(s,t)$到三维空间$(x,y,z)$的映射。但在映射过程中,需考虑到球体存在形变。球体一般用于环境映射
反向映射时,给定球体上一点$P(x,y,z)$,如何计算出对应的纹理坐标$(u,v)$?
假设球体中心在原点,半径为$r$,需要从球面上一点$(x,y,z)$反求经度$\lambda$和纬度$\phi$
目标: $f(x, y, z) = (u, v)$
1. U坐标(经度):与圆柱映射完全相同,是$P$点在$XOZ$平面上的投影角度,有
$$\lambda = atan2(z,x)$$ $$u=\frac{\lambda + \pi}{2\pi}$$
2. V坐标(纬度):需要$P$点与$XOZ$平面的夹角
$$\phi=\arcsin{\frac{y}{r}}$$
3. 归一化:$\arcsin$返回值在$[-\pi/2, \pi/2]$之间,因此需要将其映射到$[-1,1]$之间
$$v=\frac{\phi + \pi/2}{\pi}$$
用前面计算的映射函数求解,当点在北极点时,$P=(0, r, 0)$
在拓扑学上,在球面上,北极点是一个单独的点,但在二维纹理上,被映射成了一整条边($v=1$),这也是地图上格陵兰岛和南极洲被无限拉伸的原因,也是球面映射的固有的缺陷
也可通过简单的正投影将纹理直接映射到立方体盒子表面,可用于环境映射计算
建立从中间形体到实际形体的映射,目标是将一般形体$M$上的点$P_M$映射到中间形体$S$上的点$P_S$,即$P_S=g(P_M)$
对实际形体$M$表面上的点$P_M$,沿其法线方向,找到与中间形体$S$表面相交的点$P_S$
对实际形体$M$表面上的点$P_M$,沿中心线方向,将其投射到中间形体$S$表面上对应的点$P_S$,中心线方向由$S$决定,前面的球体推导过程正是利用了该方法
以$S$为球体为例
你正在为一个场景建模。请为左侧的物体选择最合适的 纹理映射 方式:
答案: 1 ➔ B, 2 ➔ C, 3 ➔ A