跟着闫令琪老师的课程学习,总结自己学习到的知识点
纹理坐标
每个3D模型上的三角形如果对应到2D平面,就可以用纹理坐标 ( u , v ) (u,v) (u,v) 表示,坐标分为在[0,1]内
示例:纹理坐标 ( u , v ) (u,v) (u,v)可以通过重心坐标插值的方法得到。
纹理放大(Texture Magnification)
当纹理图片过小,就会出现多个像素点仍然对应一个 ( u , v ) (u,v) (u,v)坐标,并将该 ( u , v ) (u,v) (u,v)坐标下颜色信息复制给该像素点,这样形成的图片边界过渡就会非常不自然,形成一个个的小格子。如下图:
解决上述问题的方法就是双线性插值。
双线性插值(Bilinear Interpolation)
双线性插值就是在充分利用屏幕空间 f ( x , y ) f(x,y) f(x,y)的四周的值,求出一个方向(例如 s s s)上点 f ( x , y ) f(x,y) f(x,y)的值,利用同样的方法,直至求出所有方向的值。利用这种方法得到的结果不会出现一个个小格子的现象。
纹理缩小(Texture Minification)
引用博客计算机图形学系列笔记
当纹理图过大,近处会出现锯齿、远处出现摩尔纹的现象。
根据引入的博客进行解释:
1 根据近大远小,远处的一张完整的贴图可能在屏幕空间中仅仅是几个像素的大小,那么必然屏幕空间的一个像素对应了纹理贴图上的一片范围的点,这其实就是纹理过大所导致的,直观来说想用一个点采样的结果代替纹理空间一片范围的颜色信息,必然会导致严重失真!(从信号的角度来说就是,采样频率过低无法还原信号原貌
2 换一种想法,考虑离相机很远的一个三角形面,假设该三角形面真正在纹理贴图上对应的一片区域有10个像素点。但是由于透视的关系,距离很远的三角形面投影到近平面时可能只有1个或2个像素点的大小(远远小于10个像素的原来大小),那么这1个或2个像素采样texture的结果就要代表原来这个三角形面10个像素点的颜色信息,自然会导致失真!
解决方法就是MipMap技术。
MipMap
MipMap就是将纹理进行分层,像素应用不同层次纹理。
但是这里D值算出来是一个连续值,并不是一个整数,有两种对应的方法:
1 四舍五入取得最近的那个level D
2 利用D值在 向下和向上取整的两个不同level进行三线性插值
通过MipMap分层之后,进行纹理映射得到的效果,边界过渡生硬,可以通过三线性插值的方法解决
三线性插值
拓展双线性插值,分别对D层级、D+1层级的MipMap进行双线性插值、在根据实际得到的D值进行线性插值,得到最终的结果。
纹理应用
纹理对着色有影响,不仅仅是对颜色的影响,还可以改变法线的高度来影响着色。
Bump Mapping
纹理通过定义法线高度,可以实现改变模型来增加模型的表面细节。
接下来是求纹理表面的法线。
In Flatland
in 3D
Displacement mapping
Displacement Mapping比Bump Mapping的更先进,Bump的边缘部分会出现Artifacts。