着色3
一、重心坐标(Barycentric Coordinates)
(1)为什么我们想要做插值?
①已知三角形三个顶点的属性,想要获得三角形内部平滑变化的属性(如纹理坐标,颜色,法线等)。
②使用重心坐标可以实现插值。
(2)重心坐标是对一个三角形(α,β,γ)而言的。
①不同的三角形对应不同的重心坐标系。
②α,β,γ均为非负且和为1时,该点在三角形内。
③三角形内任意一点均可以用重心坐标表示。如点A的重心坐标为(1,0,0),点B的重心坐标为(0,1,0)。
④进行投影之后,该三角形可能会变成形变,那么重心坐标就可能会发生变化。
(3)从几何的角度看
①以α为例,α与A相关,α的值就是A顶点对面的三角形的面积AA与三角形ABC的面积之比。
(4)重心坐标的计算公式如下:
(5)重心坐标的使用
①已知三个顶点的属性和某个点的重心坐标,则可以计算得到该点的属性。
②三维空间里的属性应该在三维空间里进行差值获取。
二、纹理映射
(1)以漫反射为例子来映射纹理
①对于每个像素点(通常是像素中心)的坐标,都计算出对应的纹理坐标。
②应用到纹理坐标计算出对应的颜色。
③设置颜色。
三、纹理放大(Texture Magnification)
(1)纹理放大(案例1)
①如果纹理较小,那么图像可能会出现锯齿。
②这是因为一个小区域内的像素可能会映射到同一个纹素。
③使用双线性插值来获得更准确的属性。
(2)双线性插值(Bilinear Interpolation)
①找到目标位置周围四个像素点。
②先进行s方向上的插值,获得u1和u2的属性。
②然后对u1和u2进行t方向上的插值,即可得到目标位置的属性。
(3)纹理放大(案例2)
①如果纹理较大,那么图像可能会出现摩尔纹和锯齿。
②不同位置的像素覆盖的纹素多少不同,远处的像素可能会覆盖一大片纹素。
(4)纹理放大(案例2)的解决方法
①可以采用超采样,但这种方案的开销大。
②使用平均范围查询(Range Query)的方法。
四、Mipmap
(1)Mipmap:将图片按比例缩小
①允许进行范围查询。
②查询速度快,但只能做近似且为正方形的查询。
③只额外多了1/3的存储空间。
(2)求像素点对应的mipmap层数
①将像素点映射到纹理坐标上,可以发现原来的方形像素区域会被映射成不规则的纹理。
②求出映射到纹理坐标系里,当前像素点与周围两个(也可以是更多个)像素点的最大距离L。
③使用一个边长为L的方形区域来近似这块不规则区域,从而获得纹理。
④根据边长L可以算出对应的是mipmap里的第几层,从而获取纹理。
(3)mipmap的效果
①有初步的效果,但可以看到有部分地方不连续。这是因为只计算了第0、1、2等层的属性,而没有计算中间如1.5层的属性。
②可以使用三线性插值来解决,在两层mipmap之间进行第三次插值,来获取更加连续的属性。
③使用三线性插值的结果如下。
(4)mipmap存在的问题
①远处的图像会变模糊。
②使用各向异性过滤可以进行改善。
五、各向异性过滤(Anisotropic Filtering)
(1)ripmap
①在两个方向上进行缩小。
②允许进行矩形区域的范围查询。
③对于斜的区域范围查询没有太大改善。
④存储开销多了3倍。
(2)EWA filtering
①进行圆形区域的范围查询。
②需要进行多次查询。
参考文献
课程视频链接: GAMES101 Lecture09 Shading 3