2016-12-07 53 views
4

金属支持除标准vertexfragment功能kernel。我发现了一个金属kernel的例子,将图像转换为灰度。金属计算内核VS片段着色器

究竟是在kernel VS fragment这样的区别?什么可以计算kernel做(好)一个fragment着色器不能,反之亦然?

+0

的主要区别在于,你会到一个片段的功能无法发送顶点位置(或任何其它目/几何数据)到一个核函数。片段函数返回(通常情况下)为您的输出纹理的每个像素,而这并没有返回内核函数(无效),颜色上的纹理进行操作或缓冲液,可以在网格上同时运行方式更多的线程,可以上升到数百万个线程。内核也用于GPGPU和科学模拟,不仅用于图像处理,而且碎片函数只能用于渲染。 – Marius

+0

基本上是iOS的OpenCL? –

+0

你可以这样想,是的。但不仅适用于iOS。 Metal也适用于tvOS和macOS。 – Marius

回答

4

金属具有四种不同类型的命令编码器:

  • MTLRenderCommandEncoder
  • MTLComputeCommandEncoder
  • MTLBlitCommandEncoder
  • MTLParallelRenderCommandEncoder

如果你只是在做图形编程,你最熟悉的MTLRenderCommandEncoder。那就是你要设置你的顶点和片段着色器的地方。这被优化来处理大量的绘制调用和对象基元。

内核着色器主要用于MTLComputeCommandEncoder.我认为内核着色器和计算编码器用于图像处理示例的原因是因为您没有像使用渲染命令编码器一样绘制任何原语。即使这两种方法都在使用图形,在这种情况下,它只是修改纹理上的颜色数据,而不是计算屏幕上多个对象的深度。

的计算指令编码器也更容易建立做并行使用计算线程:

https://developer.apple.com/reference/metal/mtlcomputecommandencoder

因此,如果您的应用程序要利用多线程对数据的修改,很容易做,在这个命令编码器比渲染命令编码器。