首先贴出Apple的官方Demo:地址
https://developer.apple.com/documentation/metal/devices_and_commands
这里有个我总结的流程图:
首先由个Metal的准备阶段,在准备阶段中,我们准备以下内容:
1.MTLDevice 获取默认设备
2.MTLCommandQueue 命令队列
1.声明全局变量
{
id<MTLDevice> _device;
id<MTLCommandQueue> _commandQueue;
}
2.初始化
- (nonnull instancetype)initWithMetalKitView:(nonnull MTKView *)mtkView
{
self = [super init];
if(self)
{
_device = mtkView.device;
_commandQueue = [_device newCommandQueue];
}
return self;
}
- 使用MetalKit
/// Called whenever the view needs to render
- (void)drawInMTKView:(nonnull MTKView *)view
{
Color color = [self makeFancyColor];
view.clearColor = MTLClearColorMake(color.red, color.green, color.blue, color.alpha);
//为每个渲染传递创建一个新的命令缓冲区到当前drawable
// Create a new command buffer for each render pass to the current drawable
id<MTLCommandBuffer> commandBuffer = [_commandQueue commandBuffer];
commandBuffer.label = @"MyCommand";
//获取从视图的drawable生成的渲染过程描述符
// Obtain a render pass descriptor, generated from the view's drawable
MTLRenderPassDescriptor *renderPassDescriptor = view.currentRenderPassDescriptor;
// If you've successfully obtained a render pass descriptor, you can render to
// the drawable; otherwise you skip any rendering this frame because you have no
// drawable to draw to
//如果您已成功获得渲染过程描述符,则可以渲染到drawable; 否则你跳过任何渲染这个帧,因为你没有可绘制的绘图
if(renderPassDescriptor != nil)
{
id<MTLRenderCommandEncoder> renderEncoder = [commandBuffer renderCommandEncoderWithDescriptor:renderPassDescriptor]