Using a a single linearly interpolated sample to evaluate a weighted sum of two texels
f(floor(x))
|-- f(x) f(floor(x)+1)
| \--*---|
| |
----------------------------------------
floor(x) ^ floor(x) + 1
|
x
Bilinear sampling at point x in gives
f_bilinear(x) = f(floor(x))(1 - alpha) + f(floor(x)+1) alpha
where alpha = x - floor(x)
e.g.
f_bilinear(x) = f(floor(x))(1 - (x - floor(x))) + f(floor(x) + 1) (x - floor(x))
= f(floor(x))(1 - x + floor(x)) + f(floor(x) + 1) (x - floor(x))
Suppose we want to evaluate
v = a f(x_0) + b f(x_0+1)
for some x_0, a, b.
Consider
C f_bilinear(x)
= C f(floor(x))(1 - x + floor(x)) + f(floor(x) + 1) (x - floor(x))
= f(floor(x))(C - C.x + C.floor(x)) + f(floor(x) + 1) (C.x - C.floor(x))
defining x_0 = floor(x):
= f(x_0)(C - C.x + C.x_0) + f(x_0 + 1) (C.x - C.x_0)
= f(x_0)(C - C.x + C.x_0) + f(x_0 + 1) (C.x - C.x_0)
= (C - C.x + C.x_0) f(x_0) + (C.x - C.x_0) f(x_0 + 1)
So for this to equal v = a f(x_0) + b f(x_0+1), we want
a = C - C x + C x_0
and
b = C x - C x_0
but
a + b
= C - C x + C x_0 + C x - C x_0
= C
consider
b = C x - C x_0
C x = b + C x_0
x = (b + C x_0)/C
x = (b + (a + b)x_0)/(a + b)
x = b/(a + b) + (a + b)x_0/(a + b)
x = b/(a + b) + x_0
alternatively:
x = b/(a + b) + (a + b)x_0/(a + b)
= (b + (a + b)x_0) / (a + b)
So we have
a f(x_0) + b f(x_0+1) = (a + b) f_bilinear(b/(a + b) + x_0)
Checking:
(a + b) f_bilinear(b/(a + b) + x_0) =
[if a >= 0 and b >= 0, then b/(a + b) <= 1, and if a > 0 or b > 0, then (a + b) > 0, so b/(a + b) is defined and b/(a + b) > 0.]
[also since it is <= 1, then floor(b/(a + b) + x_0) = x_0 ALMOST: need to handle =1 case]
= (a+b)f(floor(x))(1 - x + floor(x)) + (a+b)f(floor(x) + 1) (x - floor(x))
=(a+b)f(x_0)(1 - x + x_0) + (a+b)f(x_0 + 1) (x - x_0)
=(a+b)f(x_0)(1 - [b/(a + b) + x_0] + x_0) + (a+b)f(x_0 + 1) ([b/(a + b) + x_0] - x_0)
= (a+b)(1 - [b/(a + b) + x_0] + x_0) f(x_0) + (a+b)([b/(a + b) + x_0] - x_0) f(x_0 + 1)
= (a+b)(1 - [b/(a + b) + x_0] + x_0) f(x_0) + (a+b)([b/(a + b) + x_0] - x_0) f(x_0 + 1)
= (a+b)(1 - b/(a + b) - x_0 + x_0) f(x_0) + (a+b)(b/(a + b) + x_0 - x_0) f(x_0 + 1)
= (a+b)(1 - b/(a + b)) f(x_0) + (a+b)(b/(a + b)) f(x_0 + 1)
= ((a+b) - (a+b)b/(a + b)) f(x_0) + (a+b)b/(a + b) f(x_0 + 1)
= ((a+b) - b) f(x_0) + b f(x_0 + 1)
= a f(x_0) + b f(x_0 + 1)
