为什么 opencl 规范为 CLK_FILTER_LINEAR 减去 0.5
Why opencl spec subtracts 0.5 for CLK_FILTER_LINEAR
在阅读关于 CLK_FILTER_LINEAR 的 OpenCL 1.1 规范(第 8.2 节,p258)时,我了解到为了计算双线性滤波器的权重,将减去 0.5,如下所示。
i0 = address_mode((int)floor(u – 0.5))
j0 = address_mode((int)floor(v – 0.5))
i1 = address_mode((int)floor(u – 0.5) + 1)
j1 = address_mode((int)floor(v – 0.5) + 1)
而对于CLK_FILTER_NEAREST,它直接将 u 和 v 下调如下:
i = address_mode((int)floor(u))
j = address_mode((int)floor(v))
所以,似乎有出入。当我提供非标准化坐标 (5,4) 时,NEAREST 过滤器将读取像素 (5,4)。对于 LINEAR 滤波器,将从 (4,3)、(5,3)、(4,4) 和 (5,4) 生成平均像素。但即使对于线性过滤器,我也希望从 (5,4) 读取,因为权重将为 1、0、0、0。
任何人都可以澄清规范意图吗?
这是真的。如果要读取非插值像素,则需要将 (0.5,0.5) 添加到坐标中。 "Round" 个数字(以 .0 结尾)位于 个像素之间,并且将被均匀混合。
在阅读关于 CLK_FILTER_LINEAR 的 OpenCL 1.1 规范(第 8.2 节,p258)时,我了解到为了计算双线性滤波器的权重,将减去 0.5,如下所示。
i0 = address_mode((int)floor(u – 0.5))
j0 = address_mode((int)floor(v – 0.5))
i1 = address_mode((int)floor(u – 0.5) + 1)
j1 = address_mode((int)floor(v – 0.5) + 1)
而对于CLK_FILTER_NEAREST,它直接将 u 和 v 下调如下:
i = address_mode((int)floor(u))
j = address_mode((int)floor(v))
所以,似乎有出入。当我提供非标准化坐标 (5,4) 时,NEAREST 过滤器将读取像素 (5,4)。对于 LINEAR 滤波器,将从 (4,3)、(5,3)、(4,4) 和 (5,4) 生成平均像素。但即使对于线性过滤器,我也希望从 (5,4) 读取,因为权重将为 1、0、0、0。
任何人都可以澄清规范意图吗?
这是真的。如果要读取非插值像素,则需要将 (0.5,0.5) 添加到坐标中。 "Round" 个数字(以 .0 结尾)位于 个像素之间,并且将被均匀混合。