iOS 开发者的 Metal 养成计划「2」 —— 块命令和渲染命令

发布于:2018-01-13 18:12,阅读数:242,点赞数:0


> 本文为小专栏[《Graphics Dance》](https://xiaozhuanlan.com/graphics_dance)特供文章,仅提供预览,欢迎订阅。

# 目录

- 引言
- Metal Command System
- Blit Command
- Render Command
- 小结


# 引言

看了上一篇文章以后相信读者对 Metal 有了一定的了解但是还完全不知道它是怎么用起来的。

那么看完本文以后就会了解绘制操作在 Metal 层是如何工作的。如果要真正使用起来,真正要画出东西,光靠 Metal 层的 API 是不够的,还会涉及到着色器编程的内容。只有整个流程从头到尾都走通以后,才能在屏幕上看到绘制的东西。

本文会介绍四种绘制命令中最常用的两种:块命令和渲染命令。

# Metal Command System

Metal 中使用了一套和`Cocos2d-x`的渲染系统非常像的命令系统。

这个命令的思想在 OpenGL 中其实也是存在的,只是没有被单独拎出来做抽象。

Metal 的命令共有四种:

- `Blit Command`:块命令,用于在`MTLBuffer`和`MTLTexture`之间拷贝数据。
- `Render Command`:渲染命令,用于绘图。
- `Parallel Render Command`:并行渲染命令。
- `Compute Command`:计算命令,可用于高并发数据处理。

本文会介绍这四种命令中的前两种,也是最常用的两种。

### Blit Command

> Describes how to copy data between textures and buffers.

使用`MTLBlitCommand`可以快速在`MTLBuffer`和`MTLTexture`之间复制内容。

![](//cdn.yuusann.com/img/corpus/18005_1.png)

`MTLBlitCommand`的使用应该是这最简单的一个,使用方法大致为:

- 由`MTLCommandQueue`构造`MTLCommandBuffer`命令。
- 由`MTLCommandBuffer`构造`MTLBlitCommandEncoder`编码器。
- 编码器进行复制操作。
- 结束编码。
- 将命令提交并等待执行。


实现为:

```swift
// 从队列中构造一个 MTLCommandBuffer
guard let commandBuffer = commandQueue.makeCommandBuffer() else {
// error
}
// 构造 MTLBlitCommandEncoder
guard let commandEncoder = commandBuffer.makeBlitCommandEncoder() else {
// error
}
.....
```

---

# 预览结束,查看全文请订阅小专栏[《Graphics Dance》](https://xiaozhuanlan.com/topic/5637029184)


评论:0条


返回列表

返回归档

返回主页