在 Metal Core Image Kernel 中指定采样方法
Specify sampling method in Metal Core Image Kernel
在 Metal 中,我们可以像这样创建采样器
constexpr sampler s(coord::normalized, address::clamp_to_edge, filter::linear);
然后我们可以使用这个采样器对任何纹理进行采样。
我想知道 Metal Core Image Kernels 中是否有类似的东西。
是的,有!您可以使用可以传递给内核的 CISampler
而不是 CIImage
:
let sampler = CISampler(image: image, options: [
kCISamplerWrapMode: kCISamplerWrapClamp,
kCISamplerFilterMode: kCISamplerFilterLinear
])
您还可以在 options
中设置 kCISamplerAffineMatrix
来定义采样时应用于坐标的变换(我认为 normalized
是默认行为)。
或者,您可以在 CIImage
上使用这些便捷助手来设置环绕和过滤模式:
// for linear & clamp-to-edge
let newImage = image.samplingLinear().clampedToExtent()
// for nearest & clamp-to-black (actually transparent, not black)
let newImage = image.samplingNearest().cropped(to: aRect)
使用这些方法,您还可以强制 built-in 过滤器使用相应的模式。
在 Metal 中,我们可以像这样创建采样器
constexpr sampler s(coord::normalized, address::clamp_to_edge, filter::linear);
然后我们可以使用这个采样器对任何纹理进行采样。
我想知道 Metal Core Image Kernels 中是否有类似的东西。
是的,有!您可以使用可以传递给内核的 CISampler
而不是 CIImage
:
let sampler = CISampler(image: image, options: [
kCISamplerWrapMode: kCISamplerWrapClamp,
kCISamplerFilterMode: kCISamplerFilterLinear
])
您还可以在 options
中设置 kCISamplerAffineMatrix
来定义采样时应用于坐标的变换(我认为 normalized
是默认行为)。
或者,您可以在 CIImage
上使用这些便捷助手来设置环绕和过滤模式:
// for linear & clamp-to-edge
let newImage = image.samplingLinear().clampedToExtent()
// for nearest & clamp-to-black (actually transparent, not black)
let newImage = image.samplingNearest().cropped(to: aRect)
使用这些方法,您还可以强制 built-in 过滤器使用相应的模式。