Lecture 9: Shading 3(Texture Mapping Continued)¶
Barycentric Coordinates¶
重心坐标用于插值计算。
对于点\(P(x, y)\),其在三角形\(ABC\)内的重心坐标\((\alpha, \beta, \gamma)\)满足:
其中:\(\alpha, \beta, \gamma\)分别表示三角形\(PBC, PCA, PAB\)的面积与三角形\(ABC\)面积之比。
但是三角形投影后的点\(P'\)的重心坐标与\(P\)的重心坐标不相同。
Applying Texture¶
将纹理映射到三角形上,三角形内的点通过插值计算纹理。
Texture Magnification(Antialiasing)¶
当存在多个像素映射到同一纹理像素时,称为纹理放大。如果直接使用最近邻插值,会导致锯齿现象。
比较常用的插值方法是双线性插值(bilinear interpolation)。
双线性插值¶
对于一维的线性插值:
在水平方向上使用两次一维线性插值:
然后在垂直方向上进行一次线性插值:
水平和垂直方向的插值可以交换顺序。
Bicubic Interpolation(双三次插值)¶
双三次插值会使用16个纹理像素进行插值计算,效果更好,但计算量更大。
如果有多个纹理像素映射到同一像素,可以使用超采样(supersampling)的方法,但计算量较大。因此,需要使用Mipmap(多级渐远纹理)技术。
Mipmap¶
Mipmap是一种预先计算好的多级纹理,每一级纹理的分辨率是上一层的一半。提前计算好这些纹理并存储好。
那么如何获取所需的Mipmap级别呢?可以根据以下公式计算:
其中,\(L\)表示纹理像素与屏幕像素的比例。
对于不在整数级别的\(D\),可以使用线性插值来计算,即在两个相邻的Mipmap级别之间进行插值。先使用双线性插值计算出两个级别的颜色,然后再进行线性插值,此过程称为三线性插值(trilinear interpolation)。
Anisotropic Filtering(各向异性过滤)¶
当纹理映射到屏幕上时,可能会出现各向异性失真现象,即纹理在不同方向上的缩放比例不同。各向异性过滤通过考虑纹理在不同方向上的缩放比例,选择合适的Mipmap级别进行采样,从而提高纹理的质量。
如果纹理在一个方向上被拉伸得更长,它就会在该方向上采集更多的纹理样本(texels)来进行计算。在这种情况下,采样区域不再是一个正方形,而是一个矩形、平行四边形、梯形等别的图形。
课上讲的是各向异性过滤会导致显存占用变大,但实际应用中,很多现代GPU使用各向异性过滤的时候不会占用更多显存,因为它们不改变原来的纹理,只是在采样时使用更复杂的算法。
EWA Filtering(椭圆加权平均过滤)¶
EWA过滤是一种更高级的各向异性过滤方法。它通过在纹理空间中定义一个椭圆区域来进行采样,并对该区域内的纹理像素进行加权平均,从而获得更高质量的纹理映射效果。
Applications of Texture¶
In modern GPUs, texture = memory + range query(filtering).
环境光照¶
提前计算好环境光照贴图,在渲染的时候直接使用,如Unity内使用的烘焙光照贴图(Lightmap),或者类似于记录整个环境光照的天空盒贴图(Skybox)。
存储高度/法线信息¶
通过储存相对高度信息或法线信息的纹理来实现纹理渲染时的凹凸效果。
Bump Mapping(凹凸贴图)¶
通过高度贴图来模拟表面的凹凸效果。具体做法是根据高度贴图计算出每个像素的法线,然后在光照计算中使用这些法线来影响光照效果。
假设原有的法线为\(N = (0, 0, 1)\),高度贴图的梯度为\((\frac{\partial h}{\partial x}, \frac{\partial h}{\partial y})\),则新的法线可以通过以下公式计算:
Displacement Mapping(位移贴图)¶
通过高度贴图直接修改顶点的位置,从而实现更真实的凹凸效果。位移贴图通常需要更多的计算资源,因为它会增加几何体的复杂度。
3D Procedural Noise + Solid Modeling¶
如柏林噪声(Perlin Noise)等程序化噪声可以用于生成自然现象,如地图、海拔等。
Provide Precomputed Shading¶
预先计算好复杂的光照效果,并将其存储在纹理中,在渲染时直接使用这些纹理来实现复杂的光照效果,如环境光遮蔽(Ambient Occlusion)等。
3D Textures and Volume Rendering¶
3D纹理可以用于存储体积数据,如医学成像中的CT扫描数据。体积渲染技术可以用于可视化这些3D纹理数据。