三角形内插值:
目的:在三角形内部获得平滑过渡
插值的内容:纹理、颜色、法线(Phong)等等。
怎么做插值:重心坐标
重心坐标的定义:
满足三个顶点的系数之和为1(作用是限制点在三角形所在的平面内),且均非负,三角形内任意一点的属性可表示为顶点属性的线性组合。
顶点自身的重心坐标:
三角形内任意一点的重心坐标:
可通过面积比求出来,各顶点系数等于”对面“三角形面积/总面积
三角形重心的坐标:
系数各为1/3,将三角形均等分为三份
利用重心坐标做插值的一个问题:
在投影变换下,不能够保证重心坐标不变,即当三角形在三维空间中投影后,其重心坐标可能会改变,方法是在三维空间中做插值,结果投影到二维平面上去。
纹理放大问题–>双向插值:
原因:纹理范围过小,导致纹理被拉大,如何定位映射到纹理上的坐标?
解决办法:
(1)双向线性插值
(2)更精确的插值:Bibubic
双向线性插值是取周围邻近的四个,Bicubic是取周围邻近的十六个
纹理缩小问题–>双向插值:
原因:近处纹理覆盖范围小,远处纹理覆盖范围大,导致走样(一个像素覆盖大片纹理)
从信号角度考虑解决方案:在小范围内信号频率高,按照之前抗锯齿的方案,在小片像素范围内增加采样点即可。
另一种方案:避免采样!转而获得纹理范围内的平均值,映射到小片像素范围。
如何获取纹理范围内的平均值?–> 范围查询问题(Range Query),不仅是平均值。
利用MipMap做范围查询:
MipMap–快,近似正方形范围查询
”图像金字塔“:
MipMap引入的空间复杂度:4/3,较原本的图存储多1/3。
近似过程:
(1)用正方形近似像素纹理区域,L为正方形区域的边长
(2)用MipMap查询正方形区域的平均值
如上图,映射的纹理面积是2*2,则在图像金字塔的第二层其覆盖面积变为1,可获得对应的平均值。
总之就是在D = log2L层上会对应到一个像素,并因此获得平均值。
(3)解决不连续的问题:
因为层数都是整数,因此层数计算都是不连续的,导致如下现象:
解决方法还是插值-三线性插值。
(4)MipMap的缺陷:
过分模糊:
原因:MipMap只在正方形区域内查询,而有一些图无法用规则正方形分割:
部分解决:各向异性过滤(Anisotropic Filtering)
各向异性过滤适用于长条形区域,对于不规则区域(如上图斜着的区域)也无法解决。
EWA过滤能较好的解决这一问题,代价是性能。
纹理的另外作用:
(1)模拟环境光
纹理可以模拟环境光照(假设环境光线来自无限远处,只记录方向信息),用来执行渲染。
用环境光表示纹理的实例,把环境光记录在球面上:
将环境光记录在球面上会带来扭曲问题(对信息的不均匀描述),是由于球本身的形状导致的。
解决方法:使用包围盒,将信息存储到立方体的表面上,得到六张图。
(2)凹凸贴图,减少着色的计算量
原因是纹理可以定义任意不同点的属性,而不单单是在Phong模型中定义kd值。使用凹凸贴图则是定义了不同点的高度,进而改变了法线,进而影响着色,而不会改变原本的几何信息。
(2)位移贴图
与凹凸贴图一样,都会定义不同点的高度,但位移贴图还会真正改变几何信息,因此更加真实,凹凸贴图在边缘和阴影处会“露馅”。位移贴图的“代价”是要求几何体的三角形要比较细密,顶点间隔要小于纹理频率。
(3)体积渲染
多用于医学,如人体成像