纹理记忆 - tex2D基础知识

Cod*_*mer 10 cuda texture2d

在使用纹理内存时,我遇到了以下代码: -

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);
Run Code Online (Sandbox Code Playgroud)

我的问题是,为什么我们添加0.5f到两个cf?这让我感到困惑..谢谢你

Rog*_*ahl 15

在图形中,纹理是一组描述表面视觉外观的样本.样本是一个点.也就是说,它没有尺寸(与具有物理尺寸的像素相对).使用样本确定像素的颜色时,每个样本都位于其对应像素的精确中心.当使用整数坐标寻址像素时,给定像素的精确中心变为其整数坐标加上0.5的偏移(在每个维度中).

换句话说,将0.5添加到纹理坐标可确保在从这些坐标读取时,返回该像素的样本的精确值.

但是,只有当filterMode纹理设置cudaFilterModeLinear为时,从纹理读取的值才会在像素内变化.在该模式中,从不在像素的精确中心的坐标读取返回在给定像素的样本和相邻像素的样本之间插值的值.因此,将0.5添加到整数坐标有效地抵消了cudaFilterModeLinear模式.但是,由于在纹理坐标中添加0.5会占用内核中的周期,因此最好通过设置filterMode为简单地关闭插值cudaFilterModePoint.然后,从像素内的任何坐标读取将返回该像素的精确纹理样本值,因此,可以使用整数直接读取纹理样本.

使用时cudaFilterModePoint,如果计算纹理坐标涉及任何浮点数学,则必须注意确保浮点不准确不会导致纹理坐标落在预期目标像素的范围之外.

此外,正如评论中提到的,您的代码可能存在问题.向纹理坐标添加0.5f意味着cudaFilterModeLinear正在使用模式,但该模式返回浮点数而不是int.

  • 如果使用`cudaFilterModePoint`并且不添加0.5,那么3.0将寻址像素#3,但2.9999999将寻址像素#2.使用浮点值的计算通常不准确,因此您可能期望作为值3.0的计算可能稍高或稍低.在这种情况下,稍微低一点的值将解决不同的像素.如果添加0.5,则寻址对这种小错误更容忍. (5认同)