iOS 开发者的 Metal 养成计划「4」 —— Metal 着色器语言和图形渲染

发布于:2018-01-25 15:59,阅读数:228,点赞数:0


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

# 目录

- 引言
- Metal Shader System
- Metal Shading Language
- 图像渲染
- 小结



# 引言

在前几篇文章中介绍了 Metal 中的命令系统。但光有命令系统还是无法画出任何图形,这里还需要着色器程序的参与。看完本文以后,读者就可以把图像渲染从 Metal API 到着色器一整条的流程走通了。

# Metal Shader System

## Metal Shading Language

Metal 的着色器用的是一门专门的语言,叫`Metal Shading Language`(大概可以叫`MSL`?)。既然是一门专门的语言,资料就只有官方文档了:[「Metal Shading Language Specification」](https://developer.apple.com/metal/Metal-Shading-Language-Specification.pdf)。

它是一门单独的语言,但它不是全新的。它是 C++14 的一个子集,然后做了不多的扩展。和`GLSL`比,尤其是熟悉 C++ 的同学,写起来要爽得多。这门语言包括了 C++ 中的模板类和模板方法、宏替换、宏替换等内容,可以以面向对象方式写出更复杂的着色器。

> 在这里建议读者仔细阅读上面提供的文档,文档里详细描述了语言支持的范围,各类数据类型等开发者所需要的一切内容。在本文中仅会就实际使用方法做简单介绍。

在使用 Metal 时,若是用于渲染图像,则与传统的 OpenGL 中相同,需要提供`顶点着色器函数`和`片元着色器函数`,若是用于 GPU 运算时只需要完成`核函数`即可。在 MSL 中,在内存/显存与着色器数据交换上与 OpenGL 有较大区别,下面来仔细看。

## 图像渲染

与传统 OpenGL 渲染图像的管线流程相同,在 Metal 着色器中渲染图像时数据的走向如下图所示:

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

大致步骤描述如下:

- 提前将顶点数据、纹理上传至显存,保存于`MTLBuffer`或`MTLTexture`对象中。这里的数据并不一定是都输入数据,还可以是输出数据。如渲染图片到另一张`MTLTexture`里,或保存数据到另一个`MTLBuffer`里,这些都可以。
- 绑定句柄。与 GLSL 不同的是,MTL 在着色器函数的输入参数中标明了每个参数的句柄。函数一般会有多个参数,因此在绑定时需要指明哪个对象对应着色器函数中是哪一个参数。这些句柄可以自由更改,具体的实现参考下文。
- 定义顶点着色器函数,接收 Metal API 中传入的参数,做运算后函数的返回值会被作为片元着色器函数的输入。
- 定义片元着色器,接收顶点着色器传出的数据,计算每个片元的颜色。片元着色器的返回值是一个思维向量,即是这个片元的颜色 RGBA 值。

流程比较清晰,下面来看看具体实现。

---

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


评论:0条


返回列表

返回归档

返回主页