MetalKit框架在2015年WWDC上发布,它为Metal带来了很多改进和新特性。Metal允许开发人员直接在GPU上执行图形渲染和并行计算。在Metal之前,iOS上用于图形渲染的框架还是OpenGL ES。
image.png
- MTLDevice对象表示的GPU,通常通过MTLCreateSystemDefaultDevice()获取。
- MTLCommandBuffer是存储编码命令以供GPU执行的缓冲区,MTLCommandBuffer会提供一些encoder,用于渲染的MTLRenderCommandEncoder,用于计算的MTLComputeCommandEncoder,用于缓存纹理拷贝指令的MTLBlitCommandEncoder。每一帧都会产生一个MTLCommandBuffer对象,用于填放指令,对于每一帧(MTLCommandBuffer)来说,只有调用encoder的操作结束,才能进行下一个encoder的创建,同时可以设置执行完指令的回调。
- MTLCommandQueue是命令队列,用于创建和组织MTLCommandBuffer,保证MTLCommandBuffer能有序地发送到GPU。
- MTLRenderPassDescriptor是一个轻量级的临时对象,具有许多可配置属性,供MTLCommandBuffer创建MTLRenderCommandEncoder对象用。
- MTLRenderCommandEncoder在创建的时候,会隐式的调用一次clear的命令。
encoder完成编码后,commandBuffer接受两个最终的命令:present和commit。 - MTLViewport是metal的可绘制区域,具有x和y偏移量、宽度和高度以及近平面和远平面的3D区域。
- MTLRenderPipelineState表示渲染管道,最主要的三个过程:顶点处理、光栅化、片元处理。
获取函数库并创建管道
顶点函数
image.png顶点函数(顶点着色器)的主要任务是处理传入的顶点数据,并将每个顶点映射到viewport中的一个位置。这样,管道中的后续阶段可以引用这个viewport位置,并将像素呈现到drawable中的确切位置。顶点函数通过将任意顶点坐标转换为规范化的设备坐标(也称为clip-space坐标)来完成此任务。
下面苹果官方文档的demo中的.metal文件,绘制一个五彩斑斓的三角形。
#include <metal_stdlib>
#include <simd/simd.h>
using namespace metal;
#import "AAPLShaderTypes.h"
typedef struct
{
float4 clipSpacePosition [[position]];
float4 color;
} RasterizerData;
vertex RasterizerData
vertexShader(uint vertexID [[vertex_id]],
constant AAPLVertex *vertices [[buffer(AAPLVertexInputIndexVertices)]],
constant vector_uint2 *viewportSizePointer [[buffer(AAPLVertexInputIndexViewportSize)]])
{
RasterizerData out;
out.clipSpacePosition = vector_float4(0.0, 0.0, 0.0, 1.0);
float2 pixelSpacePosition = vertices[vertexID].position.xy;
vector_float2 viewportSize = vector_float2(*viewportSizePointer);
out.clipSpacePosition.xy = pixelSpacePosition / (viewportSize / 2.0);
out.color = vertices[vertexID].color;
return out;
}
fragment float4 fragmentShader(RasterizerData in [[stage_in]])
{
return in.color;
}
vertexShader是顶点处理函数。ResterizerData是一个返回给片元着色器的结构体,[[position]]修饰符表示clipSpacePosition是顶点位置。[[vertex_id]]属性限定符是顶点函数每次执行的顶点的索引,用于定位当前的顶点,当绘制调用这个顶点函数时,这个值从0开始,每次调用都会增加。第二个参数vertices是包含顶点(AAPLVertex类型)的数组。第三个参数viewportSizePointer表示viewport的大小。
未完待续~
网友评论