除了标准的 kernel
和 vertex
函数外,Metal 还支持 fragment
。我找到了一个 Metal kernel
示例,可以将图像转换为灰度。
在 kernel
和 fragment
中这样做到底有什么区别?计算 kernel
可以做什么(更好)而 fragment
着色器不能,反之亦然?
最佳答案
Metal 有四种不同类型的命令编码器:
MTLRenderCommandEncoder
MTLComputeCommandEncoder
MTLBlitCommandEncoder
MTLParallelRenderCommandEncoder
如果您只是在进行图形编程,那么您最熟悉
MTLRenderCommandEncoder
。这是您设置顶点和片段着色器的地方。这经过优化以处理大量绘制调用和对象图元。内核着色器主要用于
MTLComputeCommandEncoder.
我认为内核着色器和计算编码器用于图像处理示例的原因是因为您没有像使用渲染命令编码器那样绘制任何图元。尽管这两种方法都使用图形,但在这种情况下,它只是修改纹理上的颜色数据,而不是计算屏幕上多个对象的深度。计算命令编码器也更容易设置为使用线程进行并行计算:
https://developer.apple.com/reference/metal/mtlcomputecommandencoder
因此,如果您的应用程序想要在数据修改上使用多线程,那么在此命令编码器中比在渲染命令编码器中更容易做到这一点。
关于ios - Metal Compute Kernel vs Fragment Shader,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41014713/