为什么做插值??
- Specify values at vertices 指定顶点处的值
- Obtain smoothly varying values across triangles 获得三角形之间平滑变化的值
我们的很多操作都是在三角形顶点上完成或者计算的,然后在三角形内部希望得到一个平滑的过渡
对什么做插值??
- Texture coordinates, colors, normal vectors, ... 纹理坐标、颜色、法线向量...
- 基本来说,可以对三角形顶点上的任意属性进行插值
怎么做插值??
- Barycentric coordinates 重心坐标
A coordinate system for triangles(α, β, γ)
.assets/1682567119392.png)
- 三角形所在平面上的任意一个点(x, y)都可以用三个顶点坐标的线性组合来表示
- α+β+γ=1时,这个点才会在三角形所在平面上
- 如果这个点在三角形内,还需要满足α、β、γ必须是非负的 —— 重心坐标
.assets/1682567605842.png)
Geometric viewpoint -- proportional areas 几何视点——比例区域
.assets/1682574149191.png)
通过三角形的面积比求αβγ
质心的重心坐标是多少?
.assets/1682574581451.png)
公式
.assets/1682574710134.png)
Linearly interpolate values at vertices 对顶点处的值进行线性插值
.assets/1682574937735.png)
通过αβγ将各种属性值分别线性的组合起来
在投影变换下不能保证重心坐标不变!
例:在三维空间中的三角形有个点,投影了之后,他的重心坐标可能就不一样了
想要插值一些三维空间中的属性,我们就应该取三维空间中的坐标(a, b, c)再去找三维空间中的重心坐标之后再去做插值,不能在投影之后的三角形中去做(深度)
.assets/1682575889384.png)
1.屏幕上的采样点,插值出来的uv,或者说纹理的坐标
2.在纹理上查询一下这个uv,可以知道对应的纹理颜色
3.我们可以认为这个纹理颜色就是漫反射系数,用纹理颜色去代替漫反射系数,就相当于将这张图贴在了这个物体上,并且这个物体还有Phong-shading带来的明暗变换,高光等
例:有一面很大分辨率的墙,可能有4K??我们的纹理只有256*256,咋办?纹理太小了,如果要对应uv,纹理就会被拉大
Texture Magnification - Easy Case
Generally don't want this —— insufficient texture resolution A pixel on a texture 一般情况下不希望这样——纹理分辨率不足纹理上的像素—— a texel (纹理元素、纹素)
.assets/1682576778030.png)
对于任何的墙上的一个点/像素,都可以找到它对应的这个纹理上的一个位置,这个位置可能不是整数,咱们就把它around四舍五入成整数 —— 相当于在一定范围内,查找相同的纹理上的像素,叫texel,纹素
当在查询这个纹理的时候,如果查找到一个非整数的坐标,那应该如何得到它的值? —— 双线性插值
Bilinear Interpolation
.assets/1682577299994.png)
.assets/1682577558677.png)
.assets/1682577586169.png)
.assets/1682577865652.png)
Bicubic Interpolation 双三次插值
取这个点周围临近的16个点对竖直和水平分量进行插值计算
Texture Magnification - Hard Case
Point Sampling Textures -- Problem
.assets/1682579797437.png)
会产生走样的问题
Screen Pixel "Footprint" in Texture
.assets/1682579994450.png)
Will Supersampling Do Antialiasing?
.assets/1682580136130.png)
Antialiasing —— Supersampling?
Will supersampling work? 超采样有效吗?
- Yes, high quality, but costly 质量高,但算法很慢
- When highly minified, many texels in pixel footprint 当高度缩小时,像素占地面积中有许多纹素
- Signal frequency too large in a pixel 像素中的信号频率过大
- Need even higher sampling frequency 需要更高的采样频率
避免采样 —— 给一个区域,立刻知道这个区域的平均值 —— mipmap
点查询问题和范围查询问题
- 点查询( Point Query ):以texture纹理为例的双线性插值
- 范围查询( Range Query ):mipmap
特点:快,近似(不准确),只能做正方形区域的范围查询
Mipmap(L. Williams 83)
.assets/1682581465569.png)
从一张图生成一系列图
计算机视觉中叫image pyramid
.assets/1682582209387.png)
mipmap的存储开销是多少?
存储量为4/3, 额外的存储开销为原来的1/3
.assets/1682582769036.png)
.assets/1682582983234.png)
.assets/1682583877189.png)
用这个正方形框来近似这个不规则的映射区域,即通过在像素上移动多少距离,计算出在纹理上移动多少距离
根据之前计算好的mipmap查询边长为L的这个区域的值的平均值是多少
如果这个区域大小就是1*1,就是一个像素的话,就可以在最原始的没有做过mipmap的这个纹理上找到对应的像素;
如果这个区域大小是4*4, 那么这个区域在第二层上一定会变成1个像素
原始纹理图片为0层,对应区域为4*4,那么j经过mipmap后第一层对应的区域为2*2,第二层对应的区域为1*1
Visualization of Mipmap Level
.assets/1682584926634.png)
发现问题:不连续,因为咱们只mipmap了0,1,2...层,没有计算1.8层这种....
解决:利用插值查找1.8层
先寻找1层和二层,然后在这两层内部,分别使用双线性插值把在这两层上对应的查询做出来,然后将两次双线性插值的结果合在一块,就可以在层与层之间再进行一次插值
Trilinear Interpolation 三线性插值
.assets/1682585277245.png)
.assets/1682585667294.png)
mipmap的问题
.assets/1682585786565.png)
.assets/1682585797482.png)
Overblur 过度模糊
原因:近似正方形区域内查询
.assets/1682585978580.png)
Ripmaps and summed area tables
- Can look up axis-aligned rectangular zones 可以查找轴对齐的矩形区域
- Diagonal footprints still a problem 对角线足迹仍然是个问题
.assets/1682586180063.png)
水平竖直压扁,这样可以查询到对应原始图上的矩形区域,就不会限制到一个正方形的区域上
各向异性过滤的额外开销是原来的三倍
Irregular Pixel Footprint in Texture 纹理中的不规则像素足迹
.assets/1682586367776.png)
屏幕上的像素映射到纹理上时,不一定都是一个规律的形状,很有可能出现这种超级斜着的细的区域
如果引入各向异性过滤,就可以解决这种长条形区域的问题了,但是只是解决了一部分的问题,对于斜着的区域还是有些问题
EWA filtering
- Use multiple lookups 使用多个查找
- Weighted average 加权平均
- Mipmap hierarchy still helps Mipmap层次结构仍然有帮助
- Can handle irregular footprints 可以处理不规则的脚印
.assets/1682586931053.png)
有一个任意不规则的形状,它都可以把它拆成很多不同的圆形去覆盖这个不规则形状