来源:GameRes 作者:bigbook2000
\N最近研究图像插值,可惜不在学校了,找不到资料看,胡乱搞了一个大家帮我看看
\N
\N我的理解是这样的,对像素周围16个点进行采样
\N(P11,P12,P13,P14)
(P21,P22,P23,P24)
(P31,P32,P33,P34)
(P41,P42,P43,P44)
\N先对每行的4个点进行采样一次,
\N为了方便,我用SIGMA(1,4)表示∑1-4
\N那么Pi = SIGMA(j=1,4)(S(dxj) * Pij);
其中S(dxj)是一个三角函数的近似值
当|dxj|<1时为1 - 2 * dxj * dxj + | dxj | * | dxj | * | dxj |;
当|dxj|>=1并且|dxj|<2时为4 - 8 * | dxj | + 5 * dxj * dxj - | dxj | * | dxj | * | dxj |;
当|dxj|>=2时为0
\N又由于dxj = xj - (int)x;
那么我估计上面的公式简化合并后应该是这样的
\NPi = dx * (dx * (dx * (Pi4 - Pi3 + Pi2 - Pi1) - Pi4 + Pi3 - 2 * ( Pi2 - Pi1) ) + Pi3 - Pi1) + Pi2;
\N16个点经过第一次采样后得到4个点
\N再经过一次采样,把4个点代入上面的公式,得到插值。
\N
不知道我的理解是不是这样
\N这样只能算是一种双三次插值方法,不知道如何实现双三次锐化和双三次模糊?
\N欢迎大家指教
\Nstatic float4x4 tco =
{
0, A, -2*A, A,
1, 0, -A-3, A+2,
0, -A, 2*A+3, -A-2,
0, 0, A, -A
};
\N\N
float4 taps(float x)
{
return mul(tco, float4(1, x, x*x, x*x*x));
}
\Nfloat4 c3sample(float4 taps, float2 t)
{
return
mul(taps,
float4x4(
tex2D(s0, t-dx),
tex2D(s0, t),
tex2D(s0, t+dx),
tex2D(s0, t+dx+dx)
)
);
}
\Nfloat4 main_bicubic(float2 tex : TEXCOORD0) : COLOR
{
// not usable for 1:1 mapping!
// tex * size won't be 0, 1, 2, 3, .. as you might expect, but something like 0, 0.999, 2.001, 2.999, ...
// this means when the fractional part becomes 0.999 we will be interpolating with the wrong value!!!
tex -= 0.5*dxdy;
float2 dd = frac(tex * size);
\Nfloat4 tx = taps(dd.x);
float4 c = mul(
taps(dd.y),
float4x4(
c3sample(tx, tex-dy),
c3sample(tx, tex),
c3sample(tx, tex+dy),
c3sample(tx, tex+dy+dy)
)
);
\Nreturn c;
}
引自media player classic中的bi-cubic interpolation shader。
其中,-A即为cardinal spline中的tension parameter