我有一个 CL_FLOAT 格式的图像并存储所有 RGBA 通道。现在图像的每 4 个像素都有整数存储在那里,我将它们存储为:
image[i * 4 + 3].x = *(float*)(&someInt);
image[i * 4 + 3].y = *(float*)(&someInt2);
etc.
由于我需要这些是整数(而不是浮点数),其余像素必须存储浮点数,所以我在这里没有太多选择。
当我从 OpenCL 读回图像时,我得到了正确的值,问题出现在 OpenCL 内核中:
每当我读到这样的图像时(采样器设置为最近的过滤):
float4 fourthPixel = read_imagef(img, sampler, coords);
我尝试将其转换为整数
int id = as_int(fourthPixel.x);
我没有读到正确的数字(它总是返回 0,除非数字以整数形式非常高)。
到目前为止,我得到了几分 - 如果我存储像 1505353234 这样的数字,它可以工作,给我 6539629947781120.000000 - 这是正确的。如果我存储较小的数字,似乎 read_imagef 只是钳位然后下降到 0。
所以很明显,所有非规范化数字都被限制为零。那么,有没有什么好的方法可以实际强制 read_imagef 不将非规范化数字钳制为零,而不添加进一步的指令(我可以添加 0x7f000000 等 - 但我需要代码中的性能,所以这个解决方案是不可接受的)?