Metal纹理采样器:如何获取指定纹素数值?1D纹理采样疑问
Metal纹理采样:获取特定纹素的坐标与1D纹理采样疑问解答
一、获取特定纹素精确值的坐标规则
要精准拿到某个纹素的数值,必须采样该纹素的中心坐标。Metal里纹理采样用的是归一化坐标(范围[0, 1]),不同维度纹理的纹素中心坐标计算方式如下:
- 1D纹理:假设总共有
N个纹素,第i个纹素(从0开始索引)的中心坐标为(i + 0.5) / N - 2D纹理:假设纹理宽为
width、高为height,第(i, j)个纹素的中心坐标为((i + 0.5)/width, (j + 0.5)/height)
当使用这个中心坐标,且采样器的过滤模式设为MTLSamplerMinMagFilterNearest(最近邻过滤)时,就能直接获取该纹素的原始精确值。
二、1D纹理在坐标0.5处的采样结果
结论:只有当1D纹理仅包含1个纹素时,坐标0.5处采样才会返回第一个(也是唯一的)纹素精确值;若纹素数量大于1,无论过滤模式是最近邻还是线性,都不会返回第一个纹素的精确值:
- 纹素数量=1:0.5正好是该纹素的中心坐标,两种过滤模式都会返回其精确值。
- 纹素数量>1:第一个纹素的中心坐标为
0.5/N(远小于0.5),0.5对应纹理的中间位置:- 最近邻过滤:会采样离0.5最近的纹素中心对应的纹素,显然不是第一个;
- 线性过滤:会对0.5左右相邻的两个纹素值做线性插值,结果也和第一个纹素的精确值无关。
内容的提问来源于stack exchange,提问作者Yoshi
相关产品推荐
相关产品推荐

