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