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