当我们进行图像插值时,我认为我们将使用输入图像中像素的强度值。
(A) 我正在阅读GPU Gems Chapter 24. High-Quality Filtering中的三次插值代码。这是他们的代码片段:
示例 24-9。过滤四个 Texel 行,然后将结果过滤为一列
float4 texRECT_bicubic(uniform
samplerRECT tex,
uniform
samplerRECT kernelTex,
float2 t)
{
float2 f = frac(t); // we want the sub-texel portion
float4 t0 = cubicFilter(kernelTex, f.x,
texRECT(tex, t + float2(-1, -1)),
texRECT(tex, t + float2(0, -1)),
texRECT(tex, t + float2(1, -1)),
texRECT(tex, t + float2(2, -1)));
由于他们从 frac(t) 获得子纹素部分,因此“t”并不完全位于输入图像的像素位置。那么“t”如何直接用于从原始图像中采样强度值,例如“texRECT(tex, t + float2(-1, -1))”?
就个人而言,我认为我们应该使用
t - frac(t)
(B) 与“使用不同插值类型缩放图像”的示例相同
他们的“双三次插值的 GLSL 着色器代码”片段是:
float a = fract( TexCoord.x * fWidth ); // get the decimal part
float b = fract( TexCoord.y * fHeight ); // get the decimal part
for( int m = -1; m <=2; m++ )
{
for( int n =-1; n<= 2; n++)
{
vec4 vecData = texture2D(textureSampler,
TexCoord + vec2(texelSizeX * float( m ),
texelSizeY * float( n )));
我认为我们应该使用:
TexCoord - vec2(a,b)
然后使用 m 和 n 的偏移量
(C) 现在我很困惑。我认为我们将在输入图像中使用“精确”像素的强度值。我们应该使用哪种方式?