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