[MetalKit]24-Metal-Performance-Shaders-for-the-iPad-playground性能着色器

本系列文章是对 metalkit.org 上面MetalKit内容的全面翻译和学习.git

MetalKit系统文章目录github


可能你们已经在WWDC2016上看过了,新的 Playground app for the iPad真是个震撼的产品!做为一个playground爱好者,我更是深感如此.如今咱们能够轻易地在iPad上写Swift代码,只要点击一个按钮就能运行.今天咱们将要试试Metal Performance Shaders (MPS),由于它在移动设备上很好用而咱们之前又没有讨论过它.须要提醒的是,MPS框架只能在iOStvOS上工做.咱们会用一个便捷的方法,在macOS设备的playground上编写代码而后经过iCloud Drive来分享到你的移动设备上.还有,iPad的playground只能在iOS10以上运行.swift

让咱们在Xcode中建立一个新的iOSplayground.你能够在Resources文件夹下添加任意图片.我已经添加了一张名为nature.jpg.下一步,在playground主页面中写几行代码,以下面截图(代码在文末Github)后端

mps_1.png

让咱们看一下这些代码.在之前的文章中咱们已经一遍遍写过相似的代码.你应该马上注意到新添加的代码引发了一个错误,这是由于macOS不"认识"MPS框架.一旦咱们在iPad中打开后,错误就会消失:app

import MetalPerformanceShaders
复制代码

下一步,咱们用MTKTextureLoader从先前添加图片处建立一个新的纹理.如今最有意思的部分来了!一旦咱们建立MTLCommandBuffer对象,咱们将不会像之前作的那样从这个命令缓冲器建立MTLCommandEncoder对象.相反,咱们建立一个新的MPSImageGaussianBlur对象,以下面的代码:框架

let shader = MPSImageGaussianBlur(device: view.device!, sigma: 5)
shader.encode(commandBuffer: commandBuffer, sourceTexture: texIn, destinationTexture: texOut)
复制代码

MPS对象最棒的地方在于,它让你能够将一个计算着色器(内核函数)应用于输入纹理,而无需配置任何状态,描述符,管线或写个内核函数!MPS对象会为咱们处理好全部事情.固然,用这个便捷方法的话,咱们也只能采用预设的着色器,并只能更改这个特殊着色器的sigma之类的参数.ide

目前为止还不错!咱们已经经过iCloud Drive把playground发送到了iPad上.打开Finder窗口,点击iCloud Drive并把playground文件复制到这个文件夹:函数

mps_8.png

咱们终于开始用上iPad了!打开新的Playground应用来到My Playgrounds.在屏幕左上角点击 + 按钮.能够看出来,你也可能在iPad上建立一个新的playground并能够轻易用其它方式共享输出到你的macOS设备上.可是如今,咱们点击iCloud Drive以下图:post

mps_2.png

iCloud Drive窗口弹出后,请注意咱们已经进入了iPad为playground提供的私有文件夹,咱们如今想要导入咱们用到的MPS.playground,点击它: 学习

mps_3.png

当iPad加载守playground后,咱们就开工了!如今你能在你的iPad上看到playground的主页面了:

mps_4.png

你所要作的就是点击Run My Code,就能看到咱们图片已经带上了一个漂亮的模糊滤镜:

mps_5.png

你可能会说:"我怎么才能看到整个图片呢?"答案就在下面的GIF图片中.只要简单地在屏幕中间长按,直到出现屏幕分隔线.不要松手指,想看代码或输出图片就左右拖动分隔线(你可能想要从新载入这个页面由于这个动态GIF只会播放一次):

mps_6.gif

如今你能看到整个模糊过的图片了!欣赏过图片后,点击屏幕左侧的按钮来返回分屏状态.在咱们把它收起来以前,再来点牛逼效果.将下面这行:

let shader = MPSImageGaussianBlur(device: view.device!, sigma: 5)
复制代码

替换为

let shader = MPSImageSobel(device: device)
复制代码

查看输出的新图片:

mps_7.PNG

咱们只是改动了一行代码就产生如此不一样的效果!还有几十种不一样的着色器来供你尝试.查看 Metal Performance Shaders API来获取更多信息.若是你对图像处理有兴趣,你也许会想要查看Simon Gladman的 Core Image for Swift这本书.若是你想要学更多MPS后端的Metal,能够查看Moore的 Metal by Example这本书. 源代码source code 已发布在Github上.

下次见!

相关文章
相关标签/搜索