1.Metal 简介
Metal 是针对 iPhone 和 iPad 中 GPU 编程的高度优化的框架。其名字来源是因为 Metal 是 iOS 平台中最底层的图形框架 (意指 “最接近硬件”)。
优点:
- cpu 使用率低;
- Metal 将苹果的GPU 发挥最⼤性能;
- 最⼤限度CPU/GPU 并发性;
- 方便管理我们资源
2. 函数解析
2.1
//每当视图改变方向或调整大小时调用
(void)mtkView:(nonnull MTKView *)view drawableSizeWillChange:(CGSize)size;
2.2
//每当视图需要渲染帧时调用
- (void)drawInMTKView:(nonnull MTKView *)view
3. 绘制三角形
注:苹果官方建议Metal渲染类与ViewController类分开实现,所以下面我们在ViewController类中实现MTKView的加载,在Metal渲染类中实现渲染逻辑。
3.1创建并编辑Metal文件
-
command + N --> Metal File 创建metal着色器文件
-
定义顶点着色器输入和片元着色器输入,相当于OpenGL ES中的varying修饰的变量,即桥接变量。
// 顶点着色器输出和片段着色器输入
//结构体
typedef struct
{
//处理空间的顶点信息
float4 clipSpacePosition [[position]];
//颜色
float4 color;
} RasterizerData;
- 定义顶点着色器函数 和 片元着色器函数
//顶点着色函数
vertex RasterizerData
vertexShader(uint vertexID [[vertex_id]],
constant Vertex *vertices [[buffer(VertexInputIndexVertices)]],
constant vector_uint2 *viewportSizePointer [[buffer(VertexInputIndexViewportSize)]])
{
/*
处理顶点数据:
1) 执行坐标系转换,将生成的顶点剪辑空间写入到返回值中.
2) 将顶点颜色值传递给返回值
*/
//定义out
RasterizerData out;
// //初始化输出剪辑空间位置
// out.clipSpacePosition = vector_float4(0.0, 0.0, 0.0, 1.0);
//
// // 索引到我们的数组位置以获得当前顶点
// // 我们的位置是在像素维度中指定的.
// float2 pixelSpacePosition = vertices[vertexID].position.xy;
//
// //将vierportSizePointer 从verctor_uint2 转换为vector_float2 类型
// vector_float2 viewportSize = vector_float2(*viewportSizePointer);
//
// //每个顶点着色器的输出位置在剪辑空间中(也称为归一化设备坐标空间,NDC),剪辑空间中的(-1,-1)表示视口的左下角,而(1,1)表示视口的右上角.
// //计算和写入 XY值到我们的剪辑空间的位置.为了从像素空间中的位置转换到剪辑空间的位置,我们将像素坐标除以视口的大小的一半.
// out.clipSpacePosition.xy = pixelSpacePosition / (viewportSize / 2.0);
out.clipSpacePosition = vertices[vertexID].position;
//把我们输入的颜色直接赋值给输出颜色. 这个值将于构成三角形的顶点的其他颜色值插值,从而为我们片段着色器中的每个片段生成颜色值.
out.color = vertices[vertexID].color;
//完成! 将结构体传递到管道中下一个阶段:
return out;