加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

Metal学习(2)

发布时间:2020-12-14 06:30:28 所属栏目:百科 来源:网络整理
导读:MTKView 是 NSView/UIView 的子类,它有一个嵌入式的Metal层,负责管理framebuffer,渲染目标和draw循环。 ? device - 是GPU的抽象,处理command queue的命令,进行渲染等 ? command queue - 是一系列的command buffer,它存储着命令的执行顺序, 把这个想象

MTKView 是NSView/UIView的子类,它有一个嵌入式的Metal层,负责管理framebuffer,渲染目标和draw循环。

?device - 是GPU的抽象,处理command queue的命令,进行渲染等

?command queue - 是一系列的command buffer,它存储着命令的执行顺序,把这个想象成是一个列表装载着你告诉GPU一次要执行的命令。

?command buffer - 存储着command encoder转换后的命令。你可以把它想象为一系列这一帧想要执行的渲染命令。在你提交command buffer之前,没有事情会真正发生,这样给你对事物在何时发生有一个很好的控制。

?command encoder - 把API命令转换成GPU命令,有3种类型的encoder:render(图形渲染),compute(数据并行处理),blit(资源复制操作)。

Render Command Encoder (RCE)是渲染命令,当你完成后,你只要调用 endEncoding()。MTLRenderPassDescriptor,它能配置什么纹理会被渲染到、什么是clear color,以及其他的配置。


1.创建cocoa应用,只选择swift和use storyboards。

2. 创建一个类型为NSView的MetalView.swift,在storyboard的view controller里选择View,如下图所示,在Identity Inspector里设置它的类为MetalView

import MetalKit

class MetalView: MTKView {

    required init(coder: NSCoder) {
        super.init(coder: coder)
        device = MTLCreateSystemDefaultDevice()
    }
    //必须override draw函数
    override func draw(_ dirtyRect: NSRect) {
        if let drawable = currentDrawable,let rpd = currentRenderPassDescriptor {
            rpd.colorAttachments[0].texture = currentDrawable!.texture
            rpd.colorAttachments[0].clearColor = MTLClearColor(red: 0,green: 0.5,blue: 0.5,alpha: 1)
            rpd.colorAttachments[0].loadAction = .clear //在绘制之前,清空纹理
            let commandBuffer = device!.makeCommandQueue().makeCommandBuffer()
            let commandEncoder = commandBuffer.makeRenderCommandEncoder(descriptor: rpd)
            commandEncoder.endEncoding() 
            commandBuffer.present(drawable) //保证新纹理会在绘制完成后立即出现
            commandBuffer.commit() //把事务提交,把任务交给GPU
        }
    }

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读