Metal开发入门(一)Hello Metal

9 篇文章 0 订阅
4 篇文章 0 订阅

环境:macOS 11 iOS14 swift4 xcode12
本项目参考教程 https://www.youtube.com/watch?v=TEqbZ7Ai7AA&list=PL23Revp-82LJG3vcDPm8w7b5HTKjBOY0W&index=1,教学项目中也有不少啰嗦的地方,本文做了相应的精简

开源地址:https://github.com/Niap/MetalDemo

项目准备

新建一个iOS项目,值得注意的是:life Cycle请选择 UIKit App Delegate,后续因为需要从UIView中集成,项目还需要做一些变化。
在这里插入图片描述
删除 AppDelegate.swift中关于SceneDeleagete的相关函数,添加一个成员变量window类型为UIWindow。删除info.plist中关于Scene Manifest的配置,添加一个storyboard。命名为main.storyboard,添加一个View Control,设置这个View Control为 “is initial view control”。(尝试拖一个label到view中,运行程序后,查看结果)
在这里插入图片描述
在这里插入图片描述

Hello Metal

  1. 添加MyViewController.swift创建 MyViewController 类继承自 UIViewController
  2. 添加参数metalView作为MTKView的持有,并且初始化。
  3. 在main.storyboard中分别对viewcontroler和内部的view设置Class,分别为MyViewController,MTKView。MyViewController的代码如下:
import UIKit
import MetalKit
class MyViewController:UIViewController{
    var metalView:MTKView{
        return view as! MTKView
    }    
    override func viewDidLoad() {        
    }
}

初始化Metal

添加以下代码。运行后,Metal会绘制背景颜色,此时,metal只会在运行的时候去绘制一次,并不能在在一定的从刷新率下去重绘。

enum Colors {
    static let wenderlichGreen = MTLClearColor(red:0.0,green: 0.4,blue: 0.21,alpha: 1.0)
}
override func viewDidLoad() {
      super.viewDidLoad()
      metalView.device = MTLCreateSystemDefaultDevice()// 创建设备
      device = metalView.device //设置到controller的成员变量中
      metalView.clearColor = Colors.wenderlichGreen //设置背景颜色
      commandQueue = device.makeCommandQueue() //为gpu准备指令队列
      let commandBuffer = commandQueue.makeCommandBuffer() //为指令队列设置缓冲区
      let commandEncoder = commandBuffer?.makeRenderCommandEncoder(descriptor: metalView.currentRenderPassDescriptor!) //为缓冲区创建一个编码器
      commandEncoder?.endEncoding()//停止编码
      commandBuffer?.present(metalView.currentDrawable as! MTLDrawable) //绘制图像
      commandBuffer?.commit() //提交给gpu
  }

初始化

  1. 首先Metal需要创建一个设备,这个设备可以理解成GPU
  2. GPU需要接受一系列指令,因此我们需要创建一个CommandQueue
  3. 设置一些PiplineState,这些State可以告诉GPU需要执行哪些渲染函数。
  4. 当然,GPU也需要MTLBuffer来存储一些Model和Texture。例如,需要渲染一个三角形的时候,我们需要把定点的位置记在MTLBuffer里面

渲染时

  1. 需要创建一个CommandBuffer,这里存储了如何渲染的信息
  2. CommandBuffer需要创建一个Encoder,Encoder需要找到相关的渲染素材,比如Model和Texture。
  3. 最后需要使用Commit,提交给GPU

实现每帧刷新

  1. controler继承MTKViewDelegate,因此需要实现两个函数,一个是mtkView(_ view: MTKView, drawableSizeWillChange size: CGSize),另外一个是func draw(in view: MTKView) 。
  2. 把MetalView的delegate设置为controler
    整体的代码如下:
import UIKit
import MetalKit

enum Colors {
    static let wenderlichGreen = MTLClearColor(red:0.0,green: 0.4,blue: 0.21,alpha: 1.0)
}

class MyViewController:UIViewController,MTKViewDelegate{
    var metalView:MTKView{
        return view as! MTKView
    }
    var device:MTLDevice!
    var commandQueue:MTLCommandQueue!
    override func viewDidLoad() {
        super.viewDidLoad()
        metalView.device = MTLCreateSystemDefaultDevice()// 创建设备
        device = metalView.device //设置到controller的成员变量中
        metalView.clearColor = Colors.wenderlichGreen //设置背景颜色
        commandQueue = device.makeCommandQueue() //为gpu准备指令队列
        metalView.delegate = self
    }
    func mtkView(_ view: MTKView, drawableSizeWillChange size: CGSize) {   
    }
    func draw(in view: MTKView) {
        let commandBuffer = commandQueue.makeCommandBuffer() //为指令队列设置缓冲区
        let commandEncoder = commandBuffer?.makeRenderCommandEncoder(descriptor: metalView.currentRenderPassDescriptor!) //为缓冲区创建一个编码器
        commandEncoder?.endEncoding()//停止编码
        commandBuffer?.present(metalView.currentDrawable as! MTLDrawable) //绘制图像
        commandBuffer?.commit() //提交给gpu
    }
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值