【图形学笔记】Lecture06-Texture Mapping 纹理映射

发布时间 2023-10-27 01:37:39作者: yoshinow2001

Lecture06-Texture Mapping 纹理映射

首先说了一个事情,一个三维物体的表面铺开都是二维的(类似二维流形啦)。

纹理坐标的可视化,通常可以把纹理映射成 \((u,v)\in [0,1]^2\)的形式。

Barycentric Coordinates重心坐标

通常用来插值,在顶点指定值(例如纹理坐标),并在表面上平滑地获得不同的值。

三角形 \(ABC\) 所在平面任意一点 \(P\) 都可以表示成 \(\alpha A+\beta B+\gamma C\),记为三元组 \((\alpha,\beta,\gamma)\), 其中\(\alpha+\beta+\gamma=1\) ,三角形内的点还满足 \(\alpha,\beta,\gamma\geq 0\)

几何观点——面积:

另一种几何观点——距离比例

Q:为什么叫重心坐标?

A:对于任意一点\(P=\alpha A+\beta B+\gamma C\),改写成 \(\alpha \vec{PA}+\beta\vec{PB}+\gamma \vec{PC}=0\) 的形式,此时有一种经典力学上的解释,就是说假设在 \(A,B,C\) 上悬挂了重量(比例)分别为 \(\alpha ,\beta,\gamma\) 的物品,那么此时的 \(P\) 恰是他们的重心。并且我们会发现,正常的重心表示出来恰是 \((1/3,1/3,1/3)\) ,非常对称。

进一步,利用重心坐标,就去考虑三角形内一个函数 \(V\) ,如果知道在三个顶点的值,就用:

\[V=\alpha V_a+\beta V_B+\gamma V_c \]

来插值,函数 $V $可以是各种东西…颜色、纹理、位置、材质…

Applying Texture 纹理的一些应用

对于屏幕上每个光栅化的采样点 \((x,y)\) ,算出纹理坐标\((u,v)\),然后用重心坐标插值算出三角形其他点的纹理坐标。

Texture Magnification 纹理放大

如果纹理太小,图片太大怎么办?

最无脑的是采样某个像素 \((x,y)\) 对应的纹理坐标\((u,v)\) 时候,四舍五入采样最近的(就是图上的Nearest)的点,这样子效果可能不太好(因为我们假设说纹理图片太小了)

Bilinear Interpolation 双线性插值

每次选择最近的 \(4\) 个点,先在水平方向上做线性插值 \(\rm lerp(x,v_0,v_1)=v_0+x(v_1-v_0)\),两次插值取得两个点 \(u_0,u_1\),再在竖直方向上做一次线性插值,最后得到 \(f(x,y)=\rm lerp (t,lerp(s,u_{00},u_{01}),lerp(s,u_{10},u_{11}))\),此处 \(s,t\) 对应着距离的比值。

注:lerp是线性插值(linear interpolation)的缩写

纹理太大

反过来,如果纹理太大,像素太小,可能也会出现锯齿/摩尔纹,问题就在于,一个像素点要如何代表很大一块纹理?如果用超采样(对像素格子)的话开销很大,而且很容易浪费。

反过来做范围查询(range query)!即对于一个区域内的像素,查询纹理坐标。

MIP Map

类似于倍增,看图应该就知道在干嘛了,存储量只会变成 \(\sum_{n=0}^\infty \frac{1}{4^n}=\frac{4}{3}\) 倍,

如何查找在MIP Map上的哪一层?

取一个像素格\((u,v)\),考察 \((x,y)\) 变化后,在 \(u,v\) 方向上变化的距离,取个最大值作为 \(L\) ,然后就可以理解为,需要把这个边长为 \(L\) 的正方形映射成 \(1\times 1\) 的像素格,那么自然是到 \(D=\log_2 L\) 层去查询。

Trilinear Interpolation 三线性插值

其实就讲了一句话…在双线性插值的基础上,把MIP Map的层数作为第三维,再进行一次插值,相比bicubic来说效率高多了,而且效果也很好。

Anisotropic Filtering 各向异性过滤

Ripmaps、EWA filtering…

Advanced Texturing Methods 高级纹理方法

Environment Map 环境贴图

注:这里预设了一个事情,就是环境光是垂直的,并且光强和距离无关。

Spherical Environment Map:考虑放了一个球在环境中,球上的图案就对应着环境光,所以不如直接用一个球来记录环境光!——但是靠近球的两极处的效果可能不太好。

Cube Map:用一个正方体包住球,算出在6个面上的纹理贴图。

Texture can affect shading! Bump Mapping——凹凸贴图

很明显纹理不止可以表示颜色,有时候也会用一些复杂的纹理,来定义一个点的高度,进一步确定法线,

接着就来讨论,高度是如何具体影响法线的:

假设有一个高度函数 \(h\) (这是通过凹凸纹理得出的),这里先考察二维情况,假设没有高度变化的影响,在 \(p\) 处的法线的 \(n(p)=(0,1)\),此处的导数用 \(h(p+1)-h(p)\) 表示,这里加了个修正系数 \(c\) (大概是用来表示这个凹凸贴图的影响?以及可能这里的变化量 1 也取的有点大?),最后用 \(n(p)=(-d_p,1)\) 来代替法线。

对于三维情况呢?类似地,对两个方向计算偏导数…(当然我怀疑这里课件上隐藏了非常多细节…)

3D Procedural Noise + Solid Modeling 三维空间噪声函数

贴图又何必是图呢(hhh),比如用一个 \(\mathbb{R}^3\) 中的函数来表示某个点的贴图信息。