UnityShader开发之纹理 - Unity中的图像插值 Point、Bilinear、Trilinear

        图像插值就是当图像进行放大/缩小时,图像原有的像素数量不足以满足需求,例如从3X3的像素矩阵往4X4的像素矩阵变换的时候,就会出现像素值不知该如何填充的问题,而图像插值算法就是为了解决这个问题

       

上图就是Unity中选择贴图时出现的属性面板,箭头标识的位置就是可供选择的插值算法;

    

将最大尺寸调小,然后有插值与没有插值的情况十分明显,左侧有明显的颗粒感,而右侧则没有,感觉十分平滑。

 

        Unity支持的插值有Point、Bilinear和Trilinear,分别是最邻近插值法、双线性插值以及双三线性插值。而常见的插值方式主要有三种,最邻近插值法、双线性插值以及三线性插值。

        当图像由分辨率X*Y放大M,宽放大N倍后变为(X\cdot M)*(Y\cdot N)(X\cdot M)*(Y\cdot N)

例如:由3X3的矩阵变为9X9的矩阵

159
131721
252933

 

1   5   9
         
         
         
13   17   21
         
         
         
25   29   33

 

        (1)最邻近插值法(Nearest、Point)

        X_{origin}=Func_{floor}\left (X_{current}\ast \frac{X_{forward}}{X_{after}} \right )=Func_{floor}\left (\frac{X_{current}}{M} \right )

        X_{current}经处理后图的的x坐标值

       X_{origin}原始图片上经处理后图的x坐标映射值

       Func_{floor}为向下取整的函数

       宽Y同理

       则   C_{(X_{Current} , Y_{Current})}=O_{(X_{Origin} , Y_{Origin})}

运算结果:很明显,如果使用这种插值方法,放大的图会出现一块一块的像素块,即出现锯齿

111555999
111555999
111555999
131313171717212121
131313171717212121
131313171717212121
252525292929333333
252525292929333333
252525292929333333

 

 

        (2)双线性插值(Bilinear)

       

        双线性插值就是根据x、y轴两个方向来进行插值,如图所示,先根据O_{1}O_{2}求得I_{1},O_{3}O_{4}求得I_{2},再根据I_{1}I_{2}的值求出R的值。基本原理依然是根据距离来做颜色的插值。

先求x轴方向的插值:

 

        C_{I_{1}}=\frac{x-x_{1}}{x_{2}-x_{1}}\cdot (C_{O_{2}}-C_{O_{1}})+C_{O_{1}}

同理

        C_{I_{2}}=\frac{x-x_{1}}{x_{2}-x_{1}}\cdot (C_{O_{4}}-C_{O_{3}})+C_{O_{3}}

x轴方向的插值做完后,我们根据求得的颜色值再求y方向的插值:

        C_{R}=\frac{y-y_{1}}{y_{2}-y_{1}}\cdot (C_{I_{2}}-C_{I_{1}})+C_{I_{1}}

最后求得

123456789
456789101112
789101112131415
101112131415161718
131415161718192021
161718192021222324
192021222324252627
222324252627282930
252627282930313233

 

 

        (3)三线性插值(Trilinear)

        核心是通过所需要计算的像素周围的16个像素根据对应的权重值来求得最后的像素值(学习中)

       

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 技术黑板 设计师:CSDN官方博客 返回首页