我目前正在使用 Accelerate 和 Metal 着色器计算直方图、波形和矢量。该代码适用于 8 位 SDR 像素缓冲区,并且可以正常工作。我想使用 Core Image 重写它们,以便它们可以适用于 10 位 HDR 和 SDR 缓冲区。
加速对于 8 位图像的直方图非常有效。但是它不支持 10 位 YCbCr 像素缓冲区。 CoreImage 支持它,但尚不清楚如何从
CIAreaHistogram
输出中获取原始直方图数据,以便使用 CoreGraphics 或 MTKView 显示它。显示直方图的内置直方图CIHistogramDisplayFilter
灵活性较差。除了 RGB 之外,我还想要亮度直方图。
我在金属着色器中使用
atomic_fetch_add_explicit
来计算波形和矢量等统计数据。金属核心图像内核似乎不支持原子。有没有办法在 CoreImage 中做同样的事情?
对于直方图,我认为你有两种选择:
CIHistogramDisplayFilter
的做法。您可以向其传递 RGB 和亮度直方图,并根据您的喜好将它们可视化。CIAreaHistogram
)并将结果渲染到位图缓冲区中。然后,您可以从该缓冲区读取 bin 值,并将它们可视化为自定义 UI 组件,例如使用 SwiftUI。在 Github 上的 CoreImageExtensions 库 中,我们还有一些方便的 API,用于从 CIImage
读取值,这可能会简化此过程。关于原子:如果您已经有一个用于这些统计数据的可用 Metal 实现,我建议您在它周围写一个
CIImageProcessorKernel
。它就是为此目的而设计的:将自定义图像处理器包含到 Core Image 管道中。特别是使用 Metal 非常方便,因为您已经获得了 Metal 设备、纹理和命令缓冲区。