在使用纹理内存时,我遇到了以下代码:
uint f = (blockIdx.x * blockDim.x) + threadIdx.x;
uint c = (blockIdx.y * blockDim.y) + threadIdx.y;
uint read = tex2D( refTex, c+0.5f, f+0.5f);我的问题是,为什么我们要在c和f中都添加0.5f?这把我搞糊涂了。谢谢你
发布于 2012-05-20 01:34:32
在图形中,纹理是描述表面视觉外观的一组样本。样本就是一个点。也就是说,它没有大小(与具有物理大小的像素相反)。当使用样本来确定像素的颜色时,每个样本都位于其相应像素的精确中心。当使用整数坐标寻址像素时,给定像素的精确中心变成它的整数坐标加上0.5的偏移量(在每个维度中)。
换句话说,将0.5添加到纹理坐标可确保在从这些坐标读取时返回该像素的采样值的精确值。
但是,只有当纹理的filterMode设置为cudaFilterModeLinear时,从纹理读取的值才会在像素内发生变化。在该模式下,从不在像素精确中心的坐标读取将返回在给定像素的样本和相邻像素的样本之间插值的值。因此,在整数坐标上加上0.5可以有效地取消cudaFilterModeLinear模式。但是,由于纹理坐标增加0.5会占用内核中的周期,因此最好通过将filterMode设定为cudaFilterModePoint来简单地禁用插值。然后,从像素内的任何坐标读取将返回该像素的确切纹理样本值,因此,可以使用整数直接读取纹理样本。
使用cudaFilterModePoint时,如果在计算纹理坐标时涉及任何浮点数学运算,则必须小心确保浮点不准确不会导致纹理坐标落在预期目标像素的范围之外。
此外,正如注释所提到的,您的代码中可能存在问题。将0.5f添加到纹理坐标表示正在使用cudaFilterModeLinear模式,但该模式返回的是浮点型,而不是整型。
发布于 2012-05-18 05:56:49
根据纹理特性,可能会对tex2D返回的值进行线性插值。在这种情况下,“索引”f和c不应该是整数,而应该是每个维度限制之间的连续值。
在这个例子中有一点奇怪的是,返回值是一个整数,这将使任何线性插值分段常数。
有关更多详细信息,请参阅《CUDA编程指南》的3.2.10节。
https://stackoverflow.com/questions/10643790
复制相似问题