0

当我们进行图像插值时,我认为我们将使用输入图像中像素的强度值。

(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) 现在我很困惑。我认为我们将在输入图像中使用“精确”像素的强度值。我们应该使用哪种方式?

4

0 回答 0