本质是像素不在纹素中心
假设纹理大小是3,三个纹素,口口口,他们的UV就是
0-0.3 0.3-0.6 0.6-1
假设三个像素的Interp.UV是
0.1 0.15 0.2
这三个像素都落在第一个纹素上
直接取像素落在纹素的值
结果:像素块,性能好。
插值
如果刚好在第一个纹素中心,0.15,那么选取第一个纹素
如果刚好在第二个纹素中心,0.45,那么选取第二个纹素
如果在第一个纹素和第二个纹素中心的中间,那么插值
texel * (x-0.15)/0.3 + texel * (0.45-x)/0.3
如果是Bilinear,插值4个而不是插值2个
先左上 右上平均
再左下 右下平均
最后上下平均
tx = (x - 左纹素中心) / (右纹素中心 - 左纹素中心)
低通滤波
本质是一个像素覆盖了多个(>1)纹素
如果有十个纹素
口口口口口口口口口口
假设第一个像素的UV是0.1
第二个像素的UV是0.5
第三个像素的UV是0.9
这个叫 走样 采样点不够
假设纹素是
黑白黑白黑白黑白黑白
显示出来就是
黑黑黑
如果稍微动了一下,物体,世界坐标改变
如果稍微动了一下,摄像机,观察空间改变
投影坐标,改变
最后到归一坐标,改变
最后每个像素,根据三角形顶点插值计算出来的UV改变
所以就变成
白白白
而且稍微移动就会反复变换
黑白干涉又会产生摩尔纹
什么是MipMap
就是把纹理缩小
比如一个纹理1024*1024
每四个像素取平均,或者先左右每两个,然后上下每两个
就变成了512*512
这样那10个纹素就变成了5个
灰灰灰灰灰
三个像素采样纹素,变成
灰灰灰
用dx和dy
就是纹理的变化和纹素的变化
假设我下一个像素对应下一个纹素,就是1:1,就不需要MipMap
假设我下一个像素还是对应这个纹素,就是1:少,也不需要,这时候需要Bilinear
假设我下一个像素,对应了下2个纹素,就是1:2,这时候就用MipMap1
假设当前像素的UV是0.1
下一个像素的UV是0.2
假设纹理个数是10
第一个纹素1 第二个纹素2 变了1
假设纹理个数是20
第一个纹素2 第二个纹素4 变了2
每隔了一个像素 跨越了多少个纹理
假设当前像素的UV是UV0
下一个像素的UV是UV1
假设纹理个数是N
Δ = UV1 * N - UV0 * N =
(UV1 - UV0) * N
假设Δ=1,MipMap=1=20
假设Δ=2,MipMap=2=21
假设Δ=4,MipMap=3=22
假设Δ=8,MipMap=4=23
MipMap=Log2Δ
注意这里说的MipMap从1开始,1表示原图。一般MipMap从0开始。
几个问题来了
其实这里就对上了,这时候就是Point,Bilinear要处理的事情了。多个像素对应一个纹素。
这类情况很常见,如果MipMap是2.6怎么办?取MipMap2还是3?
四舍五入。
如果开了Trilinear,那么会取平均。
MipMap2 * 40% + MipMap3 * 60%
注意开了Trilinear会默认认为Bilinear也开着,MipMap2和MipMap3的结果已经是Bilinear的了。
注意到我们之前说的MipMap计算,是只计算了一条边的。实际上会计算x和y,然后取二者最大值。
想象一下有一个道路,是一个长条区域,一个像素覆盖的像一个长方形。这时候如果以长边取MipMap,那么短边就会模糊。
解决办法就是多次采样。
假设是一个1*8的方形。
我们再在中间取8个采样点,采样然后平均。
就相当于8个1*1的方形了。
实际采样点受限于AnisoLevel,即最大处理比例。
假设1*8,各向异性过滤X2
那么1 4 1*4
然后拉长短轴
4*4 4 4
然后平均