DragonWind

关于Texture导入

FilterMode

本质是像素不在纹素中心

假设纹理大小是3,三个纹素,口口口,他们的UV就是

0-0.3 0.3-0.6 0.6-1

假设三个像素的Interp.UV是

0.1 0.15 0.2

这三个像素都落在第一个纹素上

Point

直接取像素落在纹素的值

结果:像素块,性能好。

Bilinear

插值

如果刚好在第一个纹素中心,0.15,那么选取第一个纹素

如果刚好在第二个纹素中心,0.45,那么选取第二个纹素

如果在第一个纹素和第二个纹素中心的中间,那么插值

texel * (x-0.15)/0.3 + texel * (0.45-x)/0.3

如果是Bilinear,插值4个而不是插值2个

先左上 右上平均

再左下 右下平均

最后上下平均

tx = (x - 左纹素中心) / (右纹素中心 - 左纹素中心)

Mipmap

低通滤波

本质是一个像素覆盖了多个(>1)纹素

如果有十个纹素

口口口口口口口口口口

假设第一个像素的UV是0.1

第二个像素的UV是0.5

第三个像素的UV是0.9

这个叫 走样 采样点不够

假设纹素是

黑白黑白黑白黑白黑白

显示出来就是

黑黑黑

如果稍微动了一下,物体,世界坐标改变

如果稍微动了一下,摄像机,观察空间改变

投影坐标,改变

最后到归一坐标,改变

最后每个像素,根据三角形顶点插值计算出来的UV改变

所以就变成

白白白

而且稍微移动就会反复变换

黑白干涉又会产生摩尔纹

什么是MipMap

就是把纹理缩小

比如一个纹理1024*1024

每四个像素取平均,或者先左右每两个,然后上下每两个

就变成了512*512

这样那10个纹素就变成了5个

灰灰灰灰灰

三个像素采样纹素,变成

灰灰灰

怎么决定取第几个MipMap

用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开始。

几个问题来了

如果MipMap是负数怎么办

其实这里就对上了,这时候就是Point,Bilinear要处理的事情了。多个像素对应一个纹素。

如果MipMap不是整数怎么办

这类情况很常见,如果MipMap是2.6怎么办?取MipMap2还是3?

四舍五入。

如果开了Trilinear,那么会取平均。

MipMap2 * 40% + MipMap3 * 60%

注意开了Trilinear会默认认为Bilinear也开着,MipMap2和MipMap3的结果已经是Bilinear的了。

Anisotropy

注意到我们之前说的MipMap计算,是只计算了一条边的。实际上会计算x和y,然后取二者最大值。

想象一下有一个道路,是一个长条区域,一个像素覆盖的像一个长方形。这时候如果以长边取MipMap,那么短边就会模糊。

解决办法就是多次采样。

假设是一个1*8的方形。

我们再在中间取8个采样点,采样然后平均。

就相当于8个1*1的方形了。

实际采样点受限于AnisoLevel,即最大处理比例。

假设1*8,各向异性过滤X2

那么1 4 1*4

然后拉长短轴

4*4 4 4

然后平均

异步加载

MipMapStreaming