 
     
一、对比
Metal项目中,没有资源文件,但是有一个metal文件,是用于编写Shaders[着色器]的。   
二、运行效果
- 屏幕上显示的是相机画面,点击屏幕,就会出现一个立方体。
三、创建AR项目
- Content Technology:Metal渲染框架
- 代码解析:
#import "ViewController.h"
#import "Renderer.h"
@interface ViewController () <MTKViewDelegate, ARSessionDelegate>
//声明会话和渲染器
@property (nonatomic, strong) ARSession *session;
@property (nonatomic, strong) Renderer *renderer;
@end
@interface MTKView () <RenderDestinationProvider>
@end
@implementation ViewController
- (void)viewDidLoad {
    [super viewDidLoad];
    // Create an ARSession
    //创建ARSession会话并设置代理
    self.session = [ARSession new];
    self.session.delegate = self;
    // Set the view to use the default device
    //设置当前视图为Metal视图
    MTKView *view = (MTKView *)self.view;
    //设置Metal视图使用系统默认的Metal设备
    view.device = MTLCreateSystemDefaultDevice();
    //设置Metal视图的背景色和代理
    view.backgroundColor = UIColor.clearColor;
    view.delegate = self;
    //如果当前设备不支持Metal,这里就会提前结束程序
    if(!view.device) {
        NSLog(@"Metal is not supported on this device");
        return;
    }
    // Configure the renderer to draw to the view
    //设置渲染器以将其绘制到视图中
    self.renderer = [[Renderer alloc] initWithSession:self.session metalDevice:view.device renderDestinationProvider:view];
    //设置渲染器大小
    [self.renderer drawRectResized:view.bounds.size];
    //向Metal视图中添加点击手势
    UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTap:)];
    NSMutableArray *gestureRecognizers = [NSMutableArray array];
    [gestureRecognizers addObject:tapGesture];
    [gestureRecognizers addObjectsFromArray:view.gestureRecognizers];
    view.gestureRecognizers = gestureRecognizers;
}
- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    //创建会话配置对象
    ARWorldTrackingConfiguration *configuration = [ARWorldTrackingConfiguration new];
    //运行新建会话
    [self.session runWithConfiguration:configuration];
}
- (void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];
    //停止运行会话
    [self.session pause];
}
- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Release any cached data, images, etc that aren't in use.
}
- (void)handleTap:(UIGestureRecognizer*)gestureRecognize {
    ARFrame *currentFrame = [self.session currentFrame];
    // Create anchor using the camera's current position
    //使用摄像头当前的位置创建一个锚点
    if (currentFrame) {
        // Create a transform with a translation of 0.2 meters in front of the camera
        //创建一个向摄像头前平移0.2m的转换
        matrix_float4x4 translation = matrix_identity_float4x4;
        translation.columns[3].z = -0.2;
        //使用当前帧中摄像头的位置进行转换,转换后得到一个矩阵
        matrix_float4x4 transform = matrix_multiply(currentFrame.camera.transform, translation);
        // Add a new anchor to the session
        //新建一个锚点并添加到会话中
        ARAnchor *anchor = [[ARAnchor alloc] initWithTransform:transform];
        [self.session addAnchor:anchor];
    }
}
#pragma mark - MTKViewDelegate
// Called whenever view changes orientation or layout is changed
//每当视图改变方向或布局时,就会调用这个代理方法
- (void)mtkView:(nonnull MTKView *)view drawableSizeWillChange:(CGSize)size {
    [self.renderer drawRectResized:view.bounds.size];
}
// Called whenever the view needs to render
//在视图需要渲染时调用
- (void)drawInMTKView:(nonnull MTKView *)view {
    //渲染器更新渲染
    [self.renderer update];
}   
 
		