根据CUDA编程指南,获取纹理返回的值是
tex(x) = (1-a)T[i] + aT[i+1] for a one-dimensional texture
where i = floor(Xb), a = frac(Xb), Xb=x-0.5
假设我们有一个只有两个纹理的一维纹理。例如:
T[0] = 0.2, T[1] = 1.5
假设我们想在1处获取文本,我认为应该返回T[1],也就是1.5。
但是,如果遵循编程指南中给出的规则,返回值将是:
Xb = 1 - 0.5 = 0.5
a = 0.5
i = 0
return value = 0.5*T[0] + 0.5*T[1] = 0.85
对我来说没有任何意义。有人能解释一下为什么CUDA以这种方式进行线性滤波吗?由于
CUDA中的线性滤波算法假设texel值位于插值体的质心(如果你喜欢,可以以体素为中心)。在您的1D过滤示例中,输入数据隐式地作为
T[0]=(0.5, 0.2) T[1]=(1.5, 1.5)
所以你的例子要求Tex(1)
,这是两个文本值之间的中点,即
0.5*0.2 + 0.5*1.5 = 0.85
要获得T[1]返回,您需要Tex(1.5)
,这是一般规则-如果您想将纹理数据视为在体素顶点,而不是体素中心,则添加0.5到坐标。